Spring/MyBatis

학습 // Spring // MyBatis // 개념 // 설정

문스코딩 2018. 10. 30. 16:35

[MyBatis]
  • 마이바티스는 SQL과 자바객체를 매핑하는 사상에서 개발된 데이터베이스 접근용 프레임워크

  • [MyBatis 특징]
    • SQL의 체계적인 관리, 선언적 정의 (  설정파일, 애너테이션 ) -> 비즈니스로직에서 SQL을 감출 수 있음
    • 자바 객체와 SQL 입출력 값의 투명한 바인딩
    • 동적 SQL 조합

  • [SQL 지정방법]
    • [매핑파일]
      • SQL 외부에 파일로 정리 할 수 있음
    • [애너테이션]
      • SQL 지정이 간단하나, 애너테이션의 표현력과 유연성의 제약탓에 복잡한 SQL에 적합하지 않은 방법.

[MyBatis 주요 API]
  • [MyBatis 주요컴포넌트]
    • 설정파일 (Config)
      • 마이바티스 동작설정을 지정
    • Mapper Interface
      • 매핑 파일이나 애너테이션에 정의한 SQL에 대응하는 자바 인터페이스
    • Mapping XML
      • SQL과 객체의 매핑 정의를 기술하는 XML파일, SQL을 애너테이션에 지정하는 경우는 사용하지 않음
    • org.apache.ibatis.session.SqlSession
      • SQL 발행이나 트랜잭션 제어용 API 제공 컴포넌트
      • 스프링 프레임워크에서 사용하는 경우에는 마이바티스의 트랜잭션 제어  API는 사용하지 않음
    • org.apache.ibatis.session.SqlSessionFactory
      • SqlSession 생성하기 위한 컴포넌트
    • org.apache.ibatis.session.SqlSessionFactoryBuilder
      • 마이바티스 설정파일을 읽어들여 SqlSessionFactory를 생성하기 위한 컴포넌트
  • [MyBatis-Spring 주요컴포넌트]
    • org.mybatis.spring.SqlSessionFactoryBean
      • SqlSessionFactory를 구축하고 스프링 DI 컨테이너에 객체를 저장
    • org.mybatis.spring.SqlSessionTemplate
      • 스프링 트랜잭션 관리하에 마이바티스 표준의 SqlSession을 취급하기 위한 컴포넌트 (스레드안전)
    • org.mybatis.spring.mapper.MapperFactoryBean
      • 스프링 트랜잭션 관리하에 SQL을 실행하는 Mapper객체를 빈으로 생성하기 위한 컴포넌트


[MyBatis 설정하기]
  • DB 속성값 설정
# DB
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/sdm
spring.datasource.username=root
spring.datasource.password=

  • 의존성모듈추가 (Spring Boot + MyBatis)
    • SqlSessionFactory, SqlSessionTemplate 포함
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>

  • 빈설정 (Spring Boot + MyBatis)
/**
* [MyBatis] SqlSessionFactory 설정
* */
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {

    / DataSource 연동
    SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
    sessionFactoryBean.setDataSource(dataSource);

    // Mapper SQL 연동
    Resource[] res = new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*Mapper.xml");
    sessionFactoryBean.setMapperLocations(res);

    return sessionFactoryBean.getObject();
}


[MyBatis 흐름]

  • 생성흐름
    • SqlSessionFactoryBean
      • SqlSessionBuilder를 사용해서 SqlSessionBean으로 생성
      • DI 컨테이너에 빈이 된 데이터 소스를 인젝션해서 조작 대상 데이터베이스를 지정
    • SqlSessionBuilder & MyBatis 설정파일
      • MyBatis 설정파일의 정의에 따라 SqlSessionFactory 생성
      • 생성된 SqlSessionFactory는 DI 컨테이너에 의해 관리
    • MapperFactoryBean
      • SessionTemplate 생성 & SQL을 실행하는 Mapper 객체 생성
      • 스프링의 트랜잭션 관리하에 마이바티스 표준의 SqlSession을 취급
  • 실행흐름
    • Client 요청
    • Mapper 객체
      • Mapper 객체는 호출된 메서드에 대응하는 SqlSession(구현클래스 SqlSessionTemplate)의 메서드를 호출
    • SqlSessionTemplate
      • SqlSessionFactory를 통해서 MyBatis 표준 SqlSession 취득 (SQL을 같은 트랜잭션에서 조작하는 경우 같은 SqlSession 공유)
      • SqlSessionFactory를 통해서 취득한 SqlSession을 실행중인 트랜잭션에 할당함으로 같은 트랜잭션에서 같은 SqlSession이 사용되도록 제어(JDK동적프락시구조이용)
      • 프락시화 된 SqlSession을 통해 MyBatis 표준 SqlSession 메서드를 호출해서 애플리케이션에서 호출된 Mapper 객체의 메서드에 대응하는 SQL 실행을 의뢰 





[MyBatis + Spring 연게]
  • 스프링 DI 컨테이너에 데이터소스 빈을 등록
  • 스프링 DI 컨테이너에 트랜잭션 관리자의 빈을 등록
  • 애너테이션 기반의 애너테이션 제어 활성화
  • 스프링 DI 컨테이너에 SqlSessionFactory의 빈을 등록
  • Mapper 인터페이스 스캔기능을 활성화

반응형