해당 글은 Intellij에서 Spring Boot 프로젝트 멀티 모듈로 구성하는 방법에 대하여 정리한 글입니다.
그 전에, 멀티 모듈이 무엇인지 잠깐 정리하고 가볼까요?
모듈이란?
모듈은 패키지의 상위 개념으로 연관된 부분을 하나로 묶은 집합입니다.
=> 간단히 말하여 관계성 있는 코드들의 집합이라고 정리할 수 있습니다.
모듈은 모듈 자체로 재사용될 수 있어야 하고, 독립적으로 배포가 가능한 하나의 단위라고 말할 수 있습니다.
자연스럽게 멀티 모듈이 무엇인지도 이해할 수 있는데, 이런 모듈들을 사용하여 프로젝트를 구성하는 것을 멀티 모듈이라고 합니다.
하나의 프로젝트를 각자의 역할과 책임으로 분리해 모듈화하여 구성한 것으로, 서로 독립적이면서도 상호 연결되는 특징을 가집니다.
그렇다면 왜 멀티 모듈을 사용할까요?
멀티 모듈을 사용하는 이유에는 여러가지가 있지만, 제가 생각하는 가장 큰 이유는 독립성입니다.
프로젝트에 독립성이 없을 경우 많은 문제들이 생깁니다.
독립성은 계층 간에도 존재해야 하고, 관심사 간에도 존재해야 하고, 기능 간에도 존재해야 해요.
만약 독립성이 없다면, 코드의 변경의 파급 효과가 상관 없는 계층이나 기능까지 미치게 되고, 유지보수가 어려워지게 됩니다.
객체지향적으로 봤을 땐 '단일 책임 원칙'을 위반하게 되죠.
👉 독립성이 없다면?
1. 테스트가 어려워집니다.
단위 테스트를 하려해도 데이터베이스나 외부 API까지 함께 테스트해야하는 상황이 발생해요. 모든 코드가 다 얽혀있으니까요.
2. 유지보수가 어려워집니다.
관심사가 뒤섞여있기때문에 특정 기능을 확장하려면 많은 코드들을 확인해야합니다. 그리고 변경이 어디까지 영향을 미칠지 모르기때문에 코드 변경이 두려워져요. 이건 아주아주 심각한 문제입니다....
3. 기술 변경이 어렵습니다.
아래에도 나올 이야기지만, RDB에서 NoSQL로 변경하고 싶어져도 도메인 로직까지 모두 DB에 의존하고 있을 경우 전환이 어렵습니다.
그리고 멀티 모듈은 이런 독립성을 강제적으로 지키게 해주는 좋은 방법이에요.
처음에는 독립성을 지켜야 한다는 말이 와닿지 않을 수도 있어요. 관심사의 분리가 뭔지도 정확히 모르겠고요.
그러나 프로젝트를 어느정도 진행하고 책임에 관한 이해가 생기면 언젠가 마음 속에서 각 계층/관심사간의 의존을 끊어내고 싶다는 생각이 자라나게 될 거예요.
그 때가 되면 둘은 함께 해서는 안 될 것처럼 보이고 rdb나 infra, 외부 API 같이 외부에 종속되는 코드들은 당장이라도 대체될 것처럼 불안해보입니다. 갑자기 팀장님이 "우리 database를 이전하기로 했다. 이제 rdb말고 nosql db 쓸 거야!"라고 외칠 것 같달까요.
그리고 멀티 모듈은, 그런 불안함을 잠재워줍니다. (새근새근)
모듈화하고 독립성을 가져감으로써, 언제든지 서로를 교체할 수 있는 관계가 됩니다.
이는 더 단단한 프로젝트를 만드는 데 도움이 되는데, 위에서 말했던 '독립성이 지켜지지 않는 프로젝트'의 단점이 그대로 장점이 되기 때문입니다.
1. 테스트가 쉬워집니다.
2. 유지보수와 기능 변경이 쉬워집니다.
3. 기술 변경의 두려움이 줄어들게 됩니다.
그리고 하나의 장점이 더 있는데, 모듈화를 하면 '누구든지' 해당 모듈을 사용할 수 있게 된다는 것입니다. 모듈은 어디에도 종속되지 않음으로 어디에서나 사용될 수 있습니다.
즉,
1) 멀티 모듈 프로젝트는 서로를 강제적으로 독립하게 함으로 의존성을 제거한다.
2) 모듈화를 하면 중복이 제거되고 어디서든 모듈을 가져다 사용할 수 있다.
DDD에서 많이 사용되는 멀티 모듈
멀티 모듈은 주로 DDD 패턴에서 많이 사용합니다.
DDD는 도메인 주도 설계로 도메인, 인프라, 애플리케이션, 인터페이스 계층을 명확히 분리하는 것이 핵심이고, 이 분리를 코드로 가장 확실히 보여줄 수 있는 것이 멀티 모듈이기 때문입니다.
하지만 저는 DDD를 사용하지 않더라도 busniss 로직과 infra 로직 정도는 분리하여 멀티 모듈로 구성하는 것이 좋다고 생각하는 편이긴 합니다. 의존성 역전을 적용하여 businiss 로직에서 infra의 의존을 완전히 끊어버리는 장점도 생기게 되고요.
각 프로젝트에 잘 맞는 방법을 사용해 구현하면 좋을 것 같습니다.
💡 모듈을 이야기 할 때 나오는 개념 중 '바운디드 컨텍스트(Bounded Context)'라는 개념이 있습니다. 이는 도메인 주도 설계에서 처음 소개된 개념입니다.
바운디드 컨텍스트는 하나의 컨텍스트 내에서만 특정 모델과 용어를 사용하도록 함으로써 각 컨텍스트가 독립적으로 관리될 수 있도록 하는 개념입니다. 멀티 모듈 프로젝트를 구성할 때, 바운디드 컨텍스트를 고려하여 구성하면 좋다고 합니다.
그러면 아래부터 인텔리제이로 멀티 모듈 프로젝트 구성하는 방법을 정리해보겠습니다.
Intellij에서 멀티 모듈 프로젝트 구성하기: setting ⚙️
저는 아래와같이 구성할 예정입니다.
- root project
- api
- domain
- infra-rdb
우선 모듈들이 들어갈 루트 프로젝트를 생성해주어야 합니다.
1. 루트 프로젝트 생성
파일 -> 새로 만들기 -> 새 프로젝트 생성
Java 버전을 원하는 버전으로 설정해줍니다.
💡 그룹과 패키지이름 설정 방법
kr.co.motimo는 motimo.co.kr이라는 도메인을 가진 프로젝트라는 뜻입니다.
저희는 아직 팀명과 회사명이 없어서 그대로 co를 작성했어요.
개인 프로젝트라면 site.mysite.project / me.name.project 등도 자유롭게 사용해도 됩니다.
다음 버튼을 눌러 스프링부트 버전과, Dependency를 설정해줄 수 있어요.
Dependency는 모든 모듈에 공통으로 들어갈 것을 추가해줍니다.
건너뛰어도 나중에 설치할 수 있습니다.
2. 원하는 모듈 생성
루트 프로젝트의 src 폴더를 제거한 후 모듈을 만들어줄 차례입니다.
루트 프로젝트 -> 새로 만들기 -> 모듈
루트 프로젝트와 똑같은 방식으로 모듈에서도 모듈 명과 Java 버전, Spring Boot 버전와 Dependency를 설정해줍니다.
api의 경우 Web 종속성을 추가해주었고, rdb module의 경우 JPA와 MySQL Driver을 추가해주었습니다.
짠~ 그러면 루트 프로젝트 아래에 추가한 모듈이 나오게 됩니다.
모듈은 build.gradle 말고 필요가 없기 때문에 나머지 필요 없는 파일들을 모두 정리해줍니다.
3. 루트 프로젝트에 하위 모듈 임포트
루트 프로젝트 -> settings.gradle
루트 프로젝트에 하위 모듈이 있다고 알려줍니다. 추가한 모든 하위 모듈을 inclue 해주면 됩니다.
우측 코끼리 모양 Gradle 탭을 열면, 추가한 루트 프로젝트와 모듈들이 보입니다.
루트 프로젝트 Gradle을 우클릭 하여 Gradle 종속성 새로고침을 눌러주면, 루트 프로젝트 아래에 모듈이 들어가게 됩니다.
그 후 밖에 있던 모듈 Gradle을 연결 해제 시켜줍니다. (루트 프로젝트 안에 들어갔기 때문에 필요 없음.)
간단한 과정을 거쳐서 멀티 모듈 프로젝트를 생성해보았습니다.
멀티 모듈 구성 무척 쉽고 빠르게 가능하니까 프로젝트 시 한 번 도전해보셔도.... 🤓
그럼 오늘도 읽어주셔서 감사합니다.
'Spring' 카테고리의 다른 글
Seed를 사용하여 Pagenation + Random에서 중복 없이 데이터 가져오는 방법 | ORDERBY RANDOM PostgreSQL seed (2) | 2025.03.16 |
---|---|
Spring Boot로 OAuth 구현하기 01: OAuth 2.0란? OAuth 완벽 정리 (0) | 2025.02.16 |