HTTP, 인증, 입력 형식을 command로 번역한다.
도메인 경계는 폴더명이 아니라 규칙이 새는 지점으로 나눈다
DDD에서 중요한 것은 module 이름이 아니라 불변식, 언어, 저장소 의존성이 어디에서 보호되는지다. 도메인 규칙이 외부 모양에 끌려가면 경계가 실패한 것이다.
흐름과 트랜잭션을 조율하고 도메인 규칙 판단은 넘긴다.
상태 전이, 불변식, 업무 언어를 직접 지킨다.
Prisma, TypeORM, 외부 API 모양을 contract 뒤에 숨긴다.
| 판정 축 | A급 신호 | 경계 실패 신호 | 수정 방향 |
|---|---|---|---|
| 언어ubiquitous language | command, event 이름이 업무 표현과 일치 | 같은 “취소”가 주문/결제/정산에서 섞임 | bounded context를 나누고 용어를 고정 |
| 규칙aggregate invariant | aggregate method가 상태 전이를 검증 | service if문이 모든 규칙을 직접 조립 | 규칙을 domain method와 event로 이동 |
| 의존성repository contract | domain 테스트가 DB adapter 없이 가능 | ORM entity 컬럼 변경이 domain을 깨뜨림 | port와 mapper로 외부 shape 차단 |
Controller DTO, Prisma model, 외부 API 응답이 aggregate까지 들어오면 domain layer는 이름뿐이고 변경 비용은 그대로 남는다.
가능하면 도메인 경계가 저장소 세부사항을 막고 있다.
설명되지 않으면 로그와 도메인 이벤트가 섞인 것이다.
기준: NestJS에서 DDD를 적용한다는 말은 계층을 많이 만드는 것이 아니라, 도메인 규칙이 controller, ORM, 외부 API 모양에 오염되지 않도록 책임 경계를 고정한다는 뜻이다.