Tech Blog of Pinomaker
참고 : https://jung-story.tistory.com/121

 

이번에 내가 속한 마스외전에서, 외주 프로젝트를 받았는 데, Spring + MyBatis를 이용하여 개발을 진행해서 MyBatis에 대해서 알아보고자 한다.

 

MyBatis란?

객제 지향 언어인 자바를 이용하여 ORM을 쉽게 할 수 있게 해주는 프레임 워크다.
JDBC를 통해 데이터베이스에 엑세스 하는 작업을 캡슐화 하며, 일반적인 SQL 쿼리와 저장 프로 시저 및 고급 매핑을 지원하고 모든 JDBC 코드 및 매개 변수의 중복작업을 제거한다.

MyBatis는 프로그램에 있는 SQL 쿼리문을 한 구성 파일에 구성하여 코드와 SQL을 분리하는 장점을 가지는 데, 이번 프로젝트에서는 XML 파일에 쿼리문을 작성해 분리를 한다.

 

MyBatis의 장점

  • MyBatis는 복잡한 쿼리나 동적인 쿼리에 강하다.
  • 프로그램 코드와 SQL 쿼리문의 분리로 코드 간결성과 유지보수성이 향상된다.
  • 다양한 프로그래밍 언어로 구현이 가능하다.

MyBatis의 단점

  • 비슷한 쿼리를 남발하여 작성하게 된다.
  • 스키마(Model)이 변경되면, SQL 쿼리를 직접 수정해야한다.
  • 데이터 베이스를 변경하면 로직도 변경해야한다.

 

MyBatis의 구조

 

Mybatis 의 구성 요소

구성 요소 / 구성 파일 설명
MyBatis
configuration file
MyBatis의 설정이 기입된 XML 파일로, DB에 대한 정보와 매핑 파일의 경로, 작업 설정 등의 세부 사항이 기입 되어있으며, Spring과 사용할 때는 DB 정보나 매핑 파일 경로를 지정할 필요는 없지만 MyBatis 기본 설정을 변경하거나 확장할 때 필요하다.
SqlSessionFactoryBuilder

MyBatis의 구성 파일을 읽고 생성하는 SqlSesstionFactory의 구성요소로, Spring과 사용할 때는 Application Class에서 직접 처리하지는 않는다.
SqlSessionFactory SqlSession을 생성하는 구성 요소로, SqlSesstionFactory와 마찬가지로 Spring과 사용하면 Application Class에서 직접 처리하지 않는다.
SqlSession SQL를 실행하고 트랜잭션 제어를 위한 API를 제공하는 구성 요소로, MyBatis를 사용하여 DB에 접근 할 떄 가장 중요한 역할을 하는 구성 요소이며, Spring과 사용하면 Application Class에서 직접 처리하지 않는다.
Mapper interface 매핑 파일에 정의된 SQL 쿼리를 호출하는 인터페이스로, MyBatis는 Mapper 인터페이스에 대한 구현 클래스를 자동으로 생성하기에 인터페이스만 생성하여 사용하면 된다.
Mapping file SQL 및 O/R 매핑 설정을 설명하고 쿼리문을 작성해두는 XML 파일이다.

 

Mybatis 의 실행 순서

(1) ~ (3)의 프로세스는 프로그램이 시작할 때 수행되는 프로세스다.

(1) 응용 프로그램이 SqlSesstioFactoryBuilder를 위하여 SqlSesstionFactory를 빌드하도록 요청한다,

(2) SqlSesstionFactoryBuilder는 SqlSesstionFactory를 생성하기 위하여 MyBatis 구성 파일을 읽는다.

(3) SqlSesstionFactoryBuilder는 MyBatis 구성 파일에 적힌 것에 따라서 SqlSesstionFactory를 생성한다.

 

(4) ~ (10)은 클라이언트의 각 요청에 대해 수행되는 프로세스다.

(4) 클라이언트가 응용 프로그램에 대한 프로세스를 요청한다.

(5) 응용 프로그램은 (1) ~ (3) 과정에서 빌드된 SqlSesstionFactory에서 SqlSesstion을 가져온다.

(6) SqlSessionFactory는 SqlSession을 생성하고 이를 프로그램에 반환한다.

(7) 응용 프로그램은 SqlSession에서 Mapper Interface의 구현된 객체를 가져온다.

(8) 응용 프로그램이 Mapper Interface의 메서드를 호출한다.

(9) Mapper Interface의 구현된 객체가 SqlSession 메서드를 호출하고 SQL 실행을 요청한다.

(10) SqlSesstion은 매핑 파일에서 실행할 SQL을 가져와서 실행한다.


Mybatis-Spring의 컴포넌트 구조

구성 요소 / 구성 파일 설명
spring.SqlSessionFactoryBean SqlSesstionFactory를 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성요소로, 표준 MaBatis에서는 SqlSesstionFactory는 MyBatis 구성 파일에 정의된 정보를 기반으로 하지만, SqlSesstionFactoryBean을 사용하면 MyBatis 구성 파일이 없어도 SqlSesstionFactory를 빌드 할 수 있다.
spring.mapper.MapperFactoryBean 싱글톤 Mapper 개체를 만들어서 Spring DI 컨테이너에 개체를 저장하는 구성 요소로, MyBatis 표준에 의하여 생성된 Mapper는 스레드가 안전하지 않기에 각 스레드에 대한 인스턴스를 할당해야했지만 MyBatis-Spring 구성 요소에 의하여 생성된 Mapper 개체는 안전하게 생성할 수 있기에, Service 등의 싱글톤 구성 요소에 DI를 적용할 수 있다.
spring.SqlSessionTemplate SqlSesstion 인터페이스를 구현하는 싱글톤 버전의 SqlSesstion 구성 요소로, Mapper와 마찬가지로 MyBatis 표준에 의해 생성된 SqlSession 개체는 스레드에 안전하지 않아 인스턴스를 할당해야했으나, MyBatis-Spring 구성 요소에 의하여 생성된 SqlSession 개체는 안전하게 생성할 수 있기에, Service 등의 싱글톤 구성 요소에 DI를 적용할 수 있다.

 

 

(1) ~ (4)의 프로세스는 프로그램이 시작할 때 수행되는 프로세스다.

(1) SqlSestionFactoryBean은 SqlSesstionFactoryBuilder를 위하여 SqlSesstionFactory를 빌드 하도록 요청한다.

(2) 응용 프로그램은 SqlSesstionFactoryBuilder를 사용해, 빌드된 SqlSessionFactory에서 SqlSession을 가져온다.

(3) SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라서 SqlSessionFactory를 생성하며, 생성된 SqlSessionFactory는 Spring DI 컨테이너에 의해 저장된다.

(4) MapperFactoryBean은 안전한 SqlSession(SqlSessionTemplate) 및 스레드에 안전한 Mapper 개체를 생성하고,
따라서 생성된 Mapper 객체는 스프링 DI 컨테이너에 의해 저장되며, 서비스 클래스 등에 DI가 적용된다.

(5) ~ (11)의 프로세스는 클라이언트의 각 요청에 대해 수행되는 프로세스다.

(5) 클라이언트가 응용 프로그램에 대한 프로세스를 요청한다.

(6) 서비스는 DI 컨테이너에서 주입한 Mapper 객체를 호출한다.

(7) Mapper 객체는 호추된 메서드에 해당되는 SqlSession 메서드를 호출한다.

(8) SqlSession은 프록시 사용 및 안전한 SqlSession 메서드를 호출한다.

(9) 프록시 사용 및 스레드가 안전한 SqlSession은 트랜잭션에 할당된 MyBatis3 표준 SqlSession을 사용하며, 트랜잭션에 할당된 SqlSession이 존재하지 않으면, SqlSessionFactory 메서드를 호출하여 표준 MyBatis3 SqlSession를 가져온다.

(10) SqlSessionFactory는 MyBatis3 표준 SqlSession을 반환하며, 반환된 표준 SqlSession은 트랜잭션에 할당 되기에, 동일한 트랜잭션에 있는 경우 새 SqlSession을 생성하지 않고 동일한 SqlSession을 사용한다. on 메서드를 호출하고 SQL 실행을 요청한다.

(11) MyBatiis3 표준 SqlSession은 매핑 파일에서 실행할 SQL를 가져와서 실행한다.

'B.E > Spring' 카테고리의 다른 글

[Spring] Spring DI에 대해서 알아보자.  (0) 2022.11.18
Templatee Engine, Mustache 문법  (0) 2022.11.17
[Spring] 싱글톤 패턴  (0) 2022.08.29
[Spring] 스프링 컨테이너 생성  (0) 2022.08.22
[Spring] Spring Boot 프로젝트 배포  (0) 2022.08.21
profile

Tech Blog of Pinomaker

@pinomaker

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!