글로벌팀의 백엔드 아키텍처 설계
프로젝트 아키텍처를 객체지향 관점에서 설명하고,
각 레이어에 사용된 주요 디자인 패턴과 SOLID 원칙을 설명합니다.
📐 전체 레이어 구조 (Layered Architecture)
1. Interface Layer (Router)
- 책임
- HTTP 요청을 엔드포인트로 매핑
- 사용 패턴
- Adapter Pattern 외부 REST 인터페이스를 내부 서비스 호출 인터페이스로 “어댑트”
- SOLID
- SRP: HTTP 경로 매핑만 담당
2. Controller Layer
- 책임
- 요청 바인딩 (Pydantic DTO)
- 인증·인가, 유효성 검사
- Service 호출 및 응답 변환
- 사용 패턴
- Facade Pattern 복잡한 서비스 호출 흐름을 단일 메서드(액션)로 단순화
- SOLID
- SRP, ISP (DTO·Service 인터페이스만 사용)
3. Service Layer
- 책임
- 비즈니스 로직 오케스트레이션
(예: 주문 생성 → 쿠폰 적용 → 재고 검증 → 결제) - 트랜잭션 경계 설정
- 도메인 규칙 적용
- 비즈니스 로직 오케스트레이션
- 사용 패턴
- Service Layer Pattern (비즈니스 유스케이스 캡슐화)
- Specification/Builder (필터·페이징 조건 조립)
- SOLID
- SRP, DIP (추상 CRUD 인터페이스에 의존), LSP (서브클래스로 대체 가능)
4. Repository Layer (CRUDBase 서브클래스)
- 책임
- 순수 DB 엑세스 (
create
,get
,get_multi
,update
,remove
) - 공통 쿼리 빌드 (
filter_and_sort_builder
,bulk_update
) - 연관 엔티티 부착 (
attach_related
)
- 순수 DB 엑세스 (
- 사용 패턴
- Repository Pattern (도메인 객체 컬렉션 추상화)
- Generic Repository (제네릭 기반
CRUDBase
) - Template Method Pattern (
CRUDBase
가 알고리즘 뼈대, 서브클래스가 세부 구현)
- SOLID
- OCP (기본 로직은 변경 없이 서브클래스로 확장), ISP
5. Utility Layer (Utils / Helpers)
- 책임
- 횡단 관심사 처리
(로깅, 트랜잭션 예외 처리 등) - 모델 직렬화, 날짜 포맷 등 순수 함수
- 횡단 관심사 처리
- 사용 패턴
- Decorator Pattern
@handle_db_errors
,@transactional
등으로 메서드 전후 로직 분리
- Decorator Pattern
- SOLID
- SRP, DIP (서비스/리포지토리 레이어에 직접 비즈니스 로직 혼입 금지)
🔑 SOLID 원칙 적용 요약
SRP (단일 책임)
- 각 레이어·클래스가 한 가지 역할만 갖도록 분리
LSP (리스코프 치환)
CRUDBase
→CRUDOrder
,CRUDUser
등 서브클래스로 자유롭게 대체 가능
OCP (개방-폐쇄)
CRUDBase
기본 로직은 그대로 두고, 서브클래싱으로 확장
ISP (인터페이스 분리)
- 작고 구체적인 인터페이스 제공 (
create
,get
,attach_related
등)
- 작고 구체적인 인터페이스 제공 (
DIP (의존성 역전)
- 상위 레이어(Service)는 추상(인터페이스)에 의존, 구체 구현은 주입