3장 요구를 도메인 모델로 바꾼다
웹서비스의 중심은 페이지가 아니라 상태 변화다. BriefFlow의 상태는 draft, review, needs_evidence, approved다. needs_evidence는 승인 전에 정보 보완이 필요한 fixture 상태다. 고객 문장, 예산, 기한, 연결 채널, 위험, 성공 결과가 하나의 브리프를 이룬다. 상태 전이를 말로 먼저 쓴다.
- 원문을 접수한다.
- 입력 형식과 동의를 검증한다.
- 성공 결과와 위험 신호를 구조화한다.
- 규칙으로 제안 범위와 견적을 계산한다.
- 사람이 원문과 제안을 비교한다.
- 승인 당시의 산출물을 해시로 고정한다.
- 승인된 작업만 실행 대기열로 보낸다.
structureBrief는 네트워크나 화면을 모르는 순수 함수다. 같은 입력과 같은 시각을 주면 같은 판단을 만든다. ID만 무작위이므로 테스트는 ID 형식만 확인한다. 날짜도 함수 인자로 주입해 자정이나 타임존 문제를 재현한다.
const result = structureBrief(input, new Date('2026-08-04T09:00:00+09:00'));
if (!result.ok) return json(res, 422, result);
모델을 먼저 잡으면 API와 화면은 얇은 번역층이 된다. 반대로 화면부터 만들면 중요한 규칙이 클릭 핸들러와 서버 라우트에 흩어진다.