Archive/예전 TIL

[트러블슈팅] MyBatis Mapper가 Bean으로 등록되지 않는 런타임 에러 해결

khu2172 2025. 6. 28. 05:29

 문제 상황

Inquiry(문의) 도메인 관련 기능을 개발 중,
InquiryMapper를 DI로 주입하려고 하자 다음과 같은 런타임 에러가 발생했다.


원인 분석

  • InquiryMapper.java에 분명히 @Mapper 애노테이션을 붙였고,
  • Mapper XML의 namespace도 정확하게 일치했다.
  • application.properties의 mybatis.type-aliases-package 설정도
    도메인 패키지별로 꼼꼼히 등록했다

 

그런데도 InquiryMapper가 Bean으로 등록되지 않아 DI가 실패했다!

 


 해결 과정

1. 설정 파일 확인

  • @Mapper 누락, type-aliases-package, XML 경로, 파일명, 오타 등
    여러 설정을 점검했으나 모두 이상 없었음.

2. Application 클래스에서 @MapperScan 범위 문제 발견!

  • @SpringBootApplication 위에이렇게 user.repository만 매퍼 스캔하고 있었음!
  • @MapperScan("com.example.board.user.repository")
  • inquiry.repository는 스캔 대상에서 완전히 빠져 있었던 것!

3. 해결 방법 적용

  • @MapperScan에 inquiry.repository도 함께 스캔하도록 상위 패키지 한 번에 스캔하도록 설정

4. 정상 동작 확인

  • 설정 수정 후 InquiryMapper가 Bean으로 정상 등록되어
    InquiryService에서 의존성 주입이 잘 되는 것을 확인!

느낀 점 & 정리

  • @MapperScan의 범위를 좁게 잡으면,
    새로 만든 매퍼가 Bean으로 등록되지 않을 수 있다!
  • 실무/팀 프로젝트에서는
    최상위 패키지 단위로 한 번에 스캔하는 게 관리에 훨씬 유리함
  • 또, type-aliases-package도 마찬가지로
    하위 패키지까지 넓게 등록하는 습관이 장기적으로 안전하다
  • 런타임 DI 에러가 나오면
    패키지 스캔 범위부터 반드시 확인하자!

결론

MyBatis에서 매퍼가 Bean으로 등록되지 않는 문제는
대부분 스캔 범위(@MapperScan)에서 빠져 있는 경우다.
새로운 도메인/매퍼를 만들 때는
패키지 구조와 스캔 범위를 반드시 점검하는 습관을 들이자!