DDD LAYERS

Nest DDD 의존 방향

Entity, Value Object, Repository를 정의로만 나열하면 Nest 코드에서 어디에 무엇을 둬야 하는지 흐려진다. Controller는 요청을 받고 Application Service는 유스케이스를 조율하며, Domain은 invariant를 지키고 Infra는 DB와 외부 시스템을 숨긴다.

외부 입력 controller와 resolver는 요청 변환만 맡고 업무 규칙을 품지 않는다
Application 조율 use case가 repository, domain service, event 발행 순서를 잡는다
Domain 보호 entity와 value object는 ORM, HTTP, queue 세부 구현에서 떨어뜨린다
01

입력 변환

Controller는 DTO와 인증 컨텍스트를 받아 유스케이스 명령으로 변환한다.

업무 규칙을 컨트롤러에 넣지 않는다
02

유스케이스 조율

Application Service는 repository, domain service, event 발행 순서를 조율한다.

트랜잭션 경계도 여기서 자주 잡힌다
03

Domain 검증

Entity와 Value Object는 상태 변경 규칙과 불변식을 스스로 검증한다.

빈 객체에 setter만 있으면 도메인이 약하다
04

Infra 숨기기

ORM entity, HTTP client, message broker 구현은 interface 뒤에 숨긴다.

도메인이 TypeORM decorator를 알 필요는 없다
05

예외 변환

Infra 오류를 application 오류나 도메인 오류로 변환해 외부 응답을 안정화한다.

DB 에러를 그대로 노출하지 않는다
Domain
업무 규칙 중심 돈, 주문, 권한 같은 핵심 규칙과 불변식을 표현한다.
프레임워크 의존을 줄인다
Application
유스케이스 실행 도메인 객체를 불러오고 명령을 수행하고 저장하는 흐름을 담당한다.
정책 순서가 보인다
Infra
기술 구현 DB, queue, 외부 API, cache를 실제 라이브러리로 연결한다.
교체 가능한 adapter로 둔다
Repository
저장소 추상화 도메인이 필요한 조회와 저장 계약만 노출한다.
ORM 쿼리 전체를 새지 않게 한다

계층 확인

의존 방향 Domain 코드가 Nest, TypeORM, HTTP client를 import하지 않는지 확인한다.
불변식 위치 업무 규칙이 controller나 resolver가 아니라 domain 메서드에 있는지 본다.
오류 변환 DB unique 에러가 사용자에게 도메인 오류로 변환되는지 확인한다.