티스토리 뷰

1. 목표

그레들을 이용해서 멀티 모듈 프로젝트 구축하기 

2. 환경  

  • spring boot 2.5.5
  • java 1.8
  • eclipse

3. 프로젝트 구성

이전에 메이븐을 이용한 프로젝트 구성과 동일합니다.

executableJar, executableWar 등 서비스하는 모듈은 컴포넌트라 하고 라이브러리는 서비스 모듈, 공통 모듈이라 명명하겠습니다. 

예제는 두개의 컴포넌트와 두개의 서비스 모듈, 하나의 공통 모듈로  구성하였습니다. 

컴포넌트는 서비스 모듈, 공통 모듈들을 이용할 수 있고 서비스 모듈은 공통 모듈을 이용합니다. 

4. 개발 flow

  • Base 프로젝트 생성 : 전체 모듈을 포함하는 Base 프로젝트입니다.  Spring Starter Project를 생성하여 사용할 것입니다. 
  • 모듈 프로젝트 생성 : base 프로젝트에 직접 디렉토리와 build.gradle, settings를 설정할 것입니다.  
  • 디펜던시 및 빌드 설정

5. Base 프로젝트 생성

gradle로 멀티 모듈 프로젝트를 쉽게 만들려면 Spring Starter Project를 생성하고 수작업으로 고쳐 주는게 좋습니다. 

이렇게 설정하고 뒤에는 아무것도 설정하지 말고 완료하시면 됩니다. 

6. 모듈 프로젝트 생성 

Base Project를 생성하였다면 수작업으로 모듈의 폴더들을 생성해 주면 됩니다. 

위에 이미지 처럼 기본 구조를 만들어 주고 build.gradle, settings.gradle 파일을 만들어 줍니다. 

7. Base Project  설정 

Base Project는 gradle 라이브러리와 실행 파일이 있고 모듈에 대한 설정만 잡아줍니다. 

build.gradle은 제거해 주세요. 보통 Base Project에서 buildscript allprojects subprojects 등을 설정해서 쓰기도 하는데 지금 예제는 각각의 모듈에서 처리하게 할 것입니다. 

build.gradle은 제거하고 settings.gradle 에 모듈 정의합니다. 

rootProject.name = 'eblo'
include 'eblo-common'
include 'eblo-module-notice'
include 'eblo-module-customer'
include 'eblo-component-web'
include 'eblo-component-mobile'

8. 모듈 설정 

모듈 설정은 컴포넌트와 라이브러리에 따라 설정이 달라집니다. 

컴포넌트의 경우에는 실행 가능한 형태로 만들어져야 합니다. Spring Starter Project에서 생성된 것을 그대로 쓰면 됩니다. 

plugins {
	id 'org.springframework.boot' version '2.5.5'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

위쪽에 org.springframework.boot plugin 설정이 메이븐의 <build> 추가해 준 것과 동일한 역할을 한다고 보시면 됩니다. 

    <build>
        <finalName>eblo-component-mobile-${project.version}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

라이브러리의 경우에는 BootJar나 BootWar로 만드는게 아니고 그냥 jar로 만들어야 하니 약간 다릅니다. 

plugins {
    id 'org.springframework.boot' version '2.5.5' apply false
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

plugins에서는 apply false 선언을 해주시고 dependencyManagement를 추가해 주시면 됩니다.

기본적인 설정이 완료 되었다면 gradle refresh를 하면 서브 프로젝트가 생성된 것을 확인할 수 있습니다. 

 

멀티 모듈 프로젝트에서 디펜던시 관련 종속성과 구조를 유지하기 위해 implement 대신 api를 사용하겠습니다. implement와 api 관련해서는 따로 정리가 필요한데 설명을 하자면 길고 일단 api를 사용하는 것으로 설정을 하겠습니다. 

api를 사용하기 위해서는  plugin에 'java' 대신에 'java-library'로 설정을 하면 됩니다. 

 

eblo-common build.gradle 

plugins {
    id 'org.springframework.boot' version '2.5.5' apply false
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java-library'
}

group = 'eblo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/libs-release" }
}

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

dependencies {
    // lombok, test 설정 시작 
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testImplementation group: 'junit', name: 'junit', version: '4.12'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    // lombok, test 설정 시작
}

eblo-module-notice build.gradle 

plugins {
    id 'org.springframework.boot' version '2.5.5' apply false
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java-library'
}

group = 'eblo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/libs-release" }
}

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

dependencies {
    api project(':eblo-common')
    // lombok, test 설정 시작 
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testImplementation group: 'junit', name: 'junit', version: '4.12'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    // lombok, test 설정 시작
}

eblo-component-web build.gradle 

plugins {
    id 'org.springframework.boot' version '2.5.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java-library'
}

group = 'eblo'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
[compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8'

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/libs-release" }
}

dependencies {
    api project(':eblo-module-customer')
    api project(':eblo-module-notice')
    // lombok, test 설정 시작 
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    testImplementation group: 'junit', name: 'junit', version: '4.12'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
    // lombok, test 설정 시작
}

상세 코드는 깃헙을 참고하세요. 깃헙링크

9. 빌드 

프로젝트별 빌드 : [프로젝트:build] 

10. 마무리 

간단하게 구조를 잡고 build.gradle 구성하는 예제를 만들어 보았습니다.

컴포넌트와 라이브러리 모듈 설정 부분과 디펜던시 부분만 신경쓴다면 큰 무리없이 작동할 것입니다. 

멀티 모듈 프로젝트를 구성하는 표준은 없습니다. 다들 다양한 방법으로 구성해서 사용을 하는데 제가 중요하게 생각하는 것은 모듈의 독립성과 확장성, 모듈간의 관계입니다. 또 가능한 스프링에서 가이드하는 형태를 참고했습니다. 

 

11. 참고 

https://spring.io/guides/gs/multi-module/

 

Creating a Multi Module Project

this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team

spring.io

https://docs.spring.io/spring-boot/docs/current/gradle-plugin/reference/htmlsingle/#introduction

 

Spring Boot Gradle Plugin Reference Guide

To manage dependencies in your Spring Boot application, you can either apply the io.spring.dependency-management plugin or use Gradle’s native bom support. The primary benefit of the former is that it offers property-based customization of managed versio

docs.spring.io

https://github.com/kkaok/multi-module-maven-example

 

GitHub - kkaok/multi-module-maven-example

Contribute to kkaok/multi-module-maven-example development by creating an account on GitHub.

github.com

 

댓글
댓글쓰기 폼