기준: 현재 백엔드 코드 (
GameController,GameService,dto/*) 전송: SockJS 엔드포인트/ws-snowpeak위의 STOMP 1.2 프론트엔드 반영 여부: 아직 반영 전 (이동 동기화 트러블슈팅 8-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 메시지는 사라집니다.
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) | - | 보낸 시각. 브로드캐스트에 그대로 실려 돌아옴 (지연 측정용) |
playerId, roomId는 보내지 않습니다. 서버가 세션에 저장된 값으로 판단합니다.setPreserveReceiveOrder).SEND /app/ping{ "sentAt": 1760600000000 }