MyBatis와 MyBatis-Spring
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 사이에 위치하여 서로를 매핑해준다.
- MyBatis의 주요 컴포넌트와 동작과정은 다음과 같다.
- MyBatis Config 파일을 읽어 SqlSessionFactorBuilder 객체를 생성한다.
- MyBatis Config 파일에는 DB 설정 정보, mapper 파일 등록, typeAlias 설정 등이 있다.
- SqlSessionFactoryBuilder 객체를 이용해 SqlSessionFactory 객체를 생성
- 앱 실행 중 (런타임)에 CRUD 요청이 들어오면, SqlSessionFactory로 SqlSession 객체를 생성한다.
- 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(); }
참고