1. Mybatis란?
JDBC API와 고급 Mapping을 지원하여 Java코드 안에서 SQL문을 분리해주게 만드는 프레임워크다.
분리한 SQL문은 XML파일에 작성하고, 이를 메서드와 Mapping하여 중복 코드를 줄여주고 가독성을 좋게 만들어 준다.
2. Mybatis 특징
1) Mybatis-Spring은 Mybatis3와 Spring 연동 라이브러리로 제공된다.
2) 싱글톤(Singleton)패턴으로 스프링 빈으로 등록하여 의존성 주입(DI)이 용이하다.
3) Mybatis Mapper Interface를 통해 DB에 접근한다.
4) 객체 프로퍼티로 파라미터와 결과를 객체(DTO, Map) 등으로 자동 Mapping을 지원한다.
5) Spring 연동 모듈을 제공하기 때문에 설정이 간단하다.
6) 트랜잭션을 관리해주기 때문에 쉽게 설정이 가능하다.
3. Mybatis의 주요 구성 요소와 액세스 과정
구성 요소 / 구성 파일 | 설명 |
---|---|
Mybatis Configuration File | Mybatis3의 작업 설정을 설명하는 XML파일이다. 데이터베이스의 연결 대상, 매핑 파일의 경로, Mybatis3의 작업 설정 등과 같은 세부 사항을 설정한다. |
SqlSessionFactroyBuilder (org.apache.ibatis.session.SqlSessionFactoryBuilder) | Mybatis 구성 파일을 읽고 생성하는 SqlSessionFactory의 구성요소이다. 이 구성 요소는 Spring과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하진 않는다. |
SqlSessionFactory (org.apache.ibatis.session.SqlSession) | SQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 구성 요소이다. Mybatis를 사용하여 데이터베이스에 액세스 할 때 필요한 요소이다. |
Mapper Interface | Mapping 파일에 정의된 SQL을 호출하는 인터페이스이다. Mybatis는 Mapper 인터페이스에 대한 구현 클래스를 자동으로 생성하므로 개발자는 인터페이스만 생성하면 된다. |
위에는 액세스 과정을 간략화한 것이다.
Connection
객체를 얻어오기 위해 데이터베이스와의 물리적인 연결을 지원하는 DataSource가 필요하다.(SqlSessionFactoryBean
클래스의 setDataSource()
메서드에 의해 쓰여진다.)application.properties
파일에 spring.datasource.* 패턴으로 Datasource를 설정한다.Config
파일 설정을 완료한 채 진행한다.(1) ~ (3)은 애플리케이션 시작할 시 수행되는 프로세스다.
SqlSessionFactoryBuilder
를 통해 SqlSessionFactory
를 빌드하도록 요청한다.SqlSessionFactoryBuilder
는 SqlSessionFactory
를 생성하기 위한 Mybatis Config
파일을 읽고,Config
파일에 따라 SqlSessionFactory
를 생성한다.(4) ~ (10)은 클라이언트의 각 요청에 대해 수행되는 프로세스다.
SqlSessionFactoryBuilder
를 사용하여 빌드된 SqlSessionFactory
에서 SqlSession
을 가져오도록 명령한다.SqlSessionFactory
는 SqlSession
를 생성하고 이를 애플리케이션에 반환한다.SqlSession
에서 Mapper
인터페이스의 구현 객체를 가져오고,Mapper
인터페이스 메서드를 호출한다.Mapper
인터페이스의 구현 객체가 SqlSession
메서드를 호출하고 SQL 실행을 요청한다.SqlSession
은 Mapping
파일에서 실행할 SQL을 가져와 실행한다.4. Mybatis-Spring
구성 요소 / 구성 파일 | 설명 |
---|---|
SqlSessionFactoryBean (org.mybatis.spring.SqlSessionFactoryBean) | SqlSessionFactory를 작성하고 Spring DI 컨테이너에 객체를 저장하는 구성 요소. SqlSessionFactoryBean을 사용하면 Mybatis Config 파일이 없어도 SqlSessionFactory를 빌드할 수 있다. |
MapperFactoryBean (org.mybatis.spring.mapper.MapperFactoryBean) | 싱글톤 Mapper 객체를 만들고 Spring DI 컨테이너에 저장하는 구성 요소. Mybatis3 표준 매커니즘에 의해 생성된 Mapper 객체는 쓰레드에 안전하지 않아 각 쓰레드에 대한 인스턴스를 할당해야 한다. |
SqlSessionTemplate (org.mybatis.spring.SqlSessionTemplate) | SqlSession 인터페이스를 구현하는 싱글톤 버전의 SqlSession 구성 요소. |
(1)~(4)은 응용 프로그램 시작시 수행되는 과정이다.
SqlSessionFactoryBean
은 SqlSessionFactoryBuilder
를 통해 SqlSessionFactory
를 빌드하도록 요청한다.SessionFactoryBuilder
는 SqlSessionFactory
생성을 위해 MyBatis Config
파일을 읽는다. SqlSessionFactoryBuilder
는 MyBatis Config
파일의 정의에 따라 SqlSessionFactory
를 생성한다. 생성된 SqlSessionFactory
는 Spring DI 컨테이너에 의해 저장된다.MapperFactoryBean
은 SqlSession(SqlSessionTemplate)
및 Mapper
객체(Mapper
인터페이스의 프록시 객체)를 생성한다.Mapper
객체는 스프링 DI 컨테이너에 의해 저장되며, Service 클래스 등에 DI가 적용된다. Mapper
객체는 안전한 SqlSession(SqlSessionTemplate)
을 사용하여 쓰레드에 대해 안전한 구현을 제공한다.(5)~(11)은 클라이언트의 각 요청에 대해 수행되는 과정이다.
Mapper
인터페이스를 호출한다. Mapper
는 호출된 메소드에 해당하는 SqlSession
메소드를 호출한다.SqlSession(SqlSessionTemplate)
은 프록시 사용 및 쓰레드에 대해 안전한 SqlSession
메서드를 호출한다.SqlSession
은 트랜잭션에 할당된 Mybatis3 표준 SqlSession
을 사용한다. 트랜잭션에 할당된 SqlSession
이 존재하지 않는 경우, SqlSessionFactory
메서드를 호출하여 표준 Mybatis3의 SqlSession
을 가져온다.SqlSessionFactory
는 Mybatis3 표준 SqlSession
을 반환한다. 반환된 SqlSession
이 트랜잭션에 할당되기 때문에 동일한 트랜잭션 내에 있는 경우, 새 SqlSession
을 생성하지 않고 동일한 SqlSession
을 재사용한다.On
메서드를 호출하고 SQL 실행을 요청하고, SqlSession
은 Mapping
파일에서 실행할 SQL을 가져와 실행한다.5. @Mapper와 @MapperScan 어노테이션
@Mapper
는 Mapper 등록을 위한 인터페이스에 선언하여 사용한다.
cf) 참고로 Mybatis3부터 mapper.xml 대신 interface 클래스의 Annotation을 통해 SQL을 사용할 수 있다.
@Mapper
어노테이션은 Spring DI 컨테이너에 Bean으로 등록하고, 등록한 해당 인터페이스의 SQL Annotation(@Select
, @Insert
등)을 토대로 실제 SQL문을 실행시켜준다.
이 때 매개변수를 받아올 때, @Param(" ")
을 통해 값을 명시하면 된다. 또 동적바인딩을 하고 싶다면 #{ }
를 이용하면 된다.
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user")
List<User> findAll();
@Select("SELECT * FROM user WHERE userIdx = #{userIdx}")
User findByUserIdx(@Param("userIdx") int userIdx);
}
위의 예시는 @Mapper
를 활용한 예시이다.
Link
https://khj93.tistory.com/entry/MyBatis-MyBatis%EB%9E%80-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC,
https://jung-story.tistory.com/121,