멀티 모듈 프로젝트 설계 방향

coldrice99·2024년 12월 3일
0
post-thumbnail

1. 멀티 모듈 설계의 목표

  1. 책임 분리:
    • 역할(Role)과 기능에 따라 모듈을 나눠 각자 책임을 명확히 한다.
  2. 코어(Core)의 경량화:
    • 공통 기능만 포함하며, 불필요하게 많은 로직이 몰리지 않도록 제한.
  3. 의존성 관리:
    • 각 모듈이 필요 최소한의 의존성만 가지며 독립성을 유지.
  4. 확장성과 유지보수성:
    • 새로운 기능 추가 및 변경이 용이한 구조.

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 모듈에 의존해 공통 예외 처리 등을 재사용.
  • 다른 모듈의 의존성:
    • API 모듈이 S3-Client를 의존.

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. 의존성 관리

  1. Spring Web은 Core에서만 사용:

    • API 모듈은 Core를 통해 Spring Web 기능을 간접적으로 활용.
    • 다른 모듈(Database, S3-Client 등)은 Spring Web 의존성이 없음.
  2. Core 모듈 중심의 재사용:

    • 예외 처리, 공통 응답 등 모든 API 모듈에서 Core의 기능 재사용.
  3. 독립성 유지:

    • Database 모듈은 HTTP와 독립적으로 동작하며, 테스트와 유지보수에 용이.
    • S3-Client와 Queue-Client는 필요한 API에서만 의존적으로 사용.

5. 설계의 장점

  1. 책임의 명확한 분리:

    • 각 모듈이 자신의 역할에만 집중하도록 설계되어 코드의 가독성과 유지보수성 향상.
  2. 의존성 관리가 용이:

    • Spring Web 의존성을 Core 모듈에 집중시켜 다른 모듈들의 독립성을 보장.
  3. 확장성과 재사용성:

    • 공통 로직(Core)과 기능별 라이브러리(Database, S3-Client 등)를 분리하여 확장에 유리.
  4. 테스트 용이성:

    • HTTP와 독립적인 모듈(Database 등)은 단위 테스트가 쉽고, API 모듈은 Mock을 활용한 테스트 가능.

6. 정리

  • 멀티 모듈 설계는 책임 분리와 의존성 관리가 핵심이다.
  • Core 모듈은 프로젝트의 중심으로, 공통 기능 및 HTTP 관련 로직을 처리하며 다른 모듈이 이를 활용하도록 설계한다.
  • API, Database, S3-Client, Queue-Client 모듈은 각자 독립적으로 동작하며, 필요한 경우 Core 모듈을 통해 공통 기능을 사용한다.
profile
서두르지 않으나 쉬지 않고

0개의 댓글