State Pattern

객체의 내부 상태가 변경될 때 객체의 행동이 변경되도록 하는 행동 디자인 패턴
상태별 동작을 별도의 클래스로 분리하고, 현재 상태를 나타내는 객체에게 행동을 위임하는 것

특징

사용사례

장점

단점

주의사항 및 고려사항

예시

Python

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
from abc import ABC, abstractmethod

# State 인터페이스
class MediaPlayerState(ABC):
    @abstractmethod
    def play(self, player) -> None:
        pass
    
    @abstractmethod
    def pause(self, player) -> None:
        pass
    
    @abstractmethod
    def stop(self, player) -> None:
        pass
    
    @abstractmethod
    def get_state_name(self) -> str:
        pass

# 구체적인 State 클래스들
class PlayingState(MediaPlayerState):
    def play(self, player) -> None:
        print("이미 재생 중입니다.")
    
    def pause(self, player) -> None:
        print("재생을 일시정지합니다.")
        player.change_state(PausedState())
    
    def stop(self, player) -> None:
        print("재생을 중지합니다.")
        player.change_state(StoppedState())
    
    def get_state_name(self) -> str:
        return "재생 중"

class PausedState(MediaPlayerState):
    def play(self, player) -> None:
        print("재생을 재개합니다.")
        player.change_state(PlayingState())
    
    def pause(self, player) -> None:
        print("이미 일시정지 상태입니다.")
    
    def stop(self, player) -> None:
        print("재생을 중지합니다.")
        player.change_state(StoppedState())
    
    def get_state_name(self) -> str:
        return "일시정지"

class StoppedState(MediaPlayerState):
    def play(self, player) -> None:
        print("재생을 시작합니다.")
        player.change_state(PlayingState())
    
    def pause(self, player) -> None:
        print("중지 상태에서는 일시정지할 수 없습니다.")
    
    def stop(self, player) -> None:
        print("이미 중지 상태입니다.")
    
    def get_state_name(self) -> str:
        return "중지됨"

# Context 클래스
class MediaPlayer:
    def __init__(self):
        # 초기 상태는 중지 상태
        self._state = StoppedState()
        print(f"미디어 플레이어가 {self._state.get_state_name()} 상태로 시작됩니다.")
    
    def change_state(self, state: MediaPlayerState) -> None:
        self._state = state
        print(f"상태가 {self._state.get_state_name()}(으)로 변경되었습니다.")
    
    def play(self) -> None:
        self._state.play(self)
    
    def pause(self) -> None:
        self._state.pause(self)
    
    def stop(self) -> None:
        self._state.stop(self)

# 사용 예시
def main():
    player = MediaPlayer()
    
    # 재생 시작
    player.play()  # 중지 -> 재생
    
    # 일시정지
    player.pause()  # 재생 -> 일시정지
    
    # 재생 재개
    player.play()  # 일시정지 -> 재생
    
    # 중지
    player.stop()  # 재생 -> 중지
    
    # 일시정지 시도 (중지 상태에서는 불가능)
    player.pause()

if __name__ == "__main__":
    main()

Javascript

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// State 인터페이스
interface OrderState {
    processPayment(order: Order): void;
    shipOrder(order: Order): void;
    cancelOrder(order: Order): void;
    getStateName(): string;
}

// 구체적인 State 클래스들
class PendingState implements OrderState {
    processPayment(order: Order): void {
        console.log("결제를 진행합니다.");
        order.changeState(new PaidState());
    }

    shipOrder(order: Order): void {
        console.log("결제가 필요합니다. 배송을 시작할 수 없습니다.");
    }

    cancelOrder(order: Order): void {
        console.log("주문이 취소되었습니다.");
        order.changeState(new CancelledState());
    }

    getStateName(): string {
        return "결제 대기";
    }
}

class PaidState implements OrderState {
    processPayment(order: Order): void {
        console.log("이미 결제가 완료되었습니다.");
    }

    shipOrder(order: Order): void {
        console.log("배송을 시작합니다.");
        order.changeState(new ShippedState());
    }

    cancelOrder(order: Order): void {
        console.log("결제가 환불되었습니다. 주문이 취소되었습니다.");
        order.changeState(new CancelledState());
    }

    getStateName(): string {
        return "결제 완료";
    }
}

class ShippedState implements OrderState {
    processPayment(order: Order): void {
        console.log("이미 결제가 완료되었습니다.");
    }

    shipOrder(order: Order): void {
        console.log("이미 배송 중입니다.");
    }

    cancelOrder(order: Order): void {
        console.log("배송이 시작된 주문은 취소할 수 없습니다.");
    }

    getStateName(): string {
        return "배송 중";
    }
}

class CancelledState implements OrderState {
    processPayment(order: Order): void {
        console.log("취소된 주문은 결제할 수 없습니다.");
    }

    shipOrder(order: Order): void {
        console.log("취소된 주문은 배송할 수 없습니다.");
    }

    cancelOrder(order: Order): void {
        console.log("이미 취소된 주문입니다.");
    }

    getStateName(): string {
        return "주문 취소";
    }
}

// Context 클래스
class Order {
    private state: OrderState;
    private readonly orderId: string;

    constructor(orderId: string) {
        this.orderId = orderId;
        this.state = new PendingState();
        console.log(`주문 ${this.orderId}${this.state.getStateName()} 상태로 생성되었습니다.`);
    }

    public changeState(state: OrderState): void {
        this.state = state;
        console.log(`주문 ${this.orderId}${this.state.getStateName()} 상태로 변경되었습니다.`);
    }

    public processPayment(): void {
        this.state.processPayment(this);
    }

    public shipOrder(): void {
        this.state.shipOrder(this);
    }

    public cancelOrder(): void {
        this.state.cancelOrder(this);
    }
}

// 사용 예시
function main() {
    const order = new Order("ORD-2024-001");

    // 정상적인 주문 프로세스
    console.log("\n=== 정상적인 주문 프로세스 ===");
    order.processPayment();  // 결제 대기 -> 결제 완료
    order.shipOrder();       // 결제 완료 -> 배송 중

    // 취소된 주문 시나리오
    console.log("\n=== 취소된 주문 시나리오 ===");
    const cancelledOrder = new Order("ORD-2024-002");
    cancelledOrder.cancelOrder();  // 결제 대기 -> 취소됨
    cancelledOrder.processPayment();  // 결제 시도 (실패)
    cancelledOrder.shipOrder();       // 배송 시도 (실패)
}

main();

용어 정리

용어설명

참고 및 출처


1. 주제의 분류가 적절한지에 대한 조사

State Pattern(상태 패턴) 은 “Computer Science and Engineering > Software Design and Architecture > Software Design Patterns > GoF > Behavioral Design Patterns” 분류에 정확히 부합합니다. GoF(Gang of Four) 에서 정의한 23 가지 디자인 패턴 중 하나로, 객체의 상태 변화에 따른 동작 변경을 다루는 대표적인 행동 (Behavioral) 패턴입니다 [1][7][14].


2. 200 자 요약

State Pattern 은 객체의 내부 상태에 따라 동작이 달라지도록 하며, 각 상태별 동작을 별도의 클래스로 분리해 관리합니다. 조건문 없이 객체가 상태에 따라 행동을 바꿀 수 있어 코드의 유지보수성과 확장성이 높아집니다. 대표적으로 자판기, 트래픽 신호등, 워크플로우 등에서 활용됩니다 [1][4][6].


3. 250 자 개요

State Pattern 은 객체의 행동이 내부 상태에 따라 달라지는 경우, 상태별 동작을 별도의 클래스로 캡슐화하여 관리하는 행동 패턴입니다. Context 객체는 현재 상태를 참조하며, 모든 상태 관련 작업을 해당 상태 객체에 위임합니다. 이를 통해 조건문 (if/switch) 없이 상태 전이에 따른 행동 변경이 가능해지고, 새로운 상태 추가나 기존 상태 변경이 용이해집니다. 주로 복잡한 상태 전이와 다양한 상태별 동작이 필요한 시스템에서 활용됩니다 [1][4][5][6][12][14].


핵심 개념


주요 내용 정리

패턴 이름과 분류

항목내용
패턴 이름State Pattern (상태 패턴)
분류GoF 행동 (Behavioral) 패턴

의도 (Intent)

객체의 내부 상태에 따라 행동을 변경할 수 있도록 하여, 객체가 마치 클래스를 바꾼 것처럼 보이게 한다 [1][4][14].


다른 이름 (Also Known As)


동기 (Motivation / Forces)


적용 가능성 (Applicability)


구조 및 아키텍처

구조 다이어그램

1
2
3
4
5
6
7
8
9
+-----------------+        +-------------------+
|    Context      ||     State         |
+-----------------+        +-------------------+
        |                          ^
        |                          |
        v                    +-------------------+
+-----------------+          | ConcreteStateA    |
| ConcreteStateB  |<---------+-------------------+
+-----------------+

구성 요소 및 역할

구성 요소기능 및 역할
Context현재 상태 (State) 를 참조, 상태 관련 작업을 상태 객체에 위임
State상태별 동작을 정의하는 인터페이스/추상 클래스
ConcreteState각 상태별 구체 동작 및 상태 전이 로직 구현

필수/선택 구성요소

구분구성 요소기능 및 특징
필수Context현재 상태 객체 참조, 상태별 동작 위임
필수State상태별 동작 정의 인터페이스/추상 클래스
필수ConcreteState상태별 동작 및 전이 구현, 필요시 Context 참조
선택상태 전이 테이블상태 전이 규칙을 별도 테이블로 관리 (복잡한 전이 시)

주요 원리 및 작동 원리

  1. Context 는 현재 상태 (State) 를 참조
  2. 클라이언트가 Context 의 메서드 호출 시, Context 는 해당 작업을 현재 상태 객체에 위임
  3. 상태 객체는 필요에 따라 Context 의 상태를 다른 상태로 전이
  4. 각 상태별로 동작과 전이 규칙을 캡슐화

작동 원리 다이어그램

1
2
3
4
[Client] → [Context] → [Current State]
                         |
                         v
                [다음 상태로 전이]

구현 기법

예시 코드 (Python)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class State:
    def handle(self, context):
        pass

class ConcreteStateA(State):
    def handle(self, context):
        print("State A 동작")
        context.state = ConcreteStateB()

class ConcreteStateB(State):
    def handle(self, context):
        print("State B 동작")
        context.state = ConcreteStateA()

class Context:
    def __init__(self, state):
        self.state = state
    def request(self):
        self.state.handle(self)

context = Context(ConcreteStateA())
context.request()  # State A 동작
context.request()  # State B 동작

장점과 단점

구분항목설명
✅ 장점조건문 제거if/switch 없이 상태별 동작 관리, 코드 가독성/유지보수성 향상
확장성새로운 상태 추가/변경 용이, OCP 준수
SRP상태별 책임 분리, 코드 모듈화
상태 전이 명확전이 규칙이 명확, 상태별 행동 추적 용이
⚠ 단점클래스 수 증가상태별로 클래스가 많아져 복잡성 증가
초기 설계 부담상태/전이 설계가 복잡할 수 있음
오버엔지니어링단순한 상태 관리엔 과도한 구조가 될 수 있음

도전 과제 및 해결책


분류에 따른 종류 및 유형

분류 기준종류/유형설명
전이 관리상태 객체 내부 전이상태 객체가 직접 전이 결정
전이 테이블 기반 전이별도 전이 테이블로 전이 관리
상태 공유상태 객체 공유여러 Context 가 상태 객체 공유
상태 객체 독립각 Context 가 독립적으로 상태 관리

실무 적용 예시

분야적용 예시설명
자판기동전 투입/상품 선택/거스름돈 반환 등상태별 동작 분리, 상태 전이 명확화
트래픽 신호등빨간불/초록불/노란불각 신호별 동작 및 전이 관리
워크플로우문서 승인/반려/검토단계별 상태 및 전이 관리
미디어 플레이어재생/일시정지/정지상태별 동작 및 전이 구현

활용 사례 (시나리오 기반)

상황 가정: 온라인 주문 처리 시스템

1
[OrderPlaced] → [PaymentPending] → [Shipped] → [Delivered]

실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점

항목설명권장사항
클래스 수 관리상태가 많아질수록 클래스 증가공통 동작 추상화, 전이 테이블 활용
전이 로직 명확화상태 전이 규칙이 복잡해질 수 있음전이 테이블/매니저로 전이 관리
테스트 용이성상태별 동작/전이 테스트 필요단위 테스트, 상태별 테스트 강화
SRP/OCP 준수상태별 책임 분리/확장성 유지 필요인터페이스/추상 클래스 활용

최적화하기 위한 고려사항 및 주의할 점

항목설명권장사항
상태 객체 재사용상태 객체 공유 시 메모리 최적화상태 객체 싱글턴/공유 전략 적용
전이 테이블 최적화전이 테이블 조회 성능 고려해시맵/배열 등 효율적 자료구조 활용
상태 변경 최소화불필요한 상태 전이 방지상태 변경 조건 명확화
GC 관리상태 객체 누수 방지약한 참조, 객체 수명 관리

2025 년 기준 최신 동향

주제항목설명
상태 관리FSM(유한 상태 기계)FSM 기반 워크플로우, 상태 패턴 결합 확산
분산 시스템상태 기반 오케스트레이션마이크로서비스 워크플로우에 상태 패턴 적용 증가
코드 생성상태 패턴 코드 생성기자동화 도구로 상태 패턴 코드 생성 지원
성능상태 객체 공유 최적화상태 객체 재사용 및 메모리 관리 강화

주제와 관련하여 주목할 내용

주제항목설명
FSM유한 상태 기계상태 패턴과 FSM 결합, 복잡한 상태 관리
상태 전이 테이블전이 규칙 관리전이 로직을 테이블로 분리, 유지보수성 향상
비교 패턴Strategy, Command구조 유사하나 의도/상태 전이 방식 다름
SRP/OCP단일 책임/확장성상태별 책임 분리, 확장성 강화

앞으로의 전망

주제항목설명
자동화상태 패턴 코드 생성상태 전이 자동화 도구/프레임워크 확산
대규모 시스템상태 관리 최적화대규모 워크플로우/분산 시스템에서 활용 증가
성능상태 객체 최적화메모리/성능 최적화 연구 활발
확장성동적 상태 추가런타임 상태 추가/변경 지원 도구 증가

하위 주제별 추가 학습 필요 내용

카테고리주제간략 설명
패턴 구조FSM(유한 상태 기계)상태 패턴과 FSM 연계 설계법
전이 관리상태 전이 테이블전이 규칙 테이블 설계/활용법
테스트상태별 단위 테스트상태별 동작/전이 테스트 전략
확장성동적 상태 추가런타임 상태 추가/변경 구현법

추가 학습/알아야 할 내용

카테고리주제간략 설명
소프트웨어 아키텍처상태 기반 워크플로우대규모 시스템의 상태 관리 전략
성능상태 객체 최적화객체 공유/싱글턴/GC 관리
프레임워크상태 패턴 자동화 도구코드 생성기, 워크플로우 엔진 활용법
실무 도구상태 시각화/모니터링상태 전이 시각화 및 모니터링 도구

용어 정리

용어설명
Context(컨텍스트)현재 상태를 참조하고, 상태별 동작을 위임하는 객체
State(상태)상태별 동작을 정의하는 인터페이스/추상 클래스
ConcreteState(구체 상태)각 상태별 동작 및 전이 로직을 구현한 클래스
FSM(유한 상태 기계)유한한 상태와 전이 규칙으로 동작하는 모델
상태 전이 테이블상태 전이 규칙을 테이블 형태로 관리하는 구조

참고 및 출처

State Pattern (상태 패턴) 에 대해 실무 중심으로 아래와 같이 상세 정리했습니다.


1. 주제의 분류 적절성 검토


2. 주제 요약 (200 자 내외)

State Pattern 은 객체가 상태에 따라 서로 다른 동작을 수행하도록 하는 디자인 패턴이다. 상태 전이와 행동의 캡슐화를 통해 조건문을 제거하고, 객체의 유연성과 가독성을 높인다.


3. 전체 개요 (250 자 내외)

상태 패턴 (State Pattern) 은 객체의 내부 상태가 변경될 때 객체의 행동도 함께 바뀌도록 하여, 상태 관련 코드를 각 상태 클래스로 분리하는 구조를 제공합니다. 이를 통해 복잡한 조건문을 줄이고, 상태 전이 로직을 캡슐화하며, 유지보수성과 확장성을 높입니다. 게임, 워크플로우 엔진, UI 컴포넌트 등 상태 기반 동작을 구현할 때 유용하게 쓰입니다.


4. 핵심 개념

정의

State Pattern 은 객체의 내부 상태를 객체로 캡슐화하여 상태에 따른 행위를 객체가 스스로 변경할 수 있도록 하는 디자인 패턴입니다.

기본 원리

실무 핵심


5. 필수 조사 내용 정리

목적 및 필요성

주요 기능 및 역할

특징


주요 원리 및 작동 원리 (다이어그램 포함)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
+-------------+         +-----------------+
|  Context    |<------->|   State (인터페이스)   |
+-------------+         +-----------------+
        |                          ^
        |                          |
        v                          v
+---------------+       +----------------+
| StateA        |       | StateB         |
+---------------+       +----------------+
| handle()      |       | handle()       |
+---------------+       +----------------+

구조 및 아키텍처

구성 요소

구성요소설명
Context상태에 따라 동작을 위임하며, 현재 상태를 저장
State (Interface)상태별 공통 인터페이스 정의
ConcreteState각 상태별 동작 정의 및 상태 전이 포함

필수 구성 요소

선택 구성 요소


구현 기법

구성

목적

실제 예시


장단점

구분항목설명
✅ 장점조건문 제거if-else/switch 문을 제거해 코드 가독성과 유지보수성 향상
상태 전이 명확화상태 변경이 구조적으로 분리되어 관리가 쉬움
OCP 준수상태 추가 시 기존 코드 변경 없이 확장 가능
⚠ 단점클래스 수 증가상태 수에 비례해 클래스가 많아짐
상태 전이 로직 분산상태 간 전이 로직이 흩어질 수 있어 추적 어려움
메모리 사용 증가많은 상태 인스턴스를 관리해야 할 경우 메모리 사용 증가

도전 과제

도전 과제설명해결책
상태 간 의존성 증가상태 전이 조건이 복잡해질 수 있음상태 전이를 외부 트랜지션 매니저로 분리
객체 수 증가상태 수가 많아지면 클래스 관리 부담 증가상태 공유 또는 싱글턴 적용
디버깅 난이도 증가전이 로직이 분산되면 흐름 파악 어려움상태 전이 로깅 및 시각화 도구 사용

분류에 따른 종류 및 유형

분류 기준유형설명
전이 트리거명시적 전이, 암시적 전이명시적: 코드에서 전이 직접 수행 / 암시적: 상태 내부 조건에 따라 전이
상태 저장 방식내부 저장, 외부 주입Context 내에 상태 저장하거나 외부에서 상태를 관리 및 주입
상태 객체Singleton, Dynamic공유 상태 vs 매 요청마다 새 인스턴스 생성

실무 적용 예시

분야적용 사례설명
게임 엔진캐릭터 상태 관리IDLE, RUN, ATTACK 상태에 따른 스킬/이동 변경
네트워크TCP 상태머신SYN_SENT, ESTABLISHED, TIME_WAIT 등 상태별 프로토콜 처리
워크플로우 시스템승인/거절 프로세스상태 전이에 따라 업무 처리 로직 변화
UI/UX버튼 활성화 상태ENABLED, DISABLED, HOVERED, PRESSED 등 상태별 동작 처리

이어서 State Pattern (상태 패턴) 에 대한 심화 정리를 계속합니다.


6. 활용 사례 (시나리오 기반)

📌 시나리오: ATM 기기 상태 관리 시스템

🧩 시스템 구성 요소

컴포넌트설명
ATMContext현재 상태를 가지고 있으며 사용자 요청을 상태 객체에 위임
ATMState (인터페이스)공통 상태 인터페이스, 각 상태의 행동 정의
NoCardState카드가 삽입되지 않은 상태
HasCardState카드가 삽입된 상태
CorrectPinState핀이 확인된 상태
NoCashState인출 불가 상태 (잔액 부족)

📊 시스템 다이어그램

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
+-----------------+
|   ATMContext    |
+-----------------+
| - currentState  | --> ATMState
| + setState()    |
| + insertCard()  |
| + enterPin()    |
| + withdraw()    |
+-----------------+
        |
        v
+---------------------+       +----------------------+
|   NoCardState       |<----->|   HasCardState       |
+---------------------+       +----------------------+
        |                              |
        v                              v
+---------------------+       +----------------------+
| CorrectPinState     |<----->|     NoCashState      |
+---------------------+       +----------------------+

⚙️ 워크플로우

  1. 사용자가 ATM 에 카드를 삽입 → 상태: NoCardStateHasCardState

  2. 핀 번호 입력 → CorrectPinState

  3. 출금 요청 → 잔액에 따라 NoCashState 또는 NoCardState 로 전이

🧱 각 클래스 역할


7. 실무에서 효과적으로 적용하기 위한 고려사항

고려사항설명권장사항
상태 분리 기준상태가 명확히 구분되지 않으면 오히려 복잡성 증가각 상태는 독립적이고 역할이 명확해야 함
상태 전이 책임 분리상태 객체가 너무 많은 전이 책임을 가지면 복잡도 증가상태 전이 로직은 외부 트랜지션 매니저로 위임 고려
테스트 전략상태마다 동작이 달라 테스트 커버리지가 중요상태별 단위 테스트 및 상태 전이 시나리오 테스트 구현
상태 공유 여부상태 객체가 상태 값을 내부에 가질 경우 공유 시 문제 발생상태 객체는 stateless 하게 설계하거나 복사본 사용

8. 성능을 최적화하기 위한 고려사항

고려사항설명권장사항
상태 인스턴스 생성 비용매 호출마다 새로운 상태 객체 생성 시 메모리 낭비상태 객체는 싱글턴 또는 캐시 재사용 구조로 설계
불필요한 상태 전이빈번한 전이 발생 시 오히려 오버헤드전이 조건을 정리하고, 전이 최소화 설계
상태 객체의 상태 보유상태 객체가 데이터를 가지고 있다면 재사용 주의상태는 Context 에 저장하고, 상태 객체는 stateless 로 구현 권장
로깅 및 추적성상태 전이 흐름 추적 어려움로그 기반 상태 전이 기록 시스템 도입 권장

9. 2025 년 기준 최신 동향

주제항목설명
상태 관리 프레임워크상태 기반 워크플로우 엔진 확대Camunda, Temporal 등에서 상태 패턴 유사 구조 채택
MSA 기반 설계분산 상태 머신 구현 증가Saga 패턴 기반 상태 전이 로직에 상태 패턴 도입
상태 시각화 도구시각적 전이 설계 도구 사용 증가XState, State Machine Cat 등으로 설계 자동화
UI 상태관리프론트 상태관리에도 패턴 도입React, Vue 에서 Finite State Machine(FSM) 적용 증가

10. 주제와 관련하여 주목할 내용

주제항목설명
FSM (Finite State Machine)상태 패턴의 이론적 기반유한 상태 기계 이론은 상태 패턴 설계의 기초
리팩토링조건문 제거 → 상태 객체화상태 패턴은 switch/if 제거를 위한 대표 리팩토링 기법
의존 역전 원칙 (DIP)상태 객체를 인터페이스 기반으로 처리구현 대신 추상화에 의존하도록 설계해야 유연성 증가
상태 전이 트레이서전이 추적을 위한 도구 및 로그 전략상태 전이 로깅이 실시간 디버깅에 중요

11. 앞으로의 전망

주제항목설명
분산 시스템상태 관리 중심 워크플로우 확대상태 패턴이 마이크로서비스의 상태 전이 관리에 활용됨
시각화 기반 설계상태 전이 설계 자동화GUI 기반 상태 설계 도구 확산으로 접근성 개선
AI 연계학습 기반 상태 전이 결정강화학습 기반 FSM 자동 생성 기술 연구 확대
생산성 향상코드 생성 도구와 연계XState, SCXML 기반 코드 자동 생성 도구 확대 적용

12. 추가 학습 필요 주제 (하위 분류)

카테고리주제설명
디자인 패턴상태 패턴 vs 전략 패턴동작 캡슐화 방식 비교 (상태는 전이 포함, 전략은 독립적)
상태 기계FSM, Pushdown Automata상태 전이 모델 이론 학습
워크플로우 엔진Camunda, Temporal상태 기반 로직 적용 실무 사례 학습
리팩토링조건문 제거 기법상태 전이 로직 분리 기법 학습

13. 확장 학습 주제 (관련 분야 포함)

카테고리주제설명
소프트웨어 설계상태 기반 설계 아키텍처FSM 기반 시스템 구조화
테스트 전략상태 기반 테스트상태 전이 기반의 경로 테스트 케이스 작성
DevOps상태 기반 배포 전략배포 상태, 장애 상태, 복구 상태 관리 설계
시스템 설계복잡한 전이 상태 시스템 설계대형 시스템의 워크플로우 흐름 설계 시 적용 전략

용어 정리

용어설명
State Pattern상태에 따라 객체의 행동이 변경되도록 설계하는 패턴
Context상태 객체를 보유하고, 행동을 위임하는 중심 객체
State (Interface)모든 상태들이 구현해야 할 행동 인터페이스
ConcreteState각 상태의 구체적 행동과 전이를 정의한 클래스
FSM (Finite State Machine)유한한 상태와 전이 규칙을 가진 상태 모델

참고 및 출처


이후 원하시면 샘플 코드 구현 (Java/Python), 상태 패턴 vs 전략 패턴 비교 표, 상태 패턴 리팩토링 예시 등을 추가 제공해드릴 수 있습니다. 어떤 항목을 이어서 도와드릴까요?

주제에 대한 조사를 위해 State Pattern 관련 정보를 검색하겠습니다.

이제 수집한 정보를 바탕으로 State Pattern 에 대한 종합적인 분석을 진행하겠습니다.


State Pattern (상태 패턴) 종합 분석

1. 주제 분류 검증

주제 분류 “Computer Science and Engineering” > “Software Design and Architecture” > “Software Design Patterns” > “GoF” > “Behavioral Design Patterns” 는 적절합니다. State Pattern 은 Gang of Four (GoF) 가 정의한 23 개 디자인 패턴 중 하나로, 행동 패턴 (Behavioral Design Pattern) 카테고리에 속합니다.

2. 요약 설명 (200 자 내외)

State Pattern 은 객체의 내부 상태가 변경될 때 객체의 행동을 변경할 수 있게 하는 행동 패턴입니다. 상태별 행동을 별도 클래스로 캡슐화하여 복잡한 조건문을 제거하고, 새로운 상태 추가 시 기존 코드 수정 없이 확장할 수 있습니다. 유한 상태 머신 (FSM) 개념과 밀접한 관련이 있으며 객체가 마치 클래스가 변경된 것처럼 보이게 합니다.

3. 전체 개요 (250 자 내외)

State Pattern 은 객체 지향 프로그래밍에서 객체의 상태에 따라 행동이 달라지는 문제를 해결하는 디자인 패턴입니다. Context 객체가 현재 상태를 나타내는 State 객체에 행동을 위임하고, 상태 전환 시 State 객체를 교체하여 동적으로 행동을 변경합니다. 이를 통해 상태별 조건문을 제거하고 코드의 유지보수성과 확장성을 향상시킵니다. 미디어 플레이어, 자판기, 게임 캐릭터 등에서 활용되며, Strategy Pattern 과 유사하지만 상태 간 의존성과 전환 관리가 핵심 차이점입니다.

4. 핵심 개념

4.1 기본 개념

4.2 핵심 구성 요소

4.3 유한 상태 머신과의 관계


파트 1: 핵심 이론과 배경

배경

State Pattern 은 1995 년 Gang of Four 가 발표한 23 개 디자인 패턴 중 하나로, 객체의 상태에 따라 행동이 변경되는 문제를 해결하기 위해 개발되었습니다. 이 패턴은 오토마타 이론의 유한 상태 머신 (Finite State Machine) 개념에서 영감을 받아 객체 지향적으로 구현한 것입니다.

목적 및 필요성

주요 목적:

필요성:

주요 기능 및 역할

핵심 기능:

  1. 상태 관리: 객체의 현재 상태 추적 및 관리
  2. 행동 위임: 상태별 행동을 해당 상태 객체에 위임
  3. 동적 전환: 런타임에 상태 변경 및 행동 수정
  4. 캡슐화: 상태별 로직을 별도 클래스로 분리

주요 역할:

특징

긍정적 특징:

구조적 특징:

핵심 원칙

  1. 단일 책임 원칙: 각 상태 클래스는 하나의 상태만 담당
  2. 개방 - 폐쇄 원칙: 새로운 상태 추가 시 기존 코드 수정 불필요
  3. 의존성 역전 원칙: Context 는 구체적인 State 가 아닌 인터페이스에 의존
  4. 상태 캡슐화: 각 상태의 행동을 해당 클래스 내부에 캡슐화

파트 2: 구조와 구현

주요 원리 및 작동 원리

State Pattern 의 작동 원리는 다음과 같습니다:

  1. 상태 표현: 각 상태를 별도의 클래스로 표현
  2. 위임: Context 객체가 현재 상태 객체에 행동 위임
  3. 전환: 상태 변경 시 State 객체 교체
  4. 일관성: 모든 상태 클래스가 동일한 인터페이스 구현

구조 및 아키텍처

필수 구성요소
구성요소기능역할
Context상태를 가지는 주체 객체- 현재 상태 객체 참조 유지
- 클라이언트 인터페이스 제공
- 상태 전환 관리
State Interface상태 인터페이스 정의- 모든 상태 클래스의 공통 인터페이스
- 상태별 행동 메서드 선언
Concrete State구체적인 상태 구현- 특정 상태의 행동 구현
- 상태 전환 로직 포함
Context 참조 (선택적)
선택 구성요소
구성요소기능역할
Abstract State추상 상태 클래스- 공통 기능 제공
- 코드 중복 방지
State Factory상태 객체 생성 관리- 상태 객체 생성 및 관리
- 상태 객체 재사용

구현 기법

1. 기본 구현 기법

정의: 표준적인 State Pattern 구현 방식 구성: Context, State Interface, Concrete States 목적: 상태별 행동의 명확한 분리

실제 예시 (Java):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// State Interface
interface State {
    void handle(Context context);
}

// Context Class
class Context {
    private State currentState;
    
    public Context(State initialState) {
        this.currentState = initialState;
    }
    
    public void setState(State state) {
        this.currentState = state;
    }
    
    public void request() {
        currentState.handle(this);
    }
}

// Concrete States
class ConcreteStateA implements State {
    public void handle(Context context) {
        System.out.println("Handling in State A");
        // 상태 전환 로직
        context.setState(new ConcreteStateB());
    }
}
2. 상태 팩토리 기법

정의: 상태 객체 생성 및 관리를 별도 팩토리로 분리 구성: State Factory 추가 목적: 상태 객체 생성 로직 중앙화

실제 예시:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class StateFactory {
    private static Map<String, State> states = new HashMap<>();
    
    static {
        states.put("A", new ConcreteStateA());
        states.put("B", new ConcreteStateB());
    }
    
    public static State getState(String stateType) {
        return states.get(stateType);
    }
}
3. 계층적 상태 기법

정의: 상태 간 계층 구조를 가진 구현 구성: 부모 - 자식 상태 관계 목적: 복잡한 상태 구조 관리

4. 상태 스택 기법

정의: Pushdown Automaton 을 활용한 상태 스택 관리 구성: 상태 스택 구조 목적: 이전 상태로의 복귀 지원


파트 3: 장단점과 적용

장점과 단점

구분항목설명
장점조건문 복잡성 제거if-else, switch-case 문의 복잡성을 제거하여 코드 가독성 향상
확장성새로운 상태 추가 시 기존 코드 수정 없이 확장 가능
유지보수성각 상태별 로직이 분리되어 유지보수 용이
다형성 활용객체 지향의 다형성을 통한 유연한 구조
단일 책임 원칙각 상태 클래스가 하나의 책임만 가짐
단점클래스 수 증가상태별로 클래스가 필요하여 전체 클래스 수 증가
복잡성 증가간단한 상태 관리에는 과도한 복잡성
성능 오버헤드객체 생성 및 메서드 호출로 인한 성능 오버헤드
메모리 사용량상태 객체들로 인한 메모리 사용량 증가

도전 과제

1. 상태 폭발 문제

2. 상태 전환 관리

3. 성능 최적화

4. 상태 일관성

분류에 따른 종류 및 유형

분류 기준유형특징예시
상태 전환 주체Context 주도형Context 에서 상태 전환 관리미디어 플레이어
State 주도형State 객체가 다음 상태 결정게임 캐릭터 상태
상태 객체 관리생성/소멸형필요시 상태 객체 생성/소멸메모리 절약 중요한 경우
사전 생성형모든 상태 객체를 미리 생성빠른 전환이 필요한 경우
상태 구조단순형평면적 상태 구조간단한 상태 머신
계층형중첩된 상태 구조복잡한 상태 관리

실무 적용 예시

분야적용 사례구현 특징주요 상태
미디어 시스템미디어 플레이어재생 상태 관리Playing, Paused, Stopped
게임 개발캐릭터 AI행동 패턴 관리Idle, Moving, Attacking
자동화 시스템자판기거래 상태 관리Ready, Selecting, Processing
네트워크TCP 연결연결 상태 관리Closed, Listen, Established
UI/UX폼 검증입력 상태 관리Empty, Valid, Invalid

활용 사례: 온라인 주문 시스템

시나리오

전자상거래 플랫폼의 주문 처리 시스템에서 주문의 생명주기를 관리하는 사례

시스템 구성
시스템 구성 다이어그램
1
2
3
4
5
[Client] → [OrderContext] → [OrderState Interface]
                ↓                    ↑
         [Current State]     [Concrete States]
                    [Confirmed] → [Paid] → [Shipped] → [Delivered]
Workflow
  1. 주문 생성: 초기 상태를 ‘Confirmed’ 로 설정
  2. 결제 처리: 결제 완료 시 ‘Paid’ 상태로 전환
  3. 배송 준비: 상품 준비 완료 시 ‘Shipped’ 상태로 전환
  4. 배송 완료: 고객 수령 확인 시 ‘Delivered’ 상태로 전환
역할

파트 4: 최적화와 실무 고려사항

실무에서 효과적으로 적용하기 위한 고려사항 및 주의할 점

구분고려사항권장사항
설계상태 식별 정확성도메인 전문가와 협업하여 모든 상태와 전환 규칙 명확히 정의
구현인터페이스 설계상태별 공통 행동을 포함한 일관된 인터페이스 설계
확장성새로운 상태 추가기존 코드 영향 최소화를 위한 개방 - 폐쇄 원칙 준수
테스트상태 전환 테스트모든 가능한 상태 전환 시나리오에 대한 테스트 케이스 작성
문서화상태 다이어그램시각적 상태 다이어그램으로 시스템 이해도 향상
유지보수코드 일관성명명 규칙과 코드 스타일 일관성 유지

최적화하기 위한 고려사항 및 주의할 점

구분최적화 포인트권장사항
메모리상태 객체 관리싱글톤 패턴이나 플라이웨이트 패턴으로 상태 객체 재사용
속도상태 전환 최적화빈번한 전환이 예상되는 경우 상태 객체 미리 생성
동시성스레드 안전성멀티스레드 환경에서 상태 전환 시 동기화 처리
확장성상태 수 관리과도한 상태 분할 방지, 계층적 구조 고려
캐싱상태 정보 캐싱자주 접근하는 상태 정보는 캐싱으로 성능 향상
지연 로딩필요시 생성사용하지 않는 상태 객체는 지연 로딩으로 메모리 절약

GoF 패턴 세부 분석

패턴 이름과 분류
의도 (Intent)

객체의 내부 상태가 변경될 때 객체의 행동을 변경할 수 있도록 하며, 객체가 마치 클래스가 변경된 것처럼 보이게 합니다.

다른 이름 (Also Known As)
동기 (Motivation / Forces)
적용 가능성 (Applicability)
참여자 (Participants)
협력 (Collaboration)
결과 (Consequences)

긍정적 결과:

부정적 결과:

구현 (Implementation)
  1. Context 클래스 정의
  2. State 인터페이스 선언
  3. ConcreteState 클래스들 구현
  4. 상태 전환 메커니즘 구현
샘플 코드 (Sample Code)

Python 구현:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from abc import ABC, abstractmethod

# State Interface
class State(ABC):
    @abstractmethod
    def handle(self, context):
        pass

# Context
class MediaPlayer:
    def __init__(self):
        self._state = StoppedState()
    
    def set_state(self, state):
        self._state = state
    
    def play(self):
        self._state.play(self)
    
    def pause(self):
        self._state.pause(self)
    
    def stop(self):
        self._state.stop(self)

# Concrete States
class PlayingState(State):
    def play(self, context):
        print("Already playing")
    
    def pause(self, context):
        print("Pausing playback")
        context.set_state(PausedState())
    
    def stop(self, context):
        print("Stopping playback")
        context.set_state(StoppedState())

class PausedState(State):
    def play(self, context):
        print("Resuming playback")
        context.set_state(PlayingState())
    
    def pause(self, context):
        print("Already paused")
    
    def stop(self, context):
        print("Stopping playback")
        context.set_state(StoppedState())

class StoppedState(State):
    def play(self, context):
        print("Starting playback")
        context.set_state(PlayingState())
    
    def pause(self, context):
        print("Cannot pause when stopped")
    
    def stop(self, context):
        print("Already stopped")

JavaScript 구현:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// State Interface (abstract class)
class State {
    handle(context) {
        throw new Error("handle method must be implemented");
    }
}

// Context
class TrafficLight {
    constructor() {
        this.state = new RedState();
    }
    
    setState(state) {
        this.state = state;
    }
    
    change() {
        this.state.handle(this);
    }
    
    getState() {
        return this.state.constructor.name;
    }
}

// Concrete States
class RedState extends State {
    handle(context) {
        console.log("Red Light - Stop!");
        context.setState(new GreenState());
    }
}

class GreenState extends State {
    handle(context) {
        console.log("Green Light - Go!");
        context.setState(new YellowState());
    }
}

class YellowState extends State {
    handle(context) {
        console.log("Yellow Light - Caution!");
        context.setState(new RedState());
    }
}

// 사용 예시
const trafficLight = new TrafficLight();
trafficLight.change(); // Red Light - Stop!
trafficLight.change(); // Green Light - Go!
trafficLight.change(); // Yellow Light - Caution!
알려진 사용 (Known Uses)

2025 년 기준 최신 동향

주제항목설명
AI/ML 통합지능형 상태 전환AI 를 활용한 동적 상태 전환 규칙 학습 및 최적화
클라우드 네이티브분산 상태 관리마이크로서비스 환경에서의 상태 동기화 및 관리
함수형 프로그래밍불변 상태 패턴함수형 언어에서의 불변 상태 객체 활용
리액티브 프로그래밍스트림 기반 상태RxJS, Reactor 등을 활용한 리액티브 상태 관리
모바일 최적화경량화 패턴모바일 환경에 최적화된 경량 State Pattern 구현

주제와 관련하여 주목할 내용

주제항목설명
성능 최적화상태 풀링상태 객체 재사용을 통한 메모리 및 성능 최적화
디버깅 도구상태 시각화실시간 상태 전환 모니터링 및 디버깅 도구
테스트 자동화상태 기반 테스팅상태 전환 시나리오 자동 생성 및 테스트
코드 생성DSL 기반 생성Domain Specific Language 를 통한 State Pattern 코드 자동 생성
동시성 처리액터 모델액터 모델과 State Pattern 결합을 통한 동시성 처리

앞으로의 전망

주제항목설명
자동화AI 기반 최적화머신러닝을 통한 상태 전환 패턴 자동 최적화
시각화실시간 모니터링상태 머신의 실시간 시각화 및 분석 도구 발전
통합성마이크로서비스분산 시스템에서의 상태

앞으로의 전망 (계속)

주제항목설명
통합성마이크로서비스분산 시스템에서의 상태 일관성 보장 기술 발전
성능하드웨어 최적화GPU, TPU 등 하드웨어 가속을 활용한 상태 처리
표준화패턴 표준화업계 표준 State Pattern 라이브러리 및 프레임워크 등장
보안상태 기반 보안상태 전환을 활용한 보안 메커니즘 강화

추가적으로 학습해야할 내용들 (하위 주제)

카테고리주제설명
고급 패턴Hierarchical State Machine중첩된 상태 구조를 가진 복잡한 상태 머신
고급 패턴Pushdown Automaton스택 기반 상태 관리 및 이전 상태 복원
구현 기법State Table Pattern테이블 기반 상태 전환 관리 기법
최적화State Pooling상태 객체 재사용을 통한 성능 최적화
동시성Thread-Safe State Pattern멀티스레드 환경에서의 안전한 상태 관리
함수형Functional State Pattern함수형 프로그래밍에서의 State Pattern 구현

추가로 알아야 하거나 학습해야할 내용들 (관련 분야)

카테고리주제설명
컴퓨터 과학Finite State Automata오토마타 이론의 기초 개념 및 수학적 모델
시스템 설계Event-Driven Architecture이벤트 기반 아키텍처와 상태 패턴의 통합
게임 개발AI State Machine게임 AI 에서의 상태 기반 행동 모델링
웹 개발Frontend State ManagementReact, Vue.js 등에서의 상태 관리 패턴
분산 시스템Distributed State Machine분산 환경에서의 상태 동기화 및 일관성
데이터베이스Database State Transition데이터베이스 트랜잭션과 상태 관리
네트워킹Protocol State Machine네트워크 프로토콜의 상태 기반 구현
임베디드Real-Time State Machine실시간 시스템에서의 상태 머신 구현

용어 정리

용어설명
Context (컨텍스트)상태를 가지며 클라이언트와 상호작용하는 주체 객체
State Interface (상태 인터페이스)모든 구체적인 상태 클래스가 구현해야 하는 공통 인터페이스
Concrete State (구체 상태)특정 상태의 행동을 구현하는 클래스
State Transition (상태 전환)한 상태에서 다른 상태로 변경되는 과정
Finite State Machine (FSM)유한한 개수의 상태와 전환 규칙을 가진 수학적 모델
Deterministic FSM (DFA)각 입력에 대해 유일한 전환 경로를 가진 상태 머신
Non-deterministic FSM (NFA)하나의 입력에 대해 여러 전환 경로가 가능한 상태 머신
Pushdown Automaton스택을 가진 상태 머신으로 이전 상태 기억 가능
State Explosion상태와 전환의 수가 기하급수적으로 증가하는 문제
Hierarchical State Machine중첩된 상태 구조를 가진 상태 머신
Guard Condition (가드 조건)상태 전환이 발생하기 위해 만족해야 하는 조건
Entry Action (진입 액션)상태에 진입할 때 실행되는 동작
Exit Action (탈출 액션)상태에서 나갈 때 실행되는 동작
Self-Transition (자기 전환)동일한 상태로 다시 전환하는 것
Composite State (복합 상태)내부에 하위 상태를 포함하는 상태

참고 및 출처