MyBatis 동작 방식

Violet_Evgadn·2023년 4월 23일
0

DB연동

목록 보기
4/22
post-custom-banner

웹 프로젝트 구성

먼저 MVC 구조를 활용한 Web 프로젝트 구성을 살펴보자.

웹프로젝트는 일반적으로 3개의 Layer로 구성되어 있는데 Presentation Layer, Service Layer, Data Access Layer로 구성된다.

먼저 Presentation Layer는 UI를 담당하는 구성요소로써 MVC 구조에 해당하는 요소들이 이 곳에 포함되어 있다.

Service Layer(Business Layer라고도 함)은 어떤 형태의 데이터가 필요하며 반환될 것인지에 대한 로직이 구현되어 있는 Layer를 말한다.

즉 MVC 구조에서 Controller가 Model과 View 사이에 징검다리 역할을 하며 핵심 로직을 수행하는데, 이 "핵심 로직이 구현된 Layer"가 Service Layer라는 것이다.

(고객의 요구사항을 반영하여 실제로 애플리케이션이 구동되기 위한 로직을 담은 Layer라고 이해하면 된다)

마지막으로 Data Access Layer는 Persistence Layer라고도 부르며 데이터에 대한 처리를 담당하는 Layer이다.

그리고 지금부터 학습할 MyBatis는 이 Layer에 포함된다


Data Access Layer

Data Access Layer는 결국 DB에서 Mybatis를 통해 데이터를 뽑고 뽑은 데이터를 DAO 형태로 보내주는 과정이라고 말할 수 있다. 즉, MyBatis의 동작 과정만 알게 된다면 MyBatis 측에서 SqlSessionTemplate을 주입하여 DAO까지 형성해주는 과정을 수행하는 것이다.

따라서 Data Access Layer를 이해한다는 것은 곧 MyBatis의 동작과정을 이해하는 것과 동일한 의미이다

이제 위 사진을 계속 참조하면서 자세한 과정을 살펴보자.

먼저 알아야 할 것은 (1,2,3) 과정은 애플리케이션이 구동될 때 딱 1번만 일어나며 (4,5,6,7,8,9,10) 과정은 DB에 데이터에 대한 요구사항이 올 때 마다 일어나는 과정이라는 것이다.

이제 출처 사이트의 영어 설명을 먼저 붙이고 아래 설명하는 형식으로 글을 진행하겠다

(1) Application requests building SqlSessionFactory for SqlSessionFactoryBuilder

애플리케이션이 SqlSessionFactoryBuilder에게 SqlSessionFactory를 형성하라고 요청을 보내는 과정이다.

애플리케이션이 구동되는 순간 일어나는 동작이며 SqlSessionFactory가 SQL을 실행하기 위한 창구 역할을 해주므로 이런 창구를 만들기 위해 SqlSessionFactoryBuilder를 활용하는 것이다

(2) SqlSessionFactoryBuilder read MyBatis configuration file for generating SqlSessionFactory

SqlSessionFactoryBuilder는 요청을 받았으니 SqlSessionFactory를 만들 것이다.

그런데 SqlSessionFactory를 만들기 이전 "어떤 방식의" SqlSessionFactory를 만들지 파악해야 한다.

예를 들어 Oracle에 해당하는 SqlSessionFactory를 만들어야 할 수도 있고, MySQL에 해당하는 SqlSessionFactory를 만들어야 할 수도 있다.

따라서 SqlSessionFactoryBuilder는 MyBatis Config File을 읽어 SqlSessionFactory에 대한 설정값들을 읽어온다

(3) SqlSessionFactoryBuilder generates SqlSessionFactory based on the definition of MyBatis configuration file

2번 과정에서 읽은 Config File을 활용해서 SqlSessionFactory 객체를 생성하는 과정이다.

이 때 DataSource를 SqlSessionFactory에 전달해줌으로써 SqlSessionFactory가 만드는 모든 SqlSession이 DB와 연동 가능하게 된다.

또한 SqlSession은 SqlSessionFacotry에 있는 Config(설정값)들도 같이 가지면서 생성된다.

DataSource란?
MyBatis든 JDBC든 DB를 활용하기 위해선 결국 DB와 연결하는 과정이 필요하다.
JDBC는 Connection객체를 활용해 이 과정을 수행하지만, MyBatis는 이 역할을 누가 실행하게 될까?
바로 이 역할을 수행하느 것이 DataSource이다.
DataSoruce는 JDBC의 Connection을 처리하는 기능을 가지고 있어 Database를 연동하는 작업을 수행해주게 된다.
즉, JDBC의 Connection을 통한 DB 연동 과정을 DataSource가 처리해주게 되며, SqlSessionFactory 객체는 이 DataSource를 가지고 있어 앞으로 Query문을 생성할 때마다 DB에 연동하는 중간 과정을 생략할 수 있게 되는 것이다.

여기서부터는 "Client가 SQL Query가 필요한 요청을 할 경우"마다 수행되는 과정들이다.

매번 SQL Query가 수행되어야 할 때마다 아래 과정 전체가 이루어진다고 생각하면 된다.

(4) Client Requests a process for the application

고객이 어플리케이션 측에 로직을 수행하도록 요청을 보내는 과정이다.(애플리케이션 기능 활용)

(5) Application fetches SqlSession from SqlSessionFactory that is build by using SqlSessionFactoryBuilder

고객에게 요청이 와서 SQL Query문이 실행될 필요가 있다고 Application 측에서 판단했다고 가정하자.

그렇다면 Application은 이미 만들어져 있는 SqlSessionFactory측에 "Query문이 실행되어야 해!"라는 Request를 보내게 된다.

즉 은행 번호표를 뽑았다는 고객의 요청이 왔으니 해당 고객의 요구사항을 처리해줄 창구를 만들기 위해 창구 관리자에게 요청을 띄우는 것이다.

(6) SqlSessionFactory generates SqlSession and returns it to the application

SqlSessionFactory는 자신이 가지고 있는 DataSource와 Config 값들을 활용해 SQL Query를 처리할 SqlSession을 만들게 된다.

은행 예시를 계속 든다면, 창구 관리자가 고객의 요구사항을 처리할 창구를 제공하는 과정이 될 것이다.

(7) Application fetches the implemenation object of Mapper interface from SqlSession

개인적으로는 화살표가 잘못되어 있지 않나... 싶은 부분이긴 하다.

Application측에서 SqlSession에서 Mapper 인터페이스의 구현 개체를 가지고 온다고 되어 있다.

그런데 내가 이해한 바로는 "SqlSession 측에서 가지고 와야할 Mappe Interface 정보를 준다"라고 이해가 되었다.

그러니깐 여러가지 Mapper Interface가 존재할 것인데, 예를 들어 A는 A' Table에 대한 Mapper Interface이고 B는 B' Table에 대한 Mapper Interface라고 가정하자. 이 때 어떤 table을 활용해야할지에 따라 호출해야 하는 Mapper Interface가 다를 것이다.

즉 Application측은 요청을 SqlSession측에 전달한 이후 SqlSession에서 "요청에 적합한 Mapper Interfcae"를 Application측에 알려주는 과정이라고 이해가 되었고, 화살표가 양방향이거나 SqlSession → Application으로 보내는게 맞지 않나... 라는 의문이 들기는 했다.

(8) Application calls Mapper interface Method

7번 과정에서 가지고온 Mapper 인터페이스 정보를 통해 Mapper Interface에 접근하고 Mapper Interface에 존재하는 여러개의 메서드 중 "Client Request를 처리하기 위한 Method"들을 호출하는 과정이다

(9) Implementation object of Mapper interface calls SqlSession method and requests SQL execution

SqlSession 측에서 받은 Method를 확인하고, 이를 Mapping File에 연결하는 과정이다.

Mapping File에는 여러가지 SQL Query문들이 저장되어 있는데, 9번 과정은 Mapping File의 여러 가지 Query 중 8번 과정에서 호출된 Method들에 대한 Query만 가지고 오기 위하여 Mapping File에 요청하는 과정이라고 생각하면 된다.

(10) SqlSession fetches the SQL to be executed from Mapping file and executes SQL

Mapping File에서 실행될 SQL Query문을 SQL Session 측에서 받아오고 SqlSession이 가지고온 Query문을 실행시킴으로써 Data의 처리가 완료된다.

이렇게 처리된 Data를 Application 측에 전달함으로써 Data Access Layer의 1개 Request에 대한 처리 과정이 완료되는 것이다.

profile
혹시 틀린 내용이 있다면 언제든 말씀해주세요!
post-custom-banner

0개의 댓글