Multi module 프로젝트 구성
# Back-End/Spring

Multi module 프로젝트 구성

멀티 모듈 프로젝트란?

  • 한 개의 프로젝트를 여러 모듈로 구성한 프로젝트
  • 얻을 수 있는 장점
    • 하나의 시스템에서 중심 도메인을 모듈로 분리
    • 공통된 코드를 여러 곳에서 참조 가능
    • 여러 프로젝트를 한 프로젝트 안에서 관리할 수 있음

 

구성 예제

https://techblog.woowahan.com/2637/

Common 이라는 공통 모듈을 batch 모듈, external-api 모듈, internal-api 모듈 등에서 참조할 수 있다.

따라서 Entity 등 공통적으로 사용되는 부분을 한 곳에서 관리할 수 있게 된다.

 

 

주의할 점

공통 모듈은 다른 모든 모듈에게 영향을 끼치므로 리팩토링 하기 어려워지는 단점이 있다. 공통 모듈이 무거워지는 것을 조심해야 한다.

  • 공통 모듈이 가져야 하는 의존성을 고려하자
  • 특정 모듈에선 불필요한 의존성으로 인해 어플리케이션이 무거워 질 수 있다.
  • 각 어플리케이션(모듈)에 대한 설정은 공통 모듈에 적용하지 않고 분리한다.

 

 

실습

1. 루트 프로젝트 생성 & 설정

Spring Initializer 등을 통해 Gradle 프로젝트를 생성한다.

루프 프로젝트는 하위 모듈을 관리하는 역할만 하기 때문에 src 패키지를 삭제한다.

 

 

2. 모듈 생성

 

 

Root Project를 우클릭 하고 모듈을 생성한다. (상단의 순서대로 진행)

생성한 다음 Root Project의 settings.gradle에 생성한 모듈이 include 되었는지 확인한다.

 

 

3. Root Project의 gradle 설정

buildscript {

   ext {
      springBootVersion = '2.5.11'
   }

   repositories {
      mavenCentral()
   }

   dependencies {
      classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
      classpath "io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE"
   }

}

subprojects {
   apply plugin: 'java'
   apply plugin: 'idea'
   apply plugin: 'org.springframework.boot'
   apply plugin: 'io.spring.dependency-management'

   group = 'com.kingpiggy.study'
   version = '0.0.1-SNAPSHOT'
   sourceCompatibility = '1.8'

   sourceCompatibility = '1.8'
   targetCompatibility = '1.8'
   compileJava.options.encoding = 'UTF-8'

   repositories {
      mavenCentral()
   }

   dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        implementation 'org.springframework.boot:spring-boot-starter-batch'
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
        implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
        implementation 'org.springframework.boot:spring-boot-starter-jdbc'
        implementation 'org.springframework.boot:spring-boot-starter-security'
        implementation 'org.springframework.boot:spring-boot-starter-validation'
        implementation 'org.springframework.boot:spring-boot-starter-web'

        // MySql
        implementation 'mysql:mysql-connector-java'

        // H2 DB
        runtimeOnly 'com.h2database:h2'

        // Lombok
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'

        // Test
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
   }

   test {
      useJUnitPlatform()
   }

   configurations {
      compileOnly {
         extendsFrom annotationProcessor
      }
   }

}

project(':core') {
	bootJar { enabled = false } // core 은 bootJar 로 패키징 할 필요 없음
	jar { enabled = true }

	dependencies {
	}
}

project(':api-server') {
	dependencies {
        implementation project(":core")

        // Excel
        implementation('org.apache.poi:poi-ooxml:3.16') // .xlsx
        implementation('org.apache.poi:poi:3.16') // .xls

        // JWT
        implementation 'io.jsonwebtoken:jjwt-api:0.11.2'
        implementation 'io.jsonwebtoken:jjwt-impl:0.11.2'
        implementation 'io.jsonwebtoken:jjwt-jackson:0.11.2'
	}
}

 

Root Project의 build.gradle을 수정한다.

  • buildscript : gradle 로 task 를 수행할 때에 사용되는 설정(소스 컴파일과는 무관)
  • subprojects : 프로젝트의 모듈에 공통적으로 적용되는 설정

 

4. 모듈 gradle 설정

모듈의 gradle 설정을 적어주는데 두 가지 방법이 있다.

  • Root 프로젝트의 gradle 설정에 project(":{module}")을 추가하는 방법
  • 모듈 별로 gradle 파일을 생성하여 관리하는 방법

 

관리를 용이하게 하기 위해 Root 프로젝트의 build.gradle에서 서브 모듈의 설정을 관리한다.

  • core 모듈, 혹은 공통 모듈은 Entity를 담을 Library로 사용할 것으로, jar 파일로 패키징 할 필요가 없어 설정을 추가한다.
  • 기타 batch 모듈, redis 모듈 등 각 모듈에 필요한 의존성을 dependencies에 추가한다.

 

5. 모듈에서 다른 모듈을 참조

"api-server" 모듈에서 "core" 라는 모듈을 참조하도록 하려 한다.

  • "api-server" 모듈의 gradle 설정 파일의 dependency를 설정한다.
implementation project(":core")

모듈의 개별적인 설정을 적어주는데 두 가지 방법 모두 동일하며 선택한 방법의 dependencies에 포함하려는 module을 implement 해준다.

 

 

참고자료

https://techblog.woowahan.com/2637/

https://velog.io/@soyeon207/스프링-부트-멀티-모듈-프로젝트-만들기

 

728x90