[DB] MyBatis

DyungE_100·2022년 4월 8일
0

DB

목록 보기
3/5
post-custom-banner

1. Mybatis란?

JDBC API와 고급 Mapping을 지원하여 Java코드 안에서 SQL문을 분리해주게 만드는 프레임워크다.
분리한 SQL문은 XML파일에 작성하고, 이를 메서드와 Mapping하여 중복 코드를 줄여주고 가독성을 좋게 만들어 준다.

2. Mybatis 특징

  • 1) Mybatis-SpringMybatis3Spring 연동 라이브러리로 제공된다.

  • 2) 싱글톤(Singleton)패턴으로 스프링 빈으로 등록하여 의존성 주입(DI)이 용이하다.

  • 3) Mybatis Mapper Interface를 통해 DB에 접근한다.

  • 4) 객체 프로퍼티로 파라미터와 결과를 객체(DTO, Map) 등으로 자동 Mapping을 지원한다.

  • 5) Spring 연동 모듈을 제공하기 때문에 설정이 간단하다.

  • 6) 트랜잭션을 관리해주기 때문에 쉽게 설정이 가능하다.

3. Mybatis의 주요 구성 요소와 액세스 과정

3.1 Mybatis의 주요 구성 요소

구성 요소 / 구성 파일설명
Mybatis Configuration FileMybatis3의 작업 설정을 설명하는 XML파일이다.
데이터베이스의 연결 대상, 매핑 파일의 경로, Mybatis3의 작업 설정 등과 같은 세부 사항을 설정한다.
SqlSessionFactroyBuilder
(org.apache.ibatis.session.SqlSessionFactoryBuilder)
Mybatis 구성 파일을 읽고 생성하는 SqlSessionFactory의 구성요소이다.
이 구성 요소는 Spring과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하진 않는다.
SqlSessionFactory
(org.apache.ibatis.session.SqlSession)
SQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 구성 요소이다.
Mybatis를 사용하여 데이터베이스에 액세스 할 때 필요한 요소이다.
Mapper InterfaceMapping 파일에 정의된 SQL을 호출하는 인터페이스이다.
Mybatis는 Mapper 인터페이스에 대한 구현 클래스를 자동으로 생성하므로 개발자는 인터페이스만 생성하면 된다.

3-2. Mybatis3의 데이터베이스 액세스(Access) 과정

위에는 액세스 과정을 간략화한 것이다.

    1. JDBC API를 이용하여 데이터베이스로부터 Connection 객체를 얻어오기 위해 데이터베이스와의 물리적인 연결을 지원하는 DataSource가 필요하다.(SqlSessionFactoryBean클래스의 setDataSource() 메서드에 의해 쓰여진다.)
      따라서 아래와 같이 application.properties 파일에 spring.datasource.* 패턴으로 Datasource를 설정한다.

      그 외에도 dependency 설정과 Mybatis Config 파일 설정을 완료한 채 진행한다.

(1) ~ (3)은 애플리케이션 시작할 시 수행되는 프로세스다.

    1. 애플리케이션이 SqlSessionFactoryBuilder를 통해 SqlSessionFactory를 빌드하도록 요청한다.
    1. SqlSessionFactoryBuilderSqlSessionFactory를 생성하기 위한 Mybatis Config 파일을 읽고,
    1. Config 파일에 따라 SqlSessionFactory를 생성한다.

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

    1. 클라이언트가 웹 애플리케이션에 요청을 보낸다.
    1. 애플리케이션은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져오도록 명령한다.
    1. SqlSessionFactorySqlSession를 생성하고 이를 애플리케이션에 반환한다.
    1. 애플리케이션이 SqlSession에서 Mapper 인터페이스의 구현 객체를 가져오고,
    1. 애플리케이션이 Mapper 인터페이스 메서드를 호출한다.
    1. Mapper 인터페이스의 구현 객체가 SqlSession 메서드를 호출하고 SQL 실행을 요청한다.
    1. SqlSessionMapping 파일에서 실행할 SQL을 가져와 실행한다.

4. Mybatis-Spring

4.1 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 구성 요소.

4.2 Mybatis-Spring의 데이터베이스 액세스(Access) 과정

(1)~(4)은 응용 프로그램 시작시 수행되는 과정이다.

    1. SqlSessionFactoryBeanSqlSessionFactoryBuilder를 통해 SqlSessionFactory를 빌드하도록 요청한다.
    1. SessionFactoryBuilderSqlSessionFactory 생성을 위해 MyBatis Config 파일을 읽는다.
    1. SqlSessionFactoryBuilderMyBatis Config 파일의 정의에 따라 SqlSessionFactory를 생성한다. 생성된 SqlSessionFactory는 Spring DI 컨테이너에 의해 저장된다.
    1. MapperFactoryBeanSqlSession(SqlSessionTemplate)Mapper 객체(Mapper 인터페이스의 프록시 객체)를 생성한다.
      생성되는 Mapper 객체는 스프링 DI 컨테이너에 의해 저장되며, Service 클래스 등에 DI가 적용된다. Mapper 객체는 안전한 SqlSession(SqlSessionTemplate)을 사용하여 쓰레드에 대해 안전한 구현을 제공한다.

(5)~(11)은 클라이언트의 각 요청에 대해 수행되는 과정이다.

    1. 클라이언트가 애플리케이션에 대해 요청을 하면
    1. 애플리케이션은 DI 컨테이너에서 주입한 Mapper 인터페이스를 호출한다.
    1. Mapper는 호출된 메소드에 해당하는 SqlSession 메소드를 호출한다.
    1. SqlSession(SqlSessionTemplate)은 프록시 사용 및 쓰레드에 대해 안전한 SqlSession 메서드를 호출한다.
    1. SqlSession은 트랜잭션에 할당된 Mybatis3 표준 SqlSession을 사용한다. 트랜잭션에 할당된 SqlSession이 존재하지 않는 경우, SqlSessionFactory 메서드를 호출하여 표준 Mybatis3의 SqlSession을 가져온다.
    1. SqlSessionFactory는 Mybatis3 표준 SqlSession을 반환한다. 반환된 SqlSession이 트랜잭션에 할당되기 때문에 동일한 트랜잭션 내에 있는 경우, 새 SqlSession을 생성하지 않고 동일한 SqlSession을 재사용한다.
    1. On 메서드를 호출하고 SQL 실행을 요청하고, SqlSessionMapping 파일에서 실행할 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를 활용한 예시이다.




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,

post-custom-banner

0개의 댓글