Java / Spring
@MapperScan 본문
이전에 특정 도메인의 Mapper 인터페이스에 @Mapper 라는 어노테이션을 설정해서 xml 파일이 해당 mapper 인터페이스를 참조할 수 있도록 하였는데 만약 추가될 Mapper 인터페이스가 여러개면 모든 Mapper 인터페이스에 같은 어노테이션을 적용해야한다.
이럴 때 @MapperScan 이라는 어노테이션을 적용한다.
먼저 프로젝트의 config 패키지에 mybatis 환경설정을 위한 MyBatisConfig 객체를 생성한다.
package kr.co.pei.pei_app.config.mybatis;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("kr.co.pei.pei_app.domain.repository.schedule.mybatis")
public class MyBatisConfig {
}
이렇게 하면 @MapperScan 의 내부 경로 패키지에 있는 인터페이스를 탐색한다.
## @MapperScan 이 Mapper 로 판단하는 조건
1) 인터페이스 객체 (추상, 일반클래스 객체 X)
2) 상속이나 구현을 받지 않은 인터페이스
3) Enum, Record, Object 등 안됨
- 이유 : MyBatis 는 Mapper 인터페이스에 대해 동적으로 프록시 객체를 생성하여 SQL 실행을 위임하기 때문
(* 추상, 일반클래스와 같은 객체는 프록시 대상이 되지 않기 때문에 애초에 MapperScan 적용 대상이 아님)
위와 같이 특정 패키지 경로에 @MapperScan 을 설정하면 아래와 같이 @Mapper 어노테이션을 주석처리해도 테스트가 정상적으로 실행 된다.
//@Mapper // 이 어노테이션을 적용해야 mapper 파일(.xml)에서 인식
public interface ScheduleMapper {
// 일정 저장
void save(AdminCreateScheduleDTO dto);
// 일정 수정
void update(@Param("update") AdminScheduleUpdateDTO dto);
// 단일 일정 조회
Optional<Schedule> findById(Long id);
// 일정 전체 조회
List<Schedule> findAll();
}
추가적으로
@MapperScan(basePackages = "kr.co.pei.pei_app.domain.repository.schedule.mybatis",
annotationClass = Mapper.class)
annotationClass 와 같은 옵션을 사용할 경우 @Mapper 로 등록된 인터페이스만 스캔하는 옵션도 존재 한다.
'Spring > MyBatis' 카테고리의 다른 글
SpringBoot + MyBatis 설정 (+테스트) (0) | 2025.05.09 |
---|