멀티 모듈을 사용하면
- 의존성 및 관심사의 분리를 통해 유지보수 및 개발에 있어서 프로젝트 구조의 이해 및 관리가 쉬워진다.
- 그림과 같은 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

최종 프로젝트 구조

[스프링] 멀티 모듈(Multi Module) 개념/예제 feat. Gradle
최근 진행하는 토이 프로젝트의 API 서버는 서로 독립된 프로젝트 2개로 이루어져있었다. 인증 서버 어플리케이션 서버 처음에는 기능 구현 자체에 초점을 맞추고 각자의 프로젝트 크기도 크지
cjw-awdsd.tistory.com
멀티모듈 설계 이야기 with Spring, Gradle | 우아한형제들 기술블로그
{{item.name}} 멀티 모듈 설계 이야기 안녕하세요. 배달의민족 프론트 서버를 개발하고 있는 권용근입니다. 멀티 모듈의 개념을 처음알게 되었을 때부터 현재까지 겪었던 문제점들과 그것을 어떻게
techblog.woowahan.com
'Project > Table_of_Organization_Management_System' 카테고리의 다른 글
NEXUS - 사용해보기 (0) | 2022.06.11 |
---|---|
버전관리 project version - Semantic Versioning (0) | 2022.06.10 |
MySQL SQL 예약어를 확인하자 (0) | 2022.04.22 |
BeanUtils 객체간 필드값을 복사하는 방법 (0) | 2022.04.22 |
@EqualsAndHashCode (0) | 2022.04.20 |