티스토리 뷰

멀티 모듈 프로젝트에서 의존성 관리는 어렵다

경험 삼아 & 재미로 멀티 모듈 프로젝트를 하고 있는데 의존성 관리를 아래와 같이 해왔다

프로젝트 루트 경로의 build.gradle

 

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 또한 찾지 못한다

custom bean을 찾지 못 한다

 

우선 첫째로 왜 못 찾을까?

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)})

 

 

해결 후

 

 

댓글
링크
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday