WEBBOOK CHAPTER

NestJS 11, 시작부터 런칭까지: 28장. Dispatch 상태 기계를 코드로 고정한다

28장. Dispatch 상태 기계를 코드로 고정한다

status를 DTO에서 받아 그대로 update하면 기사·고객·운영자가 금지된 전이를 만들 수 있다. Dispatch.assign, startRoute, arrive, complete, cancel command는 현재 상태, actor, ownership, 시간, 필수 증거를 검사한다. 상태 event에는 from/to, actor, occurredAt, reason, request id를 남긴다.

같은 요청이 두 기사에게 배정되지 않도록 DB의 request unique와 조건부 update를 사용한다. 후보 검색은 stale할 수 있으므로 확정 transaction에서 technician availability와 request state를 다시 본다. 충돌한 worker는 다른 request를 찾거나 명시적 lost-race로 끝내며 기존 배정을 덮지 않는다.

단위 테스트는 REQUESTED→MATCHING→ASSIGNED 정상 경로 외에 canceled 배정, 다른 technician의 arrived, 완료 뒤 취소, 미래 시각, 같은 command 반복을 검증한다. clock과 id generator를 provider token으로 주입해 재현한다. Controller는 domain 결과를 HTTP로 바꿀 뿐 규칙을 복제하지 않는다.