노트

상태 패턴

State

설계#pattern · 연결된 개념 5개

쉽게 말하면

상태 패턴은 자판기가 '동전 넣기 전', '동전 넣음', '품절'일 때 같은 버튼에도 다르게 반응하는 것과 같아요. 상태마다 반응을 따로 묶어 두니 메서드마다 '지금 무슨 상태지?'를 따질 필요가 없어요.

비유가 깨지는 곳 상태가 서너 개뿐이고 규칙이 단순하면 판별 유니언과 switch가 더 읽기 쉬워요. 전이 규칙을 상태 객체마다 두면 흐름이 흩어지니, 먼저 상태 기계로 그려 보는 게 좋아요.

객체의 행동이 현재 상태에 따라 달라질 때, 상태마다 별도 객체를 두고 현재 상태 객체에 행동을 맡기는 패턴. 상태별 조건문이 메서드마다 반복되는 문제를 푼다.

interface OrderState { pay(o: Order): void; cancel(o: Order): void }
 
const pending: OrderState = {
  pay: o => { o.state = paid },
  cancel: o => { o.state = cancelled },
}
const paid: OrderState = {
  pay: () => { throw new Error('이미 결제됨') },
  cancel: o => { refund(o); o.state = cancelled },
}
  • 상태가 늘어도 각 상태의 행동이 한 객체에 모여 있어 추가가 쉽다
  • 상태 전이 규칙을 상태 객체에 둘지 컨텍스트에 둘지 일관되게 정한다. 상태 객체에 두면 전이가 여러 곳에 흩어져 전체 흐름이 안 보일 수 있다
  • 상태가 서너 개뿐이고 규칙이 단순하면 판별 유니언과 switch가 더 읽기 쉽다

상태 기계로 보기

주문의 작성 → 결제 → 배송 → 완료/취소처럼 허용되는 전이가 정해져 있다면 유한 상태 기계(Finite State Machine, FSM)로 그려 보는 것이 먼저다. React에서는 useReducer의 리듀서가 "현재 상태 + 액션 → 다음 상태"를 한곳에 모으는 같은 역할을 한다. 불가능한 상태 조합이 타입으로 표현되지 않게 하는 것도 같은 목적이다.

stateDiagram-v2
  state "작성 (pending)" as P
  state "결제 (paid)" as Pd
  state "배송" as S
  state "완료" as Done
  state "취소 (cancelled)" as C
  [*] --> P
  P --> Pd: pay
  P --> C: cancel
  Pd --> C: cancel (환불)
  Pd --> S
  S --> Done
  Done --> [*]
  C --> [*]

전략 패턴과 구조가 같지만, 전략은 바깥에서 골라 끼우고 상태는 객체가 스스로 다음 상태로 넘어간다. 행동 패턴 전체는 행동 패턴.

출처: State — Refactoring.Guru

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • React 상태 갱신

    React는 상태를 직접 고치지 않고 새 값을 setState로 넘겨야 다시 그린다. 이전 값과 Object.is로 비교하므로, 같은 객체를 고친 뒤 넘기면 바뀐 줄 모른다.

  • 커맨드 패턴

    요청이나 작업을 실행 가능한 객체로 포장하는 패턴. 작업을 값처럼 저장·전달·대기열에 넣을 수 있게 되고, 되돌리기 같은 부가 연산을 붙일 수 있다.

  • useActionState와 폼 액션

    React 19에서는 <form action={함수}>에 함수를 바로 넘길 수 있고, useActionState가 그 액션의 대기 상태와 마지막 결과를 한 훅으로 관리한다. useState + onSubmit + 로딩 플래그로 짜던 패턴을 대체한다.

  • Redux 이후의 상태 관리 선택

    한때 React 앱의 기본값이던 Redux는 2025~2026년 기준으로 여러 선택지 중 하나가 됐다. 상태를 종류별로 나눠 각자에 맞는 도구를 고르는 방식이 자리 잡았기 때문이다.

  • 디자인 패턴

    반복해서 나타나는 설계 문제에 대한 검증된 해결 구조와 그 이름. 복사해 쓰는 완성 코드가 아니라 객체들이 협력하는 방식을 설명하는 어휘다. 1994년 이른바 GoF(Gang of Four, 네 명의 저자)의 책 『Design Patterns: Elements of Reusable Object-Oriented Software』가 23개 패턴을 정리하며 널리 퍼졌다.

보기 옵션