멀티 모듈이란? 서로 독립적인 프로젝트(인증, 어플리케이션)을 하나의 프로젝트로 묶어 모듈로서 사용되는 구조를 말한다.
멀티 모듈을 사용하면 공통적인 기능을 모아 하나의 모듈로 만드는 것이 가능하다.
즉, 인증과 어플리케이션에서 공통으로 사용되는 Util, Domain, Common 등을 모듈로 분리해 사용할 수 있다.
가장 상위에 존재하는 Root와 코드를 어떻게 해당모듈을 통해 분배할 것 인지를 설계하는 단계
실패한 멀티 모듈 프로젝트의 경우
공통이라는 Common 단어에 사로잡혀 하나의 Common 모듈안에 여러 연관관계를 갖게 되면, 문제점이 발생하게 된다.
리팩토링의 비효율성 : Common 하나의 코드를 수정하기 위해서는 연관관계를 갖는 모든 코드를 수정해야하는 결과를 가지고 올 수 있다.
의존성으로 인한 최적화 실패 또는 장애포인트 : 과도한 의존성의 사용으로 인해 불필요한 의존성 혹은 DB Connection 을 진행하게 되고, 그로 인해 최적화 실패와 장애 포인트로 이어지게 된다.
하나의 프로젝트 생성으로 멀티 모듈의 예제를 시작하게 된다.
처음 만들게 되는 프로젝트는 어떠한 코드를 실행하기 위함이 아닌 여러 모듈을 담을 수 있는 폴더를 만드는 것이다.
subprojects {
apply plugin: 'java-library'
}
build.gradle에서 api 키워드를 사용하기 위해선 2가지 중 1가지 방법으로 선언해야 한다.
Root에 해당되는 최상위 경로에서 새로운 모듈을 생성한다.
각각 하위의 모듈은 상위 프로젝트는 아래와 같은 내용이 동일해야 한다.
이외 모듈에서 Lombok 과 Spring Web이라는 Dependency 가 있어야한다.
하위 모듈에 필요 없는 것들
1. gradlew
2. gradlew.bat
3. HELP.md
4. settings.gradle
그리고
resource폴더 안에 static과 template가 있는데, 필요가 없으므로 삭제, 그리고 properties를 yml로 변경한다.
Root 의 setting.gradle을 보면 방금 생성한 module-common과 module-api가 include되어있는 것을 확인할 수 있다.
하위 모듈로 선언
rootProject.name = 'multi-module-test'
include 'module-api'
include 'module-common'
그리고 IntelliJ의 Gradle Tab에서도 module-api와 module-common이 하위에 존재하는 것을 확인할 수 있다.
의존성 부여
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
이렇게 진행하면 멀티 모듈이 사용할 수 있다.
만약 에러가 발생한다면 설정파일의 주입이 잘못되었을 경우가 많기때문에 주의가 필요하다.
References (참고 자료)
혹시 멀티 모듈로 분리하고 Github에 어떻게 push를 하나요? 일반적으로 Intellij를 통하여 Push를 하면 모듈에 접근을 할 수 없는 문제가 발생을 합니다.