1. 멀티 모듈 설계의 목표
- 책임 분리:
- 역할(Role)과 기능에 따라 모듈을 나눠 각자 책임을 명확히 한다.
- 코어(Core)의 경량화:
- 공통 기능만 포함하며, 불필요하게 많은 로직이 몰리지 않도록 제한.
- 의존성 관리:
- 각 모듈이 필요 최소한의 의존성만 가지며 독립성을 유지.
- 확장성과 유지보수성:
2. 프로젝트 구조
최종 디렉토리 구조
libs/
├── database/ # 엔티티 및 데이터베이스 관련 모듈
├── s3-client/ # S3 연동 관련 기능
├── queue-client/ # 메시지 큐 연동 관련 기능
├── core/ # 공통 설정 및 HTTP 관련 유틸리티
api/
├── user-api/ # 일반 사용자용 API
├── boss-api/ # 사장님용 API
├── admin-api/ # 관리자용 API
3. 각 모듈의 역할
1) Core 모듈
- 역할:
- 프로젝트 전반에서 사용되는 공통 로직과 설정을 관리.
- HTTP 요청/응답 처리 및 공통 유틸리티 제공.
- 특징:
- Spring Web 의존성을 가지며, HTTP 관련 로직은 여기에서만 처리.
- 공통적인 API 응답 포맷, 예외 처리, 로깅 필터 등을 포함.
- 다른 모듈의 의존성:
- 다른 모듈들이 Core 모듈을 의존해 HTTP 관련 기능을 재사용.
2) Database 모듈
- 역할:
- 데이터베이스와 상호작용하는 로직(엔티티, Repository 등)을 관리.
- 특징:
@Entity
클래스를 정의하며, 데이터베이스와의 통신 책임을 담당.
- Spring Web 의존성을 가지지 않고, HTTP에 독립적으로 동작.
- 다른 모듈의 의존성:
- Core 모듈에 의존해 공통적인 유틸리티를 재사용.
3) S3-Client 모듈
- 역할:
- Amazon S3와의 연동을 처리(파일 업로드/다운로드).
- 특징:
- 공통 S3 유틸리티를 제공하며, API 모듈에서 필요한 경우 의존.
- Core 모듈에 의존해 공통 예외 처리 등을 재사용.
- 다른 모듈의 의존성:
4) Queue-Client 모듈
- 역할:
- 메시지 큐(RabbitMQ, Kafka 등)와의 연동을 처리.
- 특징:
- 메시지 전송/수신 관련 공통 기능 제공.
- Core 모듈에 의존해 공통 로직을 재사용.
- 다른 모듈의 의존성:
- API 모듈이 Queue-Client를 의존.
수정된 내용
5) API 모듈 (User, Boss, Admin)
-
역할:
- 사용자, 사장님, 관리자 역할에 따라 각기 다른 비즈니스 로직과 HTTP 엔드포인트를 제공.
-
특징:
- Core 및 라이브러리 모듈에 의존하면서도, 도메인별 특화된 비즈니스 로직을 작성.
- Core 모듈에서 제공하는 공통 로직을 재사용하되, 필요 시 중복을 허용해 도메인 특성을 반영.
- Spring Web 의존성을 직접 사용하며, 도메인별 요구사항에 맞는 HTTP 처리.
-
다른 모듈의 의존성:
- Core 모듈 및 필요한 라이브러리(S3-Client, Queue-Client 등)에 의존.
4. 의존성 관리
-
Spring Web은 Core에서만 사용:
- API 모듈은 Core를 통해 Spring Web 기능을 간접적으로 활용.
- 다른 모듈(Database, S3-Client 등)은 Spring Web 의존성이 없음.
-
Core 모듈 중심의 재사용:
- 예외 처리, 공통 응답 등 모든 API 모듈에서 Core의 기능 재사용.
-
독립성 유지:
- Database 모듈은 HTTP와 독립적으로 동작하며, 테스트와 유지보수에 용이.
- S3-Client와 Queue-Client는 필요한 API에서만 의존적으로 사용.
5. 설계의 장점
-
책임의 명확한 분리:
- 각 모듈이 자신의 역할에만 집중하도록 설계되어 코드의 가독성과 유지보수성 향상.
-
의존성 관리가 용이:
- Spring Web 의존성을 Core 모듈에 집중시켜 다른 모듈들의 독립성을 보장.
-
확장성과 재사용성:
- 공통 로직(Core)과 기능별 라이브러리(Database, S3-Client 등)를 분리하여 확장에 유리.
-
테스트 용이성:
- HTTP와 독립적인 모듈(Database 등)은 단위 테스트가 쉽고, API 모듈은 Mock을 활용한 테스트 가능.
6. 정리
- 멀티 모듈 설계는 책임 분리와 의존성 관리가 핵심이다.
- Core 모듈은 프로젝트의 중심으로, 공통 기능 및 HTTP 관련 로직을 처리하며 다른 모듈이 이를 활용하도록 설계한다.
- API, Database, S3-Client, Queue-Client 모듈은 각자 독립적으로 동작하며, 필요한 경우 Core 모듈을 통해 공통 기능을 사용한다.