기타

WebSocket의 기본 흐름

juuuuuuun 2025. 3. 6. 11:54

ws로 접속하면 실시간으로 양방향 통신 가능

  • ws://localhost:8080/ws → 웹소켓 접속 엔드포인트

  • 여기서 뒤의 /ws 는 WebSocketConfig의 엔드포인트 설정에서 직접 설정한 값

  • 한 번 접속하면 클라이언트와 서버가 WebSocket을 통해 지속적으로 연결 유지되며 실시간으로 통신이 가능

  • STOMP를 이용해 구독 가능

    • STOMP는 WebSocket 위에서 동작하는 프로토콜로, 메시지를 목적지(구독 엔드포인트)로 라우팅할 수 있음
    • 구독
      • 메시지를 전송할 때 전송 엔드포인트와 구독 엔드포인트를 동시에 작성
      • 예를 들어 /topic/room/1 이라는 경로를 구독하고, /message/send 같은 전송 엔드포인트로 메시지를 전송
      • 서버는 받은 메시지를 브로커를 통해 구독자들에게 전달
      • 모든 사용자에게 메시지가 보이는게 아니라 /topic/room/1 을 구독한 사용자에게만 메시지가 전송이 됨
    • 구독되는 과정
      • 구독을 해야 메시지를 받을 수 있기 때문에, 방을 생성할 때 방에 입장하는 유저들은 모두 해당 방을 구독하도록 구현 했음.
      • 채팅방에 들어와 있다면 구독을 하고 있다고 생각하면 됨
      • 따라서 해당 방에 없는 유저(해당 방을 구독을 안 한 유저)는 해당 전송 받지 않음

메시지 전송

  • 메시지 전송은 기본 prefix인 /app 에 @MessageMapping의 엔드포인트를 붙여 전송
    • ex) /app/chat/3/sendMessage
  • @SendTo는 해당 엔드포인트를 구독한 사용자에게만 전송하도록 하는 애노테이션
    • 3번 방에 메시지를 전송 했다면 /topic/chat/3 엔드포인트를 구독하고 있는 사용자만 메시지 수신

  1. ws://localhost:8080/ws 로 웹소켓 연결 (서버가 끊길 때 까지 연결 유지)

  2. /topic/chat/{roomId} 로 구독

    • 현재 /topic/chat/3 만 구독 되어있는 상태
  3. 메시지 전송

    • 구독이 되어있지 않은 2번 방에 메시지가 전송된 경우


      전송된 메시지는 성공적으로 저장되지만 구독을 하지 않았으므로 사용자에게 메시지가 전송되지 않음

    • 구독이 되어있는 3번 방에 메시지가 전송된 경우


      전송된 메시지가 성공적으로 저장되고, 구독을 했으므로 사용자에게도 메시지가 전송됨

'기타' 카테고리의 다른 글

Netlify에 프론트 서버 띄우기  (0) 2025.04.17
JWT / 세션  (1) 2025.03.18
OpenAI API 비용 및 활용 고려 사항  (0) 2025.03.14
마크다운  (0) 2024.06.24