STOMP 기반 채팅 요약

Sirius·2025년 9월 12일

채팅

1) 소켓 연결

  • WebSocket(SockJS)로 /ws-chat 에 연결
  • 연결 시 JWT 전달(쿼리 ?token=... 혹은 STOMP header)

STOMP 기반 채팅 동작 구조

1. 기본 개념

  • STOMP = “Simple Text Oriented Messaging Protocol” → WebSocket 위에서 동작하는 채팅 전용 규약
  • 핵심동작:
    1. CONNECT → 서버와 인증된 연결 맺기
    2. SUBSCRIBE → 내가 듣고 싶은 채널 구독
    3. SEND → 특정 채널에 메시지 발송하기
  • 서버는 클라이언트에게 직접 보내지 않고, 브로커(/topic, /queue)를 통해 라우팅

2. 전체 흐름 (채팅 1건 전송 예시)

🟢 (1) 클라이언트 → 서버: 연결

  1. 클라이언트는 WebSocket으로 /ws-chat 엔드포인트에 연결
  2. 연결 시 JWT 토큰을 같이 보냄 (?token= 또는 header)
  3. 서버는 토큰을 검증하고, Principal(userId)를 세션에 심어둠

🟢 (2) 클라이언트 → 서버: 구독

  • 클라이언트가 특정 채널 메시지를 받으려면 SUBSCRIBE 해야 함
  • 예: SUBSCRIBE /topic/channels.1
  • 서버 → 클라이언트 방향 메시지가 도착

🟢 (3) 클라이언트 → 서버: 메시지 전송

  • 유저가 메시지를 보낼 때는 SEND 프레임으로 서버에 요청
  • 목적지: /app/chat.channels.1.send
  • payload: {"content":"안녕","attachments":[]}
  • 서버는:
    1. DB에 메시지 저장
    2. 해당 채널 모든 구독자에게 /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

0개의 댓글