멀티 모듈 프로젝트 구성 방법
2023. 5. 8. 23:57ㆍ스프링
(2021년 작성됨)
Spring Boot 멀티 모듈 프로젝트 설정(root, 각 모듈 build.gradle 설정)
root 프로젝트의 build.gradle
(소스 출처 : https://daddyprogrammer.org/post/13156/spring-boot-change-multi-module/)
buildscript {
ext {
springBootVersion = '2.1.4.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath "io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE"
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
// 모든 모듈에서 사용하는 라이브러리
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
//embedded-redis
implementation 'it.ozimov:embedded-redis:0.7.2'
implementation 'io.springfox:springfox-swagger2:2.6.1'
implementation 'io.springfox:springfox-swagger-ui:2.6.1'
implementation 'net.rakugakibox.util:yaml-resource-bundle:1.1'
implementation 'com.google.code.gson:gson'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
runtimeOnly 'mysql:mysql-connector-java'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
}
project(':module-common') {
// common 모듈에만 필요한 라이브러리가 발생하면 이곳에 추가한다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt:0.9.1'
}
}
project(':module-user') {
// user 모듈에만 필요한 라이브러리가 발생하면 이곳에 추가한다.
dependencies {
compile project(':module-common')
}
}
project(':module-board') {
// board 모듈에만 필요한 라이브러리가 발생하면 이곳에 추가한다.
dependencies {
compile project(':module-common')
}
}
멀티모듈로 만들어진 프로젝트들은 각각 독립적인 프로세스를 가진다.
dependencies{}
에compile project()
포함한 경우는, 포함한 프로젝트에 대한 코드(application.yml
포함)를 함께 컴파일하는 것 같다.- 위의
build.gradle
를 예시로 들면,module-user
모듈을 구동할 때module-common
모듈의 코드는 함께 실행되고,module-board
는 실행 되지 않는다.
- 위의
root-build.gradle
의dependencies{}
에 포함되는 라이브러리는 모든 모듈 내부 코드에서 사용가능하고,module-common
의dependencies{}
에 포함되는 라이브러리는module-common
모듈 내 코드에서만 사용 가능하다!
추가로 알게 된 것..
- Gradle 에서 compile과 implementation의 차이점
- compile은 모듈과 직접, 간접적으로 의존하고 있는 모든 라이브러리나 모듈을 재빌드하며, 연결된 모든 모듈의 API가
exposed(노출)
된다. - implementation은 모듈을 직접 의존하고있는 모듈만을 재빌드하며, 연결된 API는 노출되지 않는다. (
not exposed
)
- compile은 모듈과 직접, 간접적으로 의존하고 있는 모든 라이브러리나 모듈을 재빌드하며, 연결된 모든 모듈의 API가
Reference
- 스프링 부트 어드민 사용해보기
- Spring Boot | 멀티 모듈 프로젝트 (Multi Module)
- 스프링 부트로 멀티모듈 셋팅하기
- Spring Boot - Intellij Gradle Multi module
- 멀티모듈 설계 이야기 with Spring, Gradle
'스프링' 카테고리의 다른 글
RequestDto는 왜 기본생성자가 없을 때 에러를 반환할까? (0) | 2023.05.08 |
---|