채팅
1) 소켓 연결
- WebSocket(SockJS)로
/ws-chat 에 연결
- 연결 시 JWT 전달(쿼리
?token=... 혹은 STOMP header)
STOMP 기반 채팅 동작 구조
1. 기본 개념
- STOMP = “Simple Text Oriented Messaging Protocol” → WebSocket 위에서 동작하는 채팅 전용 규약
- 핵심동작:
- CONNECT → 서버와 인증된 연결 맺기
- SUBSCRIBE → 내가 듣고 싶은 채널 구독
- SEND → 특정 채널에 메시지 발송하기
- 서버는 클라이언트에게 직접 보내지 않고, 브로커(/topic, /queue)를 통해 라우팅
2. 전체 흐름 (채팅 1건 전송 예시)
🟢 (1) 클라이언트 → 서버: 연결
- 클라이언트는 WebSocket으로
/ws-chat 엔드포인트에 연결
- 연결 시 JWT 토큰을 같이 보냄 (
?token= 또는 header)
- 서버는 토큰을 검증하고,
Principal(userId)를 세션에 심어둠
🟢 (2) 클라이언트 → 서버: 구독
- 클라이언트가 특정 채널 메시지를 받으려면 SUBSCRIBE 해야 함
- 예:
SUBSCRIBE /topic/channels.1
- 서버 → 클라이언트 방향 메시지가 도착
🟢 (3) 클라이언트 → 서버: 메시지 전송
- 유저가 메시지를 보낼 때는 SEND 프레임으로 서버에 요청
- 목적지:
/app/chat.channels.1.send
- payload:
{"content":"안녕","attachments":[]}
- 서버는:
- DB에 메시지 저장
- 해당 채널 모든 구독자에게
/topic/channels.1으로 브로드캐스트
🟢 (4) 서버 → 클라이언트: 메시지 전달
/topic/channels.1을 구독한 모든 사용자가 실시간으로 메시지 수신
- 따라서 REST API로 polling 할 필요 없이, 채팅창에 바로 메시지가 뜸
🟢 (5) 클라이언트 → 서버: 읽음 처리
- 채팅방에 있는 유저가 마지막 메시지를 읽으면:
SEND /app/chat.channels.1.read
- payload:
{"lastReadMessageId": 123}
- 서버는 DB의
lastReadChatMessageId를 갱신하고, /topic/channels.1으로 “누가 어디까지 읽었는지” 이벤트를 브로드캐스트
🟢 (6) 서버 → 클라이언트: 읽음 표시 전달
- 다른 유저들 화면에 “님이 읽음” 같은 표시가 즉시 뜸
✅ 한 줄 정리
STOMP 기반 채팅은 WebSocket으로 연결 → 채널 구독 → 메시지 SEND → 서버가 브로드캐스트 → 모든 구독자가 실시간 수신 구조다.
커넥트 테스트 BY POSTMAN
