−이번에는 문서 검토를 예로 든다. 초안은 제출할 수 있고, 검토 중인 문서는 승인하거나 반려할 수 있다고 정하자. 같은 문서라도 현재 상태에 따라 허용되는 요청이 달라진다.
[SVG 다이어그램]
작은 검은 원은 시작 위치다. 여기서는 문서가 Draft에서 시작한다.
둥근 상자는 상태다. Draft·InReview·Published가 각각 초안·검토 중·발행됨을 뜻한다.
화살표는 전이(Transition)다. submit이 오면 Draft에서 InReview로, approve가 오면 InReview에서 Published로 바뀐다. reject(reason)는 초안으로 되돌린다.
전이에는 사건 [조건] / 동작을 적을 수 있다. 예를 들어 submit [contentNotEmpty] / lockEditing()은 “제출 사건이 발생하고 내용이 비어 있지 않으면, 편집을 잠그면서 다음 상태로 간다”는 뜻이다. 필요 없는 조건이나 동작은 생략한다.[각주 6]
상태도는 동작 규칙을 그린 것이고, State 패턴은 상태별 처리를 객체로 나누는 코드 구성 방법이다. 이 상태도를 반드시 State 패턴으로 구현해야 하는 것은 아니다. 작은 모델이라면 enum과 조건문으로도 구현할 수 있다.
+상태 머신은 음악 플레이어로 살펴보자. 정지 상태에서 재생을 누르면 음악이 나오고, 재생 중에 일시정지를 누르면 멈춘 위치를 기억한다. 여기서는 정지·재생·일시정지 세 상태를 두고, 각 버튼을 눌렀을 때 어디로 이동하는지 그린다.
[SVG 다이어그램]
작은 검은 원은 시작 위치를 표시하는데, 이 그림에서는 문서가 Draft에서 시작한다.
둥근 상자는 상태다. Stopped·Playing·Paused가 각각 정지·재생·일시정지를 뜻한다.
화살표는 전이(Transition)다. play를 누르면 Stopped에서 Playing으로, pause를 누르면 Paused로 이동한다. resume은 재생을 이어 가고, stop은 재생 중이거나 일시정지 상태인 플레이어를 Stopped로 돌린다.
전이에는 사건 [조건] / 동작을 적을 수 있다. Stopped에서 Playing으로 가는 화살표에 play [trackLoaded] / startAudio()라고 적으면 “재생 사건이 왔을 때 곡이 준비돼 있으면, 소리를 재생하며 Playing으로 간다”는 뜻이다. 조건과 동작은 필요한 전이에 붙인다.[각주 6]
상태도는 동작 규칙을 그림으로 옮긴 것이고, State 패턴은 상태별 처리를 객체로 나눠 담는 코드 구성 방식이다. 그렇다고 이 상태도를 반드시 State 패턴으로 구현해야 하는 것은 아니고, 모델이 작으면 enum과 조건문으로도 충분하다.