문제
JAVA 17, Spring Boot 3.2 멀티 모듈 구조에서 각 모듈간의 의존성을 제대로 선언해놓고 실행했음에도 모듈에서 다른 모듈의 소스 정보를 못 읽어오는 이슈가 발생했다.
해당 문제를 해결하기 위해 애플리케이션 실행 지점에 다른 모듈의 객체를 생성하는 간단한 코드를 넣어 확인해보았다. 소스코드와 IDE 상에는 분명히 domain 모듈의 Product 클래스가 import 되어 있는데, 컴파일러가 Product 클래스를 import 하는 시점에 오류가 발생한다.
해당 프로젝트는 내가 예전에 작성하고 테스트까지 끝마쳤던 소스코드를 그대로 가져와서 동일한 환경으로 재구성 한 것이라 완벽하게 동일한 소스코드와 의존성을 가지고 있다. 이전의 프로젝트는 오류없이 정상적으로 실행되니 참 답답한 상황이 아닐 수 없다. 😢😢😢😢😢
해결 과정
일단 레퍼런스가 존재하는 모든 방법을 총 동원해서 문제를 해결해보려 했다.
1. IDE 캐시 삭제하기 (실패)
제발 여기서 해결되었으면 하는 마음이었지만 어림도 없이 실패.
2. 모듈에 의존성 직접 추가해주기 (실패)
분명히 bootstrap 모듈의 main 패키지에 domain 모듈이 추가되어 있는데 이상하다.
아예 모듈 루트 패키지에 domain 모듈의 의존성을 추가해주었으나 실패
3. 클린 빌드로 이전 빌드 싹 지우기 (실패)
4. Gradle의 로컬 의존성 캐시 무시하고 클린 빌드 (실패)
./gradlew clean build --refresh-dependencies
./gradlew clean build --refresh-dependencies --rerun-tasks
5. 모듈간 의존성을 루트 gradle 파일이 아닌 각 모듈의 gradle 파일에 명시하기 (실패)
project(':used-trading-application') {
dependencies {
implementation project(':used-trading-domain')
}
}
project(':used-trading-bootstrap') {
apply plugin: 'org.springframework.boot'
dependencies {
implementation project(':used-trading-domain')
implementation project(':used-trading-application')
implementation project(':used-trading-framework')
}
}
project(':used-trading-framework') {
dependencies {
implementation project(':used-trading-domain')
implementation project(':used-trading-application')
}
}
root 디렉터리의 build.gradle 코드를 각 모듈의 build.gradle 파일에 선언해주는 방식도 역시나 실패했다. 혹시나 싶어 setting.gradle도 확인해 봤으나, 이게 잘못됐음 빌드부터 실패하는 게 당연해서 역시나 문제의 원인은 아니었다.
문제 해결: 문제는 Plain Archive?
너무 답답해서 이전의 프로젝트에 clean build를 진행하고 다시 코드를 가져오려 했다. 그런데 이게 무슨일인가 이전의 프로젝트에서도 같은 오류가 발생했다. 문명히 잘만 실행되었었는데 정신이 아찔해졌다.
내가 이전에 진행했던 프로젝트들과 지금의 프로젝트가 다른점이 무엇인지 잘 생각해봤다. 그리고 수상한 녀석이 눈에 들어왔다.
subprojects {
// ...
tasks.named('jar') {
enabled = false;
}
}
build.gradle 파일에 해당 코드를 추가하면 plain archive 파일을 생성하지 않는다. plain archive는 내가 작성한 소스코드에서 의존성을 모두 제거한 소스코드 본연의 그것?을 가지는 jar 파일이다. 즉, 위의 코드로 인해 내 루트 프로젝트의 모든 하위 모듈은 plain archive를 생성하지 않는다.
plain archive가 왜 필요한지 많은 의문을 가져서 멘토님께도 여쭤보고 이것저것 자료를 찾아봤는데도 사용처는 찾을 수 없었다. 따라서 딱히 문제가 없을 줄 알았다.
설마 싶었다. 설마 한 모듈에서 다른 모듈을 사용할 때, plain archive를 사용하는건가?
그렇다고 시원하게 글을 작성하진 못하겠다. 하지만 그렇다고 추측은 된다. 왜냐하면 plain archive를 다시 생성하도록 설정한 후 정상적으로 동작했기 때문이다.
너무 기쁜 나머지 치킨을 시켰다. 다음으로 발생할 문제를 예상하지 못하고 말이지 후후후,,
결론
혹시라도 모듈간 의존성 참조가 안되는 경우에는 하위 모듈이 plain archive를 생성하지 않는건 아닌지 확인해보자. 나는 아래의 코드를 제거하여 빌드 시 plain archive를 생성하도록 두어 문제를 해결했다.
subprojects {
// ...
tasks.named('jar') {
enabled = false;
}
}
레퍼런스가 없다면 몸과 시간으로 떼워라,,
'중고 거래 플랫폼 API 서버 개발 > 트러블 슈팅' 카테고리의 다른 글
테스트 더블을 직접 구현하여 발생한 이슈 (0) | 2024.05.03 |
---|---|
SpringBoot 멀티 모듈 프로젝트 Gradle 빌드 시 bootJar 태스크 실행 오류 (1) | 2024.02.10 |