티스토리 뷰
[Spring] @Cacheable Cannot resolve bean 'cacheManager'
ryumodern 2021. 12. 17. 19:48멀티 모듈 프로젝트에서 의존성 관리는 어렵다
경험 삼아 & 재미로 멀티 모듈 프로젝트를 하고 있는데 의존성 관리를 아래와 같이 해왔다
module-api, module-service 가 module-core에 의존하고 있는 중이다
얼마전 비대해진 root build.gradle의 dependencies를 세분화하여 각각의 모듈 build.gradle로 옮기는 작업을 진행했다
깔끔하게 다이어트 시키고 모듈 별로 필요한 라이브러리에만 의존할 수 있게 만들어 성공적이었다
현재 root build.gradle에서는 위에 지정해준 project(':module') 라인이 빠진 상태고
모듈 별 build.gradle의 dependencies에서 implementation project(':module') 형태로 관리 중이다
build.gradle 정리 후에도 몇가지 작업을 더 진행 했는데 어느 순간 Service 클래스에 Inspection error들이 뿜어져 나왔다
문제가 생겼을 때 바로 캐치해야 했는데 애플리케이션 구동 자체에는 문제가 없었기 때문에 대응이 늦었다
그 결과로 정확한 원인은 파악할 수 없게 됐다 문제는 module-service에 있다
캐시 추상화를 위해 사용 중인 @Cacheable, @CachePut 등의 어노테이션에서
KeyGenerator, CacheManager를 직접 만든 커스텀 빈을 사용 중인데 이 빈을 찾지 못해 문제가 발생했다
아래 사진은 customKeyGenerator만 찍혔는데 cacheManager 또한 찾지 못한다
우선 첫째로 왜 못 찾을까?
module-service에서 implemetation project(':module-core') 를 했음에도 불구하고 못 찾은 이유가 무엇일까?
customKeyGenerator는 module-core에서 작성된 custom bean이다
정확한 이유는 아직 찾지 못 했다 추후 더 찾아보고 공부해봐야겠다
빌드 과정에서는 문제가 없지만 컴파일 타임에는 찾아주지를 못 하는 것 같다
왜 문제가 되지 않았을까?
내가 실행하는 모듈은 api에 있는 SpringBootApplication이고 실행될 때
각 module들의 같은 basePackage를 탐색하기 때문에 module-api, service, core의 빈들이 전부 찾아진다
그래서 실행 시에는 저 할당된 빈이 찾아졌기 때문에 문제 없이 구동된 것이다
그래도 왠지 빨간 줄은 거슬리니까 문제를 해결해봤다
인텔리제이 ultimate을 사용 중이면 정상적인 상황에서 customKeyGenerator를 ctrl + 클릭으로 찾아갈 수 있다
현재는 빈을 찾지 못해 navigate 기능까지 사용하지 못 하는 중이다
핵심은 module-service가 module-core를 인식하게 만들어야 한다
가장 간단한 방법으로는 module-service에 @SpringBootApplication을 붙여주는 것이다
그런데 내 상황에서는 module-service의 여러 테스트 코드에서 module-api의 @SpringBootApplication이 붙어있는
기본 설정들에 의존하고 있는 것들이 많아 이 방식으로는 해결이 불가하다
다음 방법으로는 @ComponentScan으로 인식하게 해주는 것이다
단순히 이 애노테이션 하나만으로는 인식이 안 됐다
@SpringBootApplication과 무슨 차이가 있어 안 됐는지 확인해보니
@SpringBootConfiguration, @EnableAutoConfiguration 두 녀석이 보였다
이 중 @SpringBootConfiguration 얘를 붙이면 스프링부트를 띄울 때 참고하게 되어 다시 충돌이 나게 된다
따라서 위치는 상관 없고 설정 클래스에 @EnableAutoConfiguration, @ComponentScan을 설정해주어 문제를 해결했다
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class)})
'Spring > Spring Framework' 카테고리의 다른 글
나는스프링을 올바른 방식으로 학습 하고 있는가 (0) | 2022.02.26 |
---|---|
[AOP] 시간 측정, 로그 AOP 개선하기 (0) | 2022.02.06 |
[Log4j2] CVE-2021-44228 대응 (0) | 2021.12.13 |
[Test] 기묘한 병렬 테스트 (0) | 2021.12.06 |
[Test] JPA DataIntegrityViolationException 발생 테스트 복구 (0) | 2021.11.19 |