Java / Spring

@MapperScan 본문

Spring/MyBatis

@MapperScan

밍구밍구밍 2025. 5. 10. 16:33

이전에 특정 도메인의 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