티스토리 뷰

Gradle을 이용한 멀티 모듈

동아리 프로젝트를 시작하며 프로젝트 구조를 어떤식으로 할지 논의 중 멀티 모듈 구조를 사용해 보기로 해였다.

저번 기수때 멀티 모듈 구조를 사용해 봤지만 내가 프로젝트 초기 설정을 하지 않아서 자세히 알아보지는 않았는데 이번에 초기 설정을 하게 되면서 멀티모듈의 필요성과 구조에 대하여 학습하고 정리하기로 하였다.

 

멀티 모듈 이거 왜 쓰는거야?

사실 아직도 완벽하게 이래서 써야하는군! 이라고는 이해하지 못했다. 하지만 구글링을 해보며 어느정도 느낌을 알것 같다..

프로젝트를 사용자와의 접점을 담당하는 서버프로젝트와 DB와의 접점을 담당하는 서버프로젝트로 구분한다면 공통으로 사용되는 클래스들은 어떻게 다룰 것인가를 생각해보자

 

가장 직관적인 방법으로는 복사 & 붙여넣기가 있다

한 프로젝트에서 공통파일을 생성하고 다른 프로젝트에서 그 파일의 코드를 복사하여 쓰는 방식이다.

하지만 연동 되는 프로젝트가 늘어나고 한쪽의 공통파일에 대하여 코드 수정이 일어날 경우 모든 파일들을 수정해야하는 일이 발생한다.

 

이러한 문제를 해결하기 위해 하나의 공통 프로젝트를 두고 (Core 모듈), 이 프로젝트를 여러 프로젝트에서 가져가서 사용가능하게 하기 위한 것이 멀티모듈이다

  • 개발시에는 바로바로 공통 프로젝트 코드를 사용할 수 있어야 한다
  • 빌드시에는 자동으로 공통 프로젝트가 포함되어야 한다

멀티 모듈 프로젝트 생성하기

1. 먼저 intellJ에서 기본 Gradle 프로젝트를 생성한다 - Spring Initialize 사용

이렇게 되면 루트 프로젝트가 생성이 된다 그 후 아래의 모듈들을 생성하여준다

나는 모듈을 총 세가지로 생성하기로 하였다 

  • application - controller / request / response 등 정의
  • domain - domain / service / entity / repository 등 정의
  • core - 공통사용 exception 등 정의

2. 모듈 생성 후 루트 프로젝트의 build.gradle 수정

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

group = 'org.nexters.az'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

test {
    useJUnitPlatform()
}

jar {
    baseName = 'heroku-api'
    version = '0.0.1'
}

def javaProjects = [
        project(':heroku-application'),
        project(':heroku-domain'),
        project(':heroku-core')
]

configure(javaProjects) {
    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    repositories {
        mavenCentral()
    }

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter-web'
        compileOnly 'org.projectlombok:lombok'
        developmentOnly 'org.springframework.boot:spring-boot-devtools'
        annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
    }
}
bootJar { enabled = false}

project(':heroku-application') {
    dependencies {
        compile project(':heroku-core')
        compile project(':heroku-domain')
    }
}

project(':heroku-domain') {
    dependencies {
        compile project(':heroku-core')
    }
}
project(':heroku-core') {
    dependencies {

    }
}
  • JavaProjects = [] & configure(JavaProjects)
    • javaProjects 로 서브 프로젝트(모듈)을 명시한다.
    • configure(JavaProject)로 각 모듈에서 공통으로 사용되는 라이브러리를 관리한다.
  • 맨 아래 프로젝트 모듈에 대한 코드
    • 루트 프로젝트 파일에서 모듈들의 의존성을 쉽게 파악하기 위해 작성한다.

3. domain , core 모듈의 build.gradle 수정

bootJar { enabled = false }
jar { enabled = true }

dependencies {

}
  • application 모듈에서 domain 과 core 모듈을 사용하기 위해선 위의 코드를 작성해주어야 한다
    • jar 파일을 두번 패키징 하는 것을 방지한다

4. setting.gradle

rootProject.name = 'youtugo'
include 'youtugo-application'
include 'youtugo-domain'
include 'youtugo-core'
  • 앞의 순서대로 모듈을 생성하고 루트 src 파일 삭제 후 빌드를 하면 자동으로 setting.gradle에 서브모듈들이 명시된다

마무리

프로젝트 개발환경을 셋팅하며 평소에 왜 멀티모듈을 사용하는지에 대해 조금이나마 이해할 수 있었다

다음에는 프로젝트 배포를 위해 jar 파일의 구조에 대하여 정리해야겠다!

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함