본문 바로가기

Project/Table_of_Organization_Management_System

Gradle Multi-Module구성하기

728x90

멀티 모듈을 사용하면

  • 의존성 및 관심사의 분리를 통해 유지보수 및 개발에 있어서 프로젝트 구조의 이해 및 관리가 쉬워진다.
  • 그림과 같은 Layered Architecture 설계가 가능해진다.

 

Layered Architecture 의 핵심 원칙

  • 같은 계층, 아래 계층 요소에만 의존성을 가지고 상위계층에는 의존성이 없어야 합니다.

 

  • User Interface Layer : Front-End
    • 사용자에게 정보를 보여주고, 사용자의 명령을 해석하는 일을 책임집니다.
  • Application Layer
    • 소프트웨어가 수행할 작업을 정의하고, 도메인 객체가 문제를 해결하게 합니다.
    • 업무규칙이나 지식이 포함되지 않으며 오직, 작업을 조정하고 아래 계층의 도메인에 작업을 위임합니다.
    • 업무상황을 반영하는 상태는 없지만, 사용자나 프로그램의 작업상황에 대한 진행상황을 반영하는 상태는 가질 수 있습니다.
  • Domain Layer
    • 업무개념과 업무상황에 관한 정보, 업무 규칙을 표현하는 일을 책임집니다.
    • 업무상황을 반영하는 상태를 제어하고 사용합니다.
    • 상태저장과 관련된 기술적인 부분은 Infrastructure에 위임합니다.
  • Infrastructure Layer
    • 상위계층을 지원하는 기술적 기능을 제공합니다.
    • 어플리케이션에 대한 메시지 전송, 도메인 영속화, UI에 위젯을 그리는 등 작업을 합니다.

 

intellij 를 활용해 쉽고 빠르게 초기 멀티 모듈 프로젝트를 만들어보자

 

먼저 프로젝트를 빠르게 구성하기위해 spring initializr 를 통해 lombok dependencies 를 걸어 프로젝트를 구성하자

 

 

프로젝트를 구성하고 나면 build.gradle 파일은 아래와 같은 코드가 들어가 있을 것이다.

 

 

여기에 기본적인 설정을 하위 프로젝트에서 전부 사용할 수 있게 할 것이다.

subprojects { } 를 활용하면 하위 프로젝트에 주입이 가능하다. 

 

또한 바꿔줘야 하는 것이 있는데 plugins 를 통한 선언을 buildscript 를 통해 Cross project configuration 해줘야 한다.

그러기위해 다음과 같이 변경하면 된다.

이때 gradle 은 위에서부터 코드를 읽기에 

sourceCompatibility = '11' 부분을 plugin 밑에 선언해줘야한다.

 

buildscript {
    ext {
        springBootVersion = '2.6.7'
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

subprojects {
    group = 'com.example'
    version = '0.0.1-SNAPSHOT'

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

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

    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }

    repositories {
        mavenCentral()
    }

    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }

    tasks.named('test') {
        useJUnitPlatform()
    }

}

 

그러면 이제 다른 모듈을 추가해보자

 

 

gradle 를 선택해 모듈을 추가해주면된다. 추가 후 편의상 초반 모듈 셋팅을 spring initializr 를 통해 했기에 최상단에 있는 src 폴더를 삭제해주고 새로 만든 모듈에 @SpringBootApplication 어노테이션이 존재하는 구조로 스프링부트를 실행가능하게 패키지를 만들어준다. 

또한 모듈을 추가했다면 settings.gradle 에 제대로 include 되었는지 확인해야한다.

 

settings.gradle

 

 

최종 프로젝트 구조

 

 

참고할만한 블로그1

 

[스프링] 멀티 모듈(Multi Module) 개념/예제 feat. Gradle

최근 진행하는 토이 프로젝트의 API 서버는 서로 독립된 프로젝트 2개로 이루어져있었다. 인증 서버 어플리케이션 서버 처음에는 기능 구현 자체에 초점을 맞추고 각자의 프로젝트 크기도 크지

cjw-awdsd.tistory.com

참고할만한 블로그2

 

멀티모듈 설계 이야기 with Spring, Gradle | 우아한형제들 기술블로그

{{item.name}} 멀티 모듈 설계 이야기 안녕하세요. 배달의민족 프론트 서버를 개발하고 있는 권용근입니다. 멀티 모듈의 개념을 처음알게 되었을 때부터 현재까지 겪었던 문제점들과 그것을 어떻게

techblog.woowahan.com

maven 멀티프로젝트 참고

 

728x90