기준: 현재 백엔드 코드 (GameController, GameService, dto/*) 전송: SockJS 엔드포인트 /ws-snowpeak 위의 STOMP 1.2 프론트엔드 반영 여부: 아직 반영 전 (이동 동기화 트러블슈팅 8-1절)


1. 연결 순서

sequenceDiagram
    participant C as Client
    participant S as Server
    C->>S: CONNECT /ws-snowpeak
    C->>S: SUBSCRIBE /topic/room.1
    C->>S: SUBSCRIBE /user/queue/sync
    C->>S: SUBSCRIBE /user/queue/errors
    C->>S: SUBSCRIBE /user/queue/pong
    C->>S: SEND /app/join
    alt 입장 성공
        S-->>C: /user/queue/sync  ROOM_STATE
        S-->>C: /topic/room.1     PLAYER_JOINED (본인 포함 모두에게)
    else 입장 실패
        S-->>C: /user/queue/errors ERROR
    end

구독을 먼저 끝낸 뒤 /app/join을 보내야 합니다. 구독 전에 도착한 1:1 메시지는 사라집니다.


2. Client → Server

SEND /app/join

{ "nickname": "alice", "role": "server", "x": 400, "y": 300, "roomId": "1" }
필드 타입 필수 규칙
nickname string O 앞뒤 공백 제거 후 1~16자. 방 안에서 유일해야 함 (HSETNX)
role string O server, cook, barista, hall_server (대소문자 무관)
x, y number - 0~800, 0~600으로 clamp
roomId string - 없으면 "1"

SEND /app/move

{ "x": 412, "y": 305, "direction": "right", "animState": "WALK", "sentAt": 1760600000000 }
필드 타입 필수 규칙
x, y number O 맵 범위로 clamp
direction string - up / down / left / right
animState string - IDLE / WALK. 없으면 WALK
sentAt number(ms) - 보낸 시각. 브로드캐스트에 그대로 실려 돌아옴 (지연 측정용)

SEND /app/ping

{ "sentAt": 1760600000000 }

3. Server → Client