1 분 소요

MyBatis란?

  • DAO 객체와 SQL문을 Mapping 해주는 Persistence Framework
  • Data Access Layer에 속한다.

MyBatis 없이 JDBC를 이용해 DAO 객체를 생성하려면 다음 작업들을 Java 소스에 작성해야 한다.

  • DriverManager로부터 Connection을 받아온다.
  • Connection 객체로부터 PreparedStatement 객체를 생성한다.
  • query를 세팅한 후, pstmt.executeQuery()혹은 pstmt.executeUpdate() 메서드를 실행한다.
  • 결과 값을 Result Set 혹은 int에 담는다.

반면, MyBatis를 사용하면 다음과 같은 장점이 있다.

  • 위 과정들을 소스에서 걷어 낼 수 있다.
  • Java 코드와 SQL을 분리한다.
    • SQL이 Java 코드 안에 들어가 있으면, sql 수정 시 앱을 새로 컴파일 해야함. But 쿼리를 XML에 작성하면 쿼리를 수정해도 새로 컴파일 하지 않아도 된다.
  • 즉, Mybatis는 아래와 같이 DAO와 JDBC 사이에 위치하여 서로를 매핑해준다.

image

  • MyBatis의 주요 컴포넌트와 동작과정은 다음과 같다.

image

  1. MyBatis Config 파일을 읽어 SqlSessionFactorBuilder 객체를 생성한다.
    • MyBatis Config 파일에는 DB 설정 정보, mapper 파일 등록, typeAlias 설정 등이 있다.
  2. SqlSessionFactoryBuilder 객체를 이용해 SqlSessionFactory 객체를 생성
  3. 앱 실행 중 (런타임)에 CRUD 요청이 들어오면, SqlSessionFactory로 SqlSession 객체를 생성한다.
  4. SqlSession 객체를 이용해 DB 요청을 한 후, 결과 값을 받아온다.

MyBatis-Spring이란?

  • MyBatis를 Spring에 녹여 더 쉽게 사용할 수 있게 하기 위한 연동 모듈이다.
  • SqlSessionFactoryBean과 SqlSession을 Spring Framework의 Bean으로 등록한다.
  • 설정

      @Configuration
      @MapperScan(
      		basePackages = {
      				"com.example.demo.**.mapper"     // mapper 인터페이스 위치
      		}
      	,	sqlSessionFactoryRef = "sqlSessionFactorySvc"
      )
      public class DatabaseSvcConfig {
      	..(변수 세팅)..
      	// db connection pool 및 로그 설정
      	@Bean(name = "dataSourceSvc")
      	public DataSource dataSource() {
      		HikariDataSource hikariDataSource = new HikariDataSource();
      		hikariDataSource.setDriverClassName(StringUtils.trim(driveClassName));
      		hikariDataSource.setJdbcUrl(StringUtils.trim(jdbcURL));
      		hikariDataSource.setUsername(StringUtils.trim(username));
      		hikariDataSource.setPassword(StringUtils.trim(password));
      		hikariDataSource.setConnectionTestQuery(StringUtils.trim(connectionTestQuery));
      		hikariDataSource.setMinimumIdle(NumberUtils.toInt(minIdle, 0));
      		hikariDataSource.setMaximumPoolSize(NumberUtils.toInt(maxIdle, 0));
      		return new DataSourceSpy(hikariDataSource);
      	}
        
      	@Bean(name = "sqlSessionFactorySvc")
      	public SqlSessionFactory sqlSessionFactory(@Qualifier("dataSourceSvc") DataSource dataSource)  {
        
      		**SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
      		bean.setDataSource(dataSource);**
        
      		// MyBatis 설정파일 위치 설정
      		**bean.setConfigLocation(new ClassPathResource(MYBATIS_CONFIG_FILE));**
        		
      		// XML을 매퍼로 등록
      		List<Resource> resourceList = new ArrayList<Resource>();
        		
      		// 쿼리 xml 파일 설정
      		resourceList.addAll(/* xml 파일 위치 */);
      		Resource[] resources = new Resource[resourceList.size()];
        		
      		// 쿼리 xml 파일 경로 설정
      		**bean.setSqlMapperLocations(resourceList.toArray(resources));**
        		
      		return bean.getObject();
      	}
    

참고

https://pangtrue.tistory.com/141