[typescript] 객체의 상태에 따라 행위를 바꾸는 스테이트 패턴과 타입스크립트의 결합 사례

스테이트 패턴(State pattern)은 객체의 내부 상태가 바뀜에 따라 객체의 행동을 바꾸는 디자인 패턴입니다. 이 패턴은 상태를 나타내는 개체를 캡슐화하고, 각 상태에서 가능한 동작들을 캡슐화하여 상태 전환을 캡슐화하는 방법을 제공합니다.

스테이트 패턴의 타입스크립트 구현

예를 들어, 주문 상태에 따라 다른 처리를 하는 기능을 가진 주문 클래스가 있다고 가정해보겠습니다. 주문은 “처리 중”, “배송 중”, “배송 완료”와 같은 여러 상태를 가질 수 있습니다.

아래는 타입스크립트를 사용하여 스테이트 패턴을 구현한 예시입니다:

interface OrderState {
  cancel(): void;
  ship(): void;
}

class InProgressState implements OrderState {
  cancel(): void {
    console.log('주문을 취소할 수 없습니다.');
  }

  ship(): void {
    console.log('상품을 배송합니다.');
    // 배송 처리 로직
  }
}

class ShippedState implements OrderState {
  cancel(): void {
    console.log('이미 배송된 상품은 취소할 수 없습니다.');
  }

  ship(): void {
    console.log('이미 배송된 상품은 다시 배송할 수 없습니다.');
  }
}

class Order {
  private state: OrderState;

  constructor() {
    this.state = new InProgressState();
  }

  setState(state: OrderState): void {
    this.state = state;
  }

  cancel(): void {
    this.state.cancel();
  }

  ship(): void {
    this.state.ship();
  }
}

const order = new Order();
order.ship(); // "상품을 배송합니다."
order.cancel(); // "주문을 취소할 수 없습니다."
order.setState(new ShippedState());
order.ship(); // "이미 배송된 상품은 다시 배송할 수 없습니다."
order.cancel(); // "이미 배송된 상품은 취소할 수 없습니다."

위의 예시에서는 OrderState 인터페이스를 만들어 각 상태에 해당하는 동작을 정의하고, Order 클래스 내에서 현재의 상태에 따라 해당 동작을 실행하고 있습니다.

결론

타입스크립트와 같은 정적 타입 지원 언어를 활용하면 스테이트 패턴을 더욱 강력하게 활용할 수 있습니다. 정적 타입 검사는 시스템의 유효한 상태 전환만 허용하도록 보장해주며, 코드 가독성과 유지보수성을 향상시킵니다.

참고 자료: