개요
오늘은 우리나라에서 많이 사용하고 있는 Mybatis에 대해서 알아보도록 하겠습니다.
Mybatis란?
Java에서 DB 프로그래밍을 하기 위해서 JDBC가 제공되고 있습니다. JDBC RDB 사용을 위한 다양한 API를 제공하지만, 데이터가 방대하지고 각 데이터들의 관계가 복잡해짐에 따라서 다수의 메소드를 호출하고 관련 객체를 해제해야 하는 문제점이 심화되고 되었습니다. (특히 사이즈가 큰 프로젝트의 경우) 이러한 문제점을 해결하고 더욱 효과적으로 DB를 관리 하기 위해 Mybatis가 등장하게 되었습니다.
Mybatis는 개발자가 지정한 SQL 저장 프로시저 그리고 고급Mapping을 지원하여 개발 생산성을 높이는 Persistence framework입니다.
기존 JDBC만을 이용한 방식은 프로그램 소스안에서 직접 connection을 맺고 SQL문을 처리하고 rs.next() 등을 이용하여 하나하나 씩 받아와야 했습니다. 그래서 코드가 길어지고 SQL변경이 필요한 경우에도 java 프로그램을 수정하기 때문에 유언성이 좋지 못하였습니다.
그러나 Mybatis에서는 상당부분의 코드와 파라미터 설정 및 ResultSet 결과를 대신해주어 코딩의 중복과 무의미한 코드 작정을 생략할 수 있으면서도, SQL 문을 xml 파일에 작성하여 변환이 자유롭고 가독성이 좋아졌습니다.
다시말해 Mybatis는 RDB를 더욱 편하게 이용할 수 있도록 개발된 persistence framework입니다.
Mybatis 특징
- MyBatis-Spring은 Mybatis에서 Mybatis3와 Spring 연동 라이브러리로 제공됩니다.
- 싱글톤 패턴으로 스프링빈 으로 등록하여 주입하여 쉽게 사용이 가능합니다.
- Mybatis Mapper Interface를 통해 DB에 접근합니다.
- 객체 프로퍼티로 파라미터와 결과를 객체(DTO, Map)등으로 자동 Mapping을 지원합니다.
- Spring 연동 모듈을 제공해주기 때문에 Spring 설정이 간단합니다.
- 트랜잭션을 관리해주기 쉽게 설정이 가능합니다.
Mybatis 사용국가
Mybatis는 좋은 성능을 가지고 있지만, 우리나라에서만 사용한다는 특징이 있습니다.
전세계적으로 보면 저번에 JPA를 소개할때 말했던 Hibernate가 거의 대부분을 차지하고 있습니다.
Mybatis3의 Databasese Access 구조
Mybatis 주요 구성 요소
Mybaits를 이용하여 개발을 진행하다가 보면 여러 오류문을 console창을 통해 확인할 수 있습니다.
Console에서 뜨는 오류를 좀 더 쉽게 확인하기 위해서 Mybatis의 주요 구성 요소를 알고 있으면 굉장한 도움이 됩니다.
(log만 보고 오류를 해결할 수 있는 능력이 생김.)
구성 요소 / 구성 파일 | 설명 | |
MyBatis configuration file | MyBatis의 작업 설정을 설명하는 XML 파일입니다. 데이터베이스의 연결 대상, 매핑 파일의 경로, Mybatis의 작업 설정 등과 같은 세부사항을 설명하는 파일입니다. Spring과 통합하여 사용할 때 데이터베이스의 연결 대상과 매핑 파일 경로 설정을 수겅 파일에 지정할 필요가 없습니다. 그러나 Mybatis의 기본 작업을 변경하거나 확장 할 때 설정이 수행됩니다. |
|
org.apache.ibatis.session.SqlSessionFactoryBuilder | Mybatis 구성 파일을 읽고 생성하는 SqlSessionFactory 구성요소 입니다. 이 구성 요소는 Spring과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하지 않습니다. |
|
org.apache.ibatis.session.SqlSessionFactory | SqlSession을 생성하는 구성 요소입니다. 이 구성 요소는 Spring과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하지 않습니다. |
|
org.apache.ibatis.session.SqlSession | SQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 구성 요소입니다. Mybatis를 사용하여 데이터베이스에 엑세스할 때 가장 중요한 역할을 하는 구성 요소입니다. 이 구성 요소를 Spring과 통합하여 사용할 경우 애플리케이션 클래스에서 직접 처리하지 않습니다. |
|
Mapper interface | typeafe에서 매핑 파일에 정의된 SQL을 호출하는 인터페이스입니다. Mybatis는 Mapper 인터페이스에 대한 구현 클래스를 자동으로 생성하므로 개발자는 인터페이스만 생성하면 됩니다. |
|
Mapping file | SQL 및 O/R 매핑 설정을 설명하는 XML 파일입니다. |
Mybatis 주요 구성 요소가 Database Access 하는 순서
(1) ~ (3)은 응용 프로그램 시작시 수행되는 프로세스입니다.
- (1) 응용 프로그램이 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청합니다.
- (2) SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 Mybatis 구성 파일을 읽습니다.
- (3) SqlSessionFactoryBuilder는 Mybatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성합니다.
(4) ~ (10)은 클라이언트의 각 요청에 대해 수행되는 프로세스입니다.
- (4) 클라이언트가 응용 프로그램에 대한 프로세스를 요청합니다.
- (5) 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옵니다.
- (6) SqlSessionFactory는 SqlSession을 생성하고 이를 애플리케이션에 반환합니다.
- (7) 응용 프로그램이 SqlSession에서 매퍼 인터페이스의 구현 개체를 가져옵니다.
- (8) 응용 프로그램이 매퍼 인터페이스 메서드를 호출합니다.
- (9) 매퍼 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행을 요청합니다.
- (10) SqlSession은 매핑 파일에서 실행할 SQL을 가져와 SQL을 실행합니다.
Mybatis-Spring의 컴포넌트 구조
구성 요소 / 구성 파일 | 설명 |
org.mybatis.spring.SqlSessionFactoryBean | SqlSessionFactory를 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성 요소. 표준 Mybatis에서 SqlSessionFactory는 Mybatis 구성 파일에 정의된 정보를 기반으로 합니다. 그러나 SqlSessionFactoryBean을 사용하면 Mybatis 구성파일이 없어도 SqlSessionFactory를 빌드할 수 있습니다. |
org.mybatis.spring.mapper.MapperFactoryBean | 싱글톤 Mapper 개체를 만들고 Spring DI 컨테이너에 개체를 저장하는 구성 요소. Mybatis 표준 매커니즘에 의해 생성된 Mapper 객체는 스레드가 안전하지 않습니다. 따라서 각 스레드에 대한 인스턴스를 할당해야 했습니다. Mybatis-Spring 구성 요소에 의해 생성된 Mapper 개체는 안전한 Mapper 개체를 생성할 수 있습니다. 따라서 Service등 싱글톤 구성요소에 DI를 적용할 수 있습니다. |
org.mybatis.spring.SqlSessionTemplate | SqlSession 인터페이스를 구현하는 싱글톤 버전의 SqlSession 구성 요소. Mybatis 표준 메커니즘에 의해 생성된 SqlSession 개체가 스레드에 안전하지 않습니다. 따라서 각 스레드에 대한 인스턴스를 할당해야 했습니다. Mybatis-Spring 구성 요소에서 생성된 SqlSession 개체는 안전한 스레드 SqlSession 개체를 생성할 수 있습니다. 따라서 Service 등 싱글톤 구성요소에 DI를 적용할 수 있습니다. |
(1) ~ (4)은 응용 프로그램 시작시 수행되는 프로세스입니다.
- (1) SqlSessionFactoryBean은 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청합니다.
- (2) 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옵니다.
- (3) SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성합니다. 따라서 생성된 SqlSessionFactory는 Spring DI 컨테이너에 의해 저장됩니다.
- (4) MapperFactoryBean은 안전한 SqlSession(SqlSessionTemplate) 및 스레드 안전 매퍼 개체(Mapper 인터페이스의 프록시 객체)를 생성합니 다. 따라서 생성되는 매퍼 객체는 스프링 DI 컨테이너에 의해 저장되며 서비스 클래스 등에 DI가 적용됩니다. 매퍼 개체는 안전한 SqlSession(SqlSessionTemplate)을 사용하여 스레드 안전 구현을 제공합니다.
(5) ~ (11)은 응용 프로그램 시작시 수행되는 프로세스입니다.
- (5) 클라이언트가 응용 프로그램에 대한 프로세스를 요청합니다.
- (6) 애플리케이션(서비스)은 DI 컨테이너에서 주입한 매퍼 개체(매퍼 인터페이스를 구현하는 프록시 개체)의 방법을 호출합니다.
- (7) 매퍼 객체는 호출된 메소드에 해당하는 SqlSession (SqlSessionTemplate ) 메서드를 호출합니다.
- (8) SqlSession (SqlSessionTemplate )은 프록시 사용 및 안전한 SqlSession 메서드를 호출합니다.
- (9) 프록시 사용 및 스레드 안전 SqlSession은 트랜잭션에 할당된 MyBatis3 표준 SqlSession을 사용합니다. 트랜잭션에 할당된 SqlSession이 존재하지 않는 경우 SqlSessionFactory 메서드를 호출하여 표준 MyBatis3의 SqlSession을 가져옵니다.
- (10) SqlSessionFactory는 MyBatis3 표준 SqlSession을 반환합니다. 반환된 MyBatis3 표준 SqlSession이 트랜잭션에 할당되기 때문에 동일한 트랜잭션 내에 있는 경우 새 SqlSession을 생성하지 않고 동일한 SqlSession을 사용합니다.on 메서드를 호출하고 SQL 실행을 요청합니다.
- (11) MyBatis3 표준 SqlSession은 매핑 파일에서 실행할 SQL을 가져와 실행합니다.
'서버 > Mybatis' 카테고리의 다른 글
MyBatis 사용이유 및 Mapping 방식 (Interface와 Class 차이) (0) | 2021.08.11 |
---|