Skip to content

Room State Machine ​

개요 ​

'얼음땡' 프로젝트의 방(Room)은 단순한 참여자 컨테이너가 아니라, 명확한 생명주기를 갖는 상태 머신(State Machine)으로 관리됩니다. 이를 통해 각 시점의 방의 상태(Stage)를 명확히 하고, 상태에 따른 행위를 제어하며, 예측 가능한 흐름을 보장합니다.

상태 전이는 RoomStageStateMachine에 의해 관리되며, Redis에 현재 방의 상태가 저장됩니다.

상태 다이어그램 ​

방의 상태(Stage)와 전이(Transition)는 아래 다이어그램과 같습니다.

mermaid
stateDiagram-v2
    [*] --> PROFILE_VIEW_STAGE: INIT

    PROFILE_VIEW_STAGE --> GAME_LIST_STAGE: NEXT

    GAME_LIST_STAGE --> TOPIC_RECOMMEND_STAGE: SELECT
    GAME_LIST_STAGE --> RANDOM_ROULETTE_STAGE: SELECT
    GAME_LIST_STAGE --> MANITTO_STAGE: SELECT
    GAME_LIST_STAGE --> ENDING_STAGE: SELECT

    TOPIC_RECOMMEND_STAGE --> GAME_LIST_STAGE: PREV
    RANDOM_ROULETTE_STAGE --> GAME_LIST_STAGE: PREV
    MANITTO_STAGE --> GAME_LIST_STAGE: PREV

    ENDING_STAGE --> [*]: (자동 소멸)

상태 (Stages) ​

Stage.java에 정의된 각 상태는 방의 특정 시점을 나타냅니다.

  • PROFILE_VIEW_STAGE: 게임 시작 전, 참여자들이 서로의 프로필을 확인하는 초기 단계입니다.
  • GAME_LIST_STAGE: 방장이 플레이할 게임을 선택하는 단계입니다. 이 단계에서 다른 게임 스테이지 또는 종료 스테이지로 분기됩니다.
  • MANITTO_STAGE: '마니또' 게임이 진행 중인 상태입니다.
  • RANDOM_ROULETTE_STAGE: '랜덤 룰렛' 게임이 진행 중인 상태입니다.
  • TOPIC_RECOMMEND_STAGE: '토픽 추천' 게임이 진행 중인 상태입니다.
  • ENDING_STAGE: 모든 게임이 끝나고 방이 소멸되기 직전의 최종 단계입니다. 이 상태가 되면 방과 관련된 데이터(Stage 정보)가 Redis에서 삭제됩니다.

이벤트 (Events) ​

상태 전이는 StageEventType으로 정의된 이벤트를 통해 트리거됩니다. 이 이벤트는 방장에 의해서만 발생시킬 수 있습니다.

  • INIT: 방이 처음 생성되고 상태 머신이 초기화될 때 발생하는 내부 이벤트입니다.
  • NEXT: 논리적인 다음 단계로 이동합니다. (예: 프로필 보기 → 게임 목록)
  • PREV: 이전 단계로 돌아갑니다. (예: 게임 진행 → 게임 목록)
  • SELECT: 특정 상태(주로 게임)를 선택하여 직접 해당 상태로 이동합니다.

이러한 상태 관리는 /app/room/{roomCode}/change-stage WebSocket API를 통해 이루어지며, 자세한 내용은 Room WebSocket API 문서에서 확인할 수 있습니다.