본인은 Spring 에서 Mybatis 를 사용하기 위해서 Mapper 인터페이스를 생성하고 .xml 파일을 생성하여
쿼리문을 호출했다.
이때 필요한 Mapper 인터페이스를 사용하기 위한 Bean 등록 방법을 알아보자
총 3가지가 있다.
1. @Mapper 어노테이션 개별 사용
2. @MapperScan 어노테이션을 사용한 모든 Mapper 파일 패키지 설정
3. xml 을 사용했을 경우 SqlSessionFactoryBean 의 setMapperLocations() 함수 사용
1. @Mapper 어노테이션 사용
@Mapper 어노테이션은 각 Mapper 인터페이스에 직접 붙여 Bean 으로 등록한다.
모든 Mapper 인터페이스에 붙이기에는 효율성이 떨어지므로 아래 설명할 @MapperScan 어노테이션을 사용한다.
package com.obo.mapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface TestMapper {
int testCount();
}
2. @MapperScan 어노테이션 사용
지정한 패키지의 모든 Mapper 를 자동으로 Bean 등록 해준다.
사용방법은 아래와 같다.
특별한 설정이 필요하지 않을경우 주석처리된 것처럼 패키지만 문자열로 설정해주면 된다.
@MapperScan 어노테이션이 설정한 패키지의 경로내 Mapper 인터페이스들을 Bean 으로 등록해준다.
@Configuration
@MapperScan(basePackages = "com.obo.mapper")
// @MapperScan("com.obo.mapper")
public class DBConfig {
....
}
3. xml 사용 시 SqlSessionFactoryBean 의 setMapperLocations 함수 사용
XML 기반 SQL Mapper 파일들과 매핑되는 Mapper 인터페이스가 있을 경우 xml 의 경로를 설정해줘야 한다.
SqlSessionFactoryBean 을 통해 setMapperLocations 로 xml 경로를 설정해주면
@Mapper 어노테이션이나 @MapperScan 설정을 하지 않고 Bean 으로 등록되어 있지 않은 Mapper 인터페이스들을
MyBatis 가 프록시 객체를 생성해서 인터페이스들과 연결한다.
@Configuration
//@MapperScan(basePackages = "com.obo.mapper")
public class DBConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariConfig hikariConfig() {
return new HikariConfig();
}
@Bean
public HikariDataSource dataSource(HikariConfig hikariConfig) {
return new HikariDataSource(hikariConfig);
}
@Bean
public SqlSessionFactory sqlSessionFactory(HikariDataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/obo/mapper/xml/**/*.xml"));
return bean.getObject();
}
@Bean
public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
결론
구성 요소 |
필요 여부 |
현재 사용 여부 |
설명 |
@MapperScan |
❌ (선택) |
❌ |
편의성용, 현재 필요 없음 |
@Mapper |
❌ (XML 기반이면) |
❌ |
현재 없어도 문제 없음 |
setMapperLocations |
✅ (XML 기반 필수) |
✅ |
핵심 설정 포인트 |
SqlSessionFactoryBean |
✅ |
✅ |
핵심 역할 |
HikariCP |
✅ |
✅ |
데이터베이스 커넥션 풀 역할 |
그래서 언제 @MapperScan 이 필요할까?
XML 을 사용하지 않고 Mapper 인터페이스 + @Mapper + 어노테이션 기반 SQL(@Select, @Insert) 을 사용할 때 적합하다.
또한 자동으로 Bean 등록을 간편하게 하고 싶을때 사용하면 된다.