글로벌팀의 백엔드 아키텍처 설계

프로젝트 아키텍처를 객체지향 관점에서 설명하고,

각 레이어에 사용된 주요 디자인 패턴과 SOLID 원칙을 설명합니다.


📐 전체 레이어 구조 (Layered Architecture)

«Interface»Router«Controller» Controller«Service» Service«Repository» Repository(CRUDBase 서브클래스)«DB» DB«Utils» Utils / Helpers호출요청 처리CRUD & 쿼리데이터 영속화로깅 / 예외 처리트랜잭션 관리공통 유틸

1. Interface Layer (Router)

  • 책임
    • HTTP 요청을 엔드포인트로 매핑
  • 사용 패턴
    • Adapter Pattern 외부 REST 인터페이스를 내부 서비스 호출 인터페이스로 “어댑트”
  • SOLID
    • SRP: HTTP 경로 매핑만 담당

2. Controller Layer

  • 책임
    1. 요청 바인딩 (Pydantic DTO)
    2. 인증·인가, 유효성 검사
    3. Service 호출 및 응답 변환
  • 사용 패턴
    • Facade Pattern 복잡한 서비스 호출 흐름을 단일 메서드(액션)로 단순화
  • SOLID
    • SRP, ISP (DTO·Service 인터페이스만 사용)

3. Service Layer

  • 책임
    1. 비즈니스 로직 오케스트레이션
      (예: 주문 생성 → 쿠폰 적용 → 재고 검증 → 결제)
    2. 트랜잭션 경계 설정
    3. 도메인 규칙 적용
  • 사용 패턴
    • Service Layer Pattern (비즈니스 유스케이스 캡슐화)
    • Specification/Builder (필터·페이징 조건 조립)
  • SOLID
    • SRP, DIP (추상 CRUD 인터페이스에 의존), LSP (서브클래스로 대체 가능)

4. Repository Layer (CRUDBase 서브클래스)

  • 책임
    1. 순수 DB 엑세스 (create, get, get_multi, update, remove)
    2. 공통 쿼리 빌드 (filter_and_sort_builder, bulk_update)
    3. 연관 엔티티 부착 (attach_related)
  • 사용 패턴
    • Repository Pattern (도메인 객체 컬렉션 추상화)
    • Generic Repository (제네릭 기반 CRUDBase)
    • Template Method Pattern (CRUDBase가 알고리즘 뼈대, 서브클래스가 세부 구현)
  • SOLID
    • OCP (기본 로직은 변경 없이 서브클래스로 확장), ISP

5. Utility Layer (Utils / Helpers)

  • 책임
    1. 횡단 관심사 처리
      (로깅, 트랜잭션 예외 처리 등)
    2. 모델 직렬화, 날짜 포맷 등 순수 함수
  • 사용 패턴
    • Decorator Pattern
      @handle_db_errors, @transactional 등으로 메서드 전후 로직 분리
  • SOLID
    • SRP, DIP (서비스/리포지토리 레이어에 직접 비즈니스 로직 혼입 금지)

🔑 SOLID 원칙 적용 요약

  1. SRP (단일 책임)

    • 각 레이어·클래스가 한 가지 역할만 갖도록 분리
  2. LSP (리스코프 치환)

    • CRUDBaseCRUDOrder, CRUDUser 등 서브클래스로 자유롭게 대체 가능
  3. OCP (개방-폐쇄)

    • CRUDBase 기본 로직은 그대로 두고, 서브클래싱으로 확장
  4. ISP (인터페이스 분리)

    • 작고 구체적인 인터페이스 제공 (create, get, attach_related 등)
  5. DIP (의존성 역전)

    • 상위 레이어(Service)는 추상(인터페이스)에 의존, 구체 구현은 주입