
근황
오랜만에 다시 글을 작성하게 되었다.
회사일이 바빠지기도 했고, 영어시험, spring boot 공부, 항해 redis, AI준비 등
다양한 것을 조금씩 준비하다보니 글을 작성할 시간이 부족했다.(사실 쓰려면 썼음)
멀티모듈
데이터 베이스 설계부터 시작했는데. 이 부분은 DB부분에 DB설계하는 부분에 내용을 작성해 놓았다.
우선 멀티 모듈을 설계하기 위해서 선택해야할 것은 두가지였다.
1. domain 별 모듈로 설정.
2. Architecture 별 모듈로 설정.
나는 2번을 골랐다.
이유: 원래 Spring 프로젝트를 할 때 계층별로 묶어서 객체지향적으로 프로젝트를 하는 것을 선호 하기 때문이다.
2번을 실행하면 Architecture구조는 "clean + Layered Architecture" 구조를 사용했다.
마찬가지로 원래 프로젝트를 할 때 이 구조를 선호하기 때문이다.
아키텍쳐 구조
최 상위 계층부터
- presentation:표현계층(controller)
- application:응용계층(facade)
- domain:엔티티계층(entity,service, repository(interface) )
- infrastructure:인프라계층(repository, jpa, mybatis)
로 나누었다.

모듈로 나누면서 느낀점
- 혼자 간단한 프로젝트를 하는데 너무 많은 설정이 필요하다?? 였다. 하지만! 멀티모듈에 대한 감을 익히기 위해 사용하라고 했으니.
장점만 바라보면서 모듈로 나누었다. - 하나의 단일 모듈로 Layered + clean Architecture를 구현했을 때와 비교했을 때 장점은 하나가 있었다. 모듈끼리의 의존성을 명시하지 않으면 의존자체를 할 수 없어서. 실수로 하는 역참조를 방지할 수 있다는 것이다. (즉 개발자의 실수를 줄일 수 있음)
- 아직 멀티 모듈이 처음이라 차차 적용해 나가겠지만, 가장 장점이라고 느낀 것은 이거였고, 설정이 너무 많아서 이것은 초기 비용이 높다는 단점이 느껴졌다.(단순한 개발이라면 단일 모듈, 복잡하고 여러명이 개발한다면 멀티모듈)
- 의존성이 각각 나누어져있다보니깐 , 독립적인 테스트가 가능하고 서로의 오류에 영향을 줄일 수 있다.
아키텍쳐 설명
아키텍쳐는 기본적인 Layered Architecture의 구조는 presentation -> application -> domain -> infra인데 domain 계층에 repository interface를 구현체를 놓아서
presentation -> application -> domain(repository) <- infra(repositoryImpl)의 구조를 만들어서 domain계층을 완전히 분리시키는 방식을 통해서 DIP(의존성 역전)를 사용했다.
결과:
수많은 시행착오가 있었다.

- root모듈과 서브 모듈들에 application.yaml을 따로 설정하는 방법을 몰라서 root모듈에 의존성을 다 모아서 사용했더니, 그냥 단일모듈과 별 다른 차이점이없었다.
해결: 각각 프로퍼티와 의존성을 따로 설정하는 방법을 찾아서 아키텍쳐 구조대로 의존을 명시하여, 해결했다. - query dsl이나 redis , aop 모듈의 위치를 각 계층중 어디에 넣어야될 까 고민을 많이했다.
해결 : 이 글을 나중에 이후에 다루겠다. - infra 계층에만 query dsl에 대한 의존성을 넣고 싶었는데.. entity계층에 jpa entity가 있어서 어려움을 겪었다.
해결 : 이 글도 나중에 이후에 다룸 - 각각 프로퍼티설정
해결: 이건 그냥 시행착오를 겪으면서 맞는 방식을 찾아가는 수 밖에 없다.
멀티모듈 구성하는법
- root 모듈을 만든다.
settings.gradle 파일에 하위의 모듈들을 선언해 준다.
rootProject.name = 'multi'
include 'presentation'
include 'application'
include 'domain'
include 'infrastructure'
2. build.gradle파일에 모듈의 공통된 의존성을 추가해준다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.1' // Spring Boot 플러그인 추가
id 'io.spring.dependency-management' version '1.1.7' // 의존성 관리 플러그인 추가
}
springBoot {
mainClass = 'com.example.Application' // 실제 main 메서드가 있는 클래스 경로
}
allprojects {
group = 'com.example'
version = '1.0.0'
repositories {
mavenCentral()
}
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
}
3. 하위 모듈은 계층 대로 의존할 계층을 build.gradle에 명시만 해주면된다.
ex)
dependencies {
implementation project(':application')
implementation project(':domain')
implementation project(':infrastructure')
implementation 'org.springframework.boot:spring-boot-starter-web'
}
나머지 property 같은 경우에는 각 계층에 필요한 것을 명시해주면 된다.
궁금점 & 더 알아볼 점
아직도 Spring 을 실행하는 Main Method가 presentation 계층인지 application 계층에 있어야하는지 모르겠다.

'Spring > Redis' 카테고리의 다른 글
태태개발일지 - redis (0) | 2025.01.27 |
---|---|
태태개발일지 -REDIS (1) | 2024.11.12 |
Spring redis 총정리 (0) | 2024.05.27 |
태태 개발일지(No sql) (0) | 2023.08.03 |
태태 개발일지 Redis편 (0) | 2023.08.02 |