프로그래밍/연구

스프링부트 + Mybatis 프로젝트에서 @Mapper 클래스가 bean 등록이 되지 않는 문제

말랑공룡 2023. 9. 14. 13:49

발단


여러가지 테스트를 위해 새로운 스프링부트 gradle 프로젝트를 생성했다.

자바17에 스프링부트는 3.1.3 버전이었고 dependency들은 예전 프로젝트 환경설정들을 가져왔다.

 

 

그리고 정석대로 컨트롤러, 서비스, 매퍼, 매퍼xml을 생성하고 서버를 올렸는데

 

 

이런 에러가 발생했다.

 

분석


에러는 말 그대로 SampleService에서 SampleMapper를 DI 하려고 했는데 sampleMapper라는 bean이 없다는 뜻.

 

 

어노테이션 다 붙이고

 

 

패키지도 같은 패키지 안에 있는데 뭐가 문제일까.

어쨌든 컴포넌트 스캔 도중 스프링 빈 등록에서 누락되었을거니까 구체적으로 스캔 패키지를 명시해줘보았다.

 

 

이렇게 하면 정상 작동했다.

그러나 대체 왜? 기존에 알고있는 내용대로라면 같은 패키지 내에서는 빈 등록이 제대로 되어야 할텐데..

그런데 하필 @Mapper만 제대로 빈 등록을 못하는걸 보니 data와 관련되어 있는 듯 했다.

그러다가 스프링부트와 mybatis의 버전이 상이할 경우 호환성 문제가 발생할 수도 있다는 내용을 발견했다.

설정되어있던 스프링부트 버전은 3.1.3, mybatis 버전은 2.2.2. 호환성 문제가 발생할 수 있을 것 같았다 .

 

해결


mybatis 버전을 스프링부트 버전대에 맞춰서 3.x 대로 변경하고 서버를 올리자 명시적인 스캔 base package 설정이 없어도 정상적으로 빈 등록이 되어 DI가 작동하는 것을 확인할 수 있었다.

 

 

결론


스프링부트와 라이브러리의 버전에 따라 호환성 문제가 발생할 수 있다.

이 점을 염두에 두고 프로젝트를 구성하자.