하나의 리포지토리/애플리케이션 내부에 명확한 경계와 의존 방향을 만든 구조
멀티 모듈은 하나의 빌드 단위(Gradle/Maven) 아래에 여러 개의 모듈(subproject)을 두고, 각 모듈이 역할과 의존 관계를 명확히 갖도록 설계한 프로젝트 형태입니다. 마치 레고 블록으로 거대한 성을 만드는 것과 비슷합니다. 성 전체를 한 덩어리로 만드는 게 아니라, 성벽, 탑, 문 등 기능별로 작은 블록을 조립해 합치는 것으로 생각하면 이해가 쉬울 것 같습니다.
빌드 속도 향상 ⚡️
멀티모듈의 가장 큰 장점 중 하나는 바로 빌드 속도 개선입니다. 전체 프로젝트를 빌드하는 대신, 변경된 모듈과 그에 의존하는 모듈만 다시 빌드하기 때문입니다. Gradle의 캐싱 기능과 결합되면 그 효과는 더욱 극대화됩니다.
코드의 재사용성 및 유지보수 용이성 🛠️
공통 기능을 core나 shared 같은 모듈로 분리해두면, 여러 기능 모듈에서 쉽게 가져다 쓸 수 있습니다. 똑같은 코드를 여기저기 복사-붙여넣기 할 필요가 없어집니다. 또한, 기능별로 코드가 명확하게 분리되어 있어 특정 기능을 수정하거나 개선할 때 다른 곳에 미칠 영향을 최소화할 수 있습니다.
명확한 책임 분리 (SoC) 🧑💻
각 모듈은 자신만의 명확한 역할과 책임을 가집니다. '로그인' 기능에 문제가 생겼다면? feature_login 모듈만 살펴보면 됩니다. 이렇게 책임 소재가 분명해지면 코드의 이해도가 높아지고, 여러 개발자가 협업할 때 발생할 수 있는 충돌(Conflict)을 줄일 수 있습니다. 각자 자신의 구역(모듈)에 집중하며 효율적으로 작업할 수 있게 됩니다.
초기 설정의 복잡함 🌀
처음 프로젝트를 구성할 때 모듈 간의 의존성을 설정하고 Gradle 스크립트를 관리하는 것이 다소 복잡하게 느껴질 수 있습니다.
관리 포인트 증가 🤔
모듈이 많아질수록 관리해야 할 build.gradle 파일도 늘어나게 됩니다. 라이브러리 버전을 통일하는 등의 관리에 신경 써야 합니다.
모듈 간 통신 📡
모듈 간의 통신을 위한 명확한 규칙(인터페이스 정의 등)이 없다면, 오히려 더 복잡한 의존성 지옥에 빠질 수도 있습니다.
우리 프로젝트의 핵심 도메인은 다음과 같습니다.
Forecast (예보): 날씨 예보 데이터와 관련된 핵심 도메인Mountain (산): 산의 정보, 등산 코스와 관련된 핵심 도메인User (사용자): 사용자 정보, 인증 등과 관련된 도메인Report (리포트): 사용자가 생성하는 산행 리포트 관련 도메인그리고 우리 프로젝트는 2개의 애플리케이션이 동작합니다.
api-server : 사용자 요청을 받아 날씨 예보, 사용자 정보, 리포트 데이터 등을 제공하는 실시간 서버입니다.batch-server : 주기적으로 초단기, 단기, 산악 날씨 예보 api를 호출하여 날씨 데이터를 수집하고 가공하여 데이터베이스에 저장하는 배치 서버입니다.여기서 중요한 점은, 각 서버가 필요로 하는 도메인이 달랐다는 것입니다.
api-server 는 Forecast, Mountain, User, Report 네 가지 도메인 모두를 사용합니다.batch-server 는 오직 날씨 데이터를 다루므로 Forecast , Mountain 도메인만 필요합니다.단일 모듈 구조에서는 batch-server가 전혀 사용하지 않는 User와 Report 도메인의 코드까지 모두 포함하게 됩니다. 이는 다음과 같은 비효율을 낳았습니다.
batch-server는 User 도메인의 작은 코드 변경만으로도 전체를 다시 빌드하고 배포해야 했습니다. 이는 안정성을 해치고 배포 리스크를 높이는 원인이었습니다.배포·릴리스 리스크 급감
batch-server는 domain-forecast, domain-mountain만 의존하도록 고정 → user-domain, report-domain의 변경이 batch-server의 CD 동작에 영향을 미치지 않음.
빌드·테스트 체감 속도 향상
변경 모듈만 빌드/테스트
기능 추가/확장 속도 상승
플러그인식 기능 연동: 기상/산악 API 클라이언트를 infrastructure-module:*로 분리 → 새로운 공급자를 추가하고 싶은 경우, 새로운 모듈을 생성하는 것으로 기존 모듈에 영향 없이 쉽게 기능 추가/확장이 가능함.
도메인 수평 확장 용이: ‘전국 산 확장’ 시 domain-mountain만 확장하고, batch/api는 인터페이스 계약만 유지하면 됨.