주뇽's 저장소

[Spring Boot] 실시간 채팅 기능을 위한 WebSocket, SockJS, STOMP 본문

웹개발/SpringBoot

[Spring Boot] 실시간 채팅 기능을 위한 WebSocket, SockJS, STOMP

뎁쭌 2024. 2. 29. 14:36
728x90
반응형

[Spring Boot] 실시간 채팅 기능을 위한 WebSocket, SockJS, STOMP

실시간 채팅 기능은 현대 웹 애플리케이션에서 필수적인 요소 중 하나이다. 사용자가 실시간으로 정보를 교환할 수 있게 함으로써, 애플리케이션의 상호작용성과 사용자 경험을 크게 향상시킨다. 이 글에서는 Spring Boot 애플리케이션에 실시간 채팅 기능을 구현하기 위한 세 가지 주요 기술인 WebSocket, SockJS, STOMP에 대해 소개하고, 각각의 장단점 및 적합한 사용 사례를 탐구한다.

 

WebSocket

WebSocket 프로토콜은 실시간 양방향 통신을 가능하게 하는 웹 표준이다. 이는 서버와 클라이언트 간의 지속적인 연결을 유지하며, 데이터를 신속하게 교환할 수 있도록 설계되었다. WebSocket은 특히 실시간 애플리케이션에 적합하며, 대부분의 최신 웹 브라우저에서 널리 지원된다.

장점

  • 효율적인 실시간 통신이 가능하다.
  • HTTP 폴링에 비해 통신 오버헤드가 적다.
  • 대부분의 최신 브라우저에서 지원돤다.

단점

  • 구형 브라우저에서는 지원되지 않을 수 있다.
  • 메시지 포맷이나 연결 관리 등을 개발자가 직접 처리해야 하는 경우가 있다.

SockJS

SockJS는 WebSocket API를 모방하되, WebSocket이 지원되지 않는 브라우저나 네트워크 환경에서도 작동할 수 있도록 설계된 JavaScript 라이브러리이다. SockJS는 다양한 트랜스포트(예: AJAX 롱 폴링)를 사용하여 최대한 WebSocket과 유사한 환경을 제공합니다. Spring에서 사용하려면 sockjs-clinet 라이브러리가 필요하다.

장점

  • WebSocket이 지원되지 않는 환경에서도 작동합니다.
  • 다양한 트랜스포트 메커니즘을 통해 브라우저 호환성을 확보합니다.

단점

  •  다양한 트랜스포트 메커니즘을 지원하기 위한 추가적인 복잡성이 발생할 수 있습니다.
  • WebSocket에 비해 성능이 다소 떨어질 수 있습니다.

 

STOMP (Simple Text Oriented Messaging Protocol)

 STOMP는 단순 텍스트 지향 메시징 프로토콜로, WebSocket 위에서 동작하는 메시징 서브프로토콜이다. STOMP를 통해, 클라이언트와 서버 간의 메시지 교환을 위한 고수준의 추상화를 제공하며, 메시지 기반 미들웨어와의 쉬운 통합을 가능하게 한다. SockJS에 종속적이다!!

장점

  • 메시지 브로커와의 호환성이 뛰어나다.
  • 간단한 프레임워크를 통해 메시지 구독, 발행, 라우팅 등을 쉽게 구현할 수 있다.
  • 다양한 프로그래밍 언어와 플랫폼에서 사용 가능하다.

단점

  • 메시지 포맷팅과 프로토콜 규칙으로 인한 약간의 오버헤드가 발생할 수 있다.
  • 메시지 브로커와의 통합이나 STOMP 서버 설정이 초보자에게는 복잡할 수 있다.



결론

여러 개의 채팅방이 필요한 경우: STOMP 사용 권장

  • 토픽 기반 구독 관리: STOMP 프로토콜은 클라이언트가 특정 '토픽'을 구독하고, 서버가 해당 토픽에 메시지를 발행할 수 있도록 지원한다. 이는 각 채팅방을 별도의 토픽으로 관리할 수 있게 해주며, 사용자는 자신이 관심 있는 채팅방(토픽)에만 메시지를 수신하게 된다.
  • 메시지 브로커와의 통합:** STOMP는 메시지 브로커(예: RabbitMQ, ActiveMQ)와의 통합을 용이하게 한다. 이를 통해 다수의 채팅방과 대규모 메시지 트래픽을 효율적으로 관리할 수 있다.
  • 복잡한 메시징 시나리오 지원: 여러 채팅방에서 발생할 수 있는 다양한 메시징 요구사항(예: 메시지 필터링, 권한 관리)을 쉽게 구현할 수 있다.

하나의 큰 채팅방만 필요한 경우: WebSocket 사용 권장

  • 간단하고 빠른 통신: 하나의 큰 채팅방에서는 복잡한 메시징 루틴보다는 빠르고 효율적인 메시지 전송이 중요하다. WebSocket은 저수준 프로토콜로서, 서버와 클라이언트 간의 지연 시간을 최소화하며 실시간 통신을 제공한다.
  • 스케일링 : 대규모 사용자가 동시에 접속하는 큰 채팅방의 경우, WebSocket 세션 관리와 메시지 전송을 위한 서버 사이드 최적화가 중요하다. WebSocket은 이러한 환경에서 서버 리소스를 효율적으로 사용할 수 있도록 해준다.
  • 구현의 단순성: 하나의 채팅방만을 다루는 경우, STOMP나 다른 메시징 프로토콜을 사용하는 것보다 WebSocket만으로도 충분히 요구 사항을 만족시킬 수 있다. 이는 개발 과정을 단순화하고, 유지보수를 용이하게 한다.