클린 아키텍처(Clean Architecture)는 Robert C. Martin이 제안한 레이어드 아키텍처 패턴이다. 비즈니스 로직을 중심에 두고, 의존성은 항상 안쪽(비즈니스 로직)을 향해야 한다는 의존성 규칙(Dependency Rule)을 핵심으로 한다.
레이어 구조
┌────────────────────────┐
│ 외부 인터페이스 │ ← DB, UI, Web, API
│ ┌──────────────────┐ │
│ │ 인터페이스 어댑터 │ │ ← Controllers, Gateways
│ │ ┌────────────┐ │ │
│ │ │ 유즈케이스 │ │ │ ← 앱 비즈니스 규칙
│ │ │ ┌──────┐ │ │ │
│ │ │ │엔티티 │ │ │ │ ← 기업 비즈니스 규칙
│ │ │ └──────┘ │ │ │
│ │ └────────────┘ │ │
│ └──────────────────┘ │
└────────────────────────┘
의존성 규칙: 바깥→안쪽 방향으로만
각 레이어 역할
| 레이어 | 내용 | 변경 이유 |
|---|
| 엔티티 | 핵심 비즈니스 규칙 | 비즈니스 정책 변경 |
| 유즈케이스 | 앱 특정 비즈니스 로직 | 앱 기능 변경 |
| 인터페이스 어댑터 | 데이터 변환 | 입출력 형식 변경 |
| 외부 인터페이스 | 프레임워크, DB | 기술 스택 변경 |
유즈케이스 구현 예시
python
# 유즈케이스 (비즈니스 로직)
class PlaceOrderUseCase:
def __init__(self, order_repo: OrderRepository,
payment_gateway: PaymentGateway,
notifier: Notifier):
self.order_repo = order_repo
self.payment = payment_gateway
self.notifier = notifier
def execute(self, request: PlaceOrderRequest) -> PlaceOrderResponse:
# 비즈니스 규칙 (DB/UI를 알지 못함)
order = Order.create(request.user_id, request.items)
order.validate()
self.payment.charge(order.total)
self.order_repo.save(order)
self.notifier.notify_order_placed(order)
return PlaceOrderResponse(order.id)
관련 개념
참고문헌
- •Martin, R.C. (2017). Clean Architecture: A Craftsman's Guide