현재 하고 있는 프로젝트에서는 멀티 모듈 구조로 이루어져있다.
그런데 우리 팀이 일주일 넘게 고통받았던 그 오류는 바로... IntelliJ에서 '패키지 경로를 못찾는다는 것'...이다.
이렇게 import 자체에서 못가져온다고 빨간 줄이 뜨지도 않는데 build하려고 하면 문제가 생긴다.
따라서 간단하게 우리 프로젝트 구성에 대해 설명하고 몇 가지 해결 방법에 대해서 다뤄보려고 한다.
우리팀 프로젝트 멀티 모듈 구성
1. 프로젝트를 생성하여 기본적으로 생기는 src 파일을 아예 삭제 해버리고(어차피 쓸모없기 때문)
2. 총 4개의 모듈을 세팅해두었다.
3. 부모 모듈이라 볼 수 있는 common, 자식 모듈로 볼 수 있는 admin, b2c, schedule 모듈까지 해서 총 4개이다.
4. 자식 모듈들을 common 모듈을 바라보고 서로는 바라볼 수 없게 구성되어야 한다. common또한 자식을 바라보면 안된다.
아래 그림을 참고하자.
기본 설정
멀티 모듈 구조로 이루어져있을 시 기본적으로 세팅해두어야 할 것들이 있다.
처음 모듈들을 정상적으로 만들었다면, 최상단 프로젝트에 있는 `settings.gradle`에는 다음과 같이 설정이 되어있어야 한다.
rootProject.name = 'crowrong-project'
include 'admin'
include 'schedule'
include 'common'
include 'b2c'
최상단 프로젝트와, common, admin, b2c, schedule 모두에 `build.gradle`이 설정되어있어야 하는데, 관련해서는 다른 글에서 다뤄보도록 하겠다.
대략적으로 설명하자면 최상단 프로젝트에 있는 `build.gradle`에서는 subprojects를 아우를 수 있는 설정이 필요하고, 각각의 모듈(4개)에 대해서는 각자 필요한 설정들을 해주면 된다.
하지만 내가 이 글에서 짚고 넘어가야 할 부분은 바로 위의 그림처럼 admin, b2c, schedule이라는 모듈이 common을 바라볼 수 있도록 `build.gradle`에 설정을 해야 한다는 부분이다.
common을 제외하고 나머지 admin, b2c, schedule 모듈에서는 각각의 의존성에 아래처럼 common을 추가해야한다.
그래야 common 안에 있는 entity 클래스들, 기타 config들에 접근을 할 수 있다.
dependencies {
implementation project(':common')
}
이렇게 해야 common 안에 있는 Blog.java를 import 해올 수 있다는 뜻이다.
멀티 모듈의 구성이라면 위와 같은 세팅이 빠진게 없나 한번씩 확인을 해줘야 한다.
해결 방법들
1. Gradle 설정 확인하기
[File - Settings - Build, Execution, Deployment - Build Tools - Gradle] 에서 아래처럼 잘 설정되어있나 확인하기
검색에 그냥 `build`라고 치면 간편하게 들어갈 수 있다.
2. build clean 시킨 후 재빌드하기 ⭐⭐
IntelliJ 오른쪽에 gradle 선택 후 [Tasks -> build -> clean] 해준 후 재빌드 해준다.
이번에는 아니지만 그전에는 이 방식으로 해결한 적이 많다.
비슷한 방식으로 아예 왼쪽 프로젝트에서 `.gradle`이나 `build`를 삭제하고 재빌드해줘도 된다.
+ 같은 방식으로 아래처럼 명령어 쳐서 clean하고 재빌드 하는 방식도 있다.
./gradlew clean build
3. build.gradle 설정에서 bootJar, jar 비활성화/활성화 확인하기⭐⭐
부모 모듈인 common 과 자식 모듈인 admin, b2c, scheduler은 build.gralde 설정에서 꼭 달라야 하는 부분이 있다.
바로 bootJar와 jar의 비활성화 혹은 활성화 상태이다.
🤔여기서 잠깐! bootJar와 jar가 뭔 차이인데?
bootJar로 생성된 .jar는 애플리케이션 실행에 필요한 의존성까지 모두 포함하여 빌드하고,
jar로 생성된 .jar는 애플리케이션 실행에 필요한 의존성을 제외한 모든 리소스 파일과 빌드된 소스 코드의 클래스 파일만 포함된다.
즉, 부모 모듈인 common과 같이 따로 실행이 필요하지 않은 모듈은 bootJar는 비활성화하고 jar만 활성화시켜준다.
반대로 나머지 자식 모듈의 경우에는 단순히 해당 프로젝트 안에 있는 자바 클래스들이 패키징된 것은 필요하지 않기 때문에 스프링 부트로 실행할 때 필요한 bootJar만 필요해서 bootJar는 활성화하고 jar는 비활성화시켜준다.
부모 모듈인 common의 build.gradle과 프로젝트 최상단에 있는 build.gradle은 아래와 같이 bootJar는 비활성화하고, jar는 활성화시켜 설정해줘야 한다.
tasks.bootJar {
enabled = false
}
tasks.jar {
enabled = true
}
나머지 자식 모듈의 경우는 build.gradle을 반대로 bootJar는 활성화시키고, jar는 비활성화시켜 설정해줘야 한다.
tasks.bootJar {
enabled = true
}
tasks.jar {
enabled = false
}
이 부분은 멀티 모듈의 구조를 가지고 있다면 정말정말 꼭 확인할 것!! 가끔 다른 사람들이 잘못 설정하고 push날린 걸 내가 pull받게되면서 이 부분 확인하는 걸 놓치는 경우가 있을 수 있다..! 🥲
4. 캐시 삭제하기
IntelliJ 상단 목록에 [File - Invalidate Cashes...] 선택하고
Invalidate and Restart 클릭해준다.
5. 직접 라이브러리 선택해서 프로젝트에 추가하기(최후의 수단..)
상단 메뉴에서 [File - Project Structure] 선택
[Project Settings - Modules] 에서 프로젝트에 필요한 모든 라이브러리랑 패키지를 찾을 수 있어야 한다.
필요한 패키지를 찾을 수 없다면 직접 `+`버튼을 눌러 `Library - From Maven` 선택 후 해당 패키지 검색해서 선택하여 추가한다.
+++
이밖의 방법으로는 IntelliJ껐다 켜보기, IntelliJ 킬 때 최근 프로젝트 선택이 아니라 직접 경로 선택해서 열어보기 등등...여러 가지가 있는데 우리팀은 모두 2번~4번의 방식으로 해결했었다.
정리
멀티 모듈은 설정이 잘 되어있나가 포인트라 생각이 든다.
1. `settings.gradle` 한번 모듈 다 있나 확인해주고,
2. `application.yml` 파일에서 부모 모듈을 의존성에 추가했나 확인해준 후 한번 gradle clean & build해주고,
3. `build.gradle`파일에서 각 모듈별, 프로젝트 최상단 모두 bootJar, jar 활성화 or 비활성화 설정을 잘했는지 확인해주고,
4. 정 안되면 캐시도 삭제해보고 하면 된다.
꼭 이글을 통해 2~3시간 아끼시길...!!!