실시간 통신 기술과 단체 채팅방 구축

실시간 통신을 구현하는 다양한 기술들이 존재하며, 각각의 장단점이 있습니다. 프로젝트의 성격과 요구 사항에 따라 적합한 방식을 선택하는 것이 중요합니다. 모임을 위한 단체 채팅방 프로젝트에서 STOMP와 WebSocket을 사용하게 된 이유를 알아보겠습니다.


1. 실시간 통신을 위한 다양한 기술들

  • Long Polling
    클라이언트가 서버에 요청을 보내고, 서버가 데이터가 준비될 때까지 연결을 유지하는 방식.
    • 장점: 일반 Polling보다 실시간 반응이 우수하여, 간단한 알림 시스템이나 간헐적 업데이트에 적합합니다.
    • 단점: 요청과 응답이 지속되어 서버에 부하를 줄 수 있고, 사용자가 많아질수록 효율이 떨어집니다.
  • Server-Sent Events (SSE)
    서버에서 클라이언트로 일방적으로 데이터를 푸시하는 방식. HTTP 연결을 통해 실시간 데이터를 지속적으로 전달.
    • 장점: 서버에서 다수의 클라이언트로 안정적으로 단방향 데이터를 전달할 수 있어 알림에 유리합니다.
    • 단점: 양방향 통신이 필요할 경우에는 적합하지 않고, 브라우저에서만 지원되는 경우가 많아 한계가 있을 수 있습니다.
  • Kafka
    대규모 데이터 처리에 유리한 분산 메시징 시스템으로, 데이터의 지속성과 내구성이 중요한 환경에 사용.
    • 장점: 대규모 데이터와 이벤트 스트리밍을 효율적으로 처리할 수 있어 로그 관리, 이벤트 소싱 등에 적합합니다.
    • 단점: 실시간 채팅이나 알림같이 즉각적인 반응이 필요한 상황에는 적합하지 않습니다. 설정과 운영이 다소 복잡할 수 있습니다.
  • WebSocket
    TCP 연결을 통해 서버와 클라이언트 간에 지속적인 양방향 통신이 가능.
    • 장점: 양방향 통신이 가능하며, 대화형 서비스나 실시간 채팅에 최적화되어 있습니다.
    • 단점: 초기 설정이 다소 복잡하고, 네트워크 환경에 따라 제약이 있을 수 있습니다.
  • Pusher
    실시간 기능을 쉽게 구현할 수 있는 BaaS 형태의 서비스로, 채팅, 알림 등 다양한 실시간 기능 구현 가능.
    • 장점: 서버를 직접 관리할 필요가 없어, 개발과 유지보수가 간단합니다. SDK와 문서가 잘 구성되어 있어 설정이 빠르고 직관적입니다.
    • 단점: 사용량이 많을 경우 비용이 발생하며, 특정 요구에 맞춘 커스터마이징에는 제한이 있을 수 있습니다.


2. 프로젝트에서 모임을 위한 단체 채팅방

이번 프로젝트는 모임을 위한 단체 채팅방을 구축하는 것입니다. 채팅방은 다양한 사용자가 참여하여 실시간으로 대화를 나눌 수 있어야 하고, 특정 모임마다 개별 채팅방을 관리할 수 있어야 합니다. 이를 위해 채팅방마다 구독 채널을 설정하고, 메시지를 효율적으로 전송할 수 있는 구조화된 메시징이 필요했습니다.

WebSocket의 강점

  • WebSocket은 서버와 클라이언트 간에 지속적인 양방향 연결을 가능하게 하여 실시간 데이터를 주고받기 위한 기본 토대 역할을 합니다.
  • 성능 면에서 탁월하여 빠르게 데이터를 송수신할 수 있고, 지속적인 연결을 통해 즉각적인 반응이 요구되는 채팅이나 알림 시스템에 적합합니다.

STOMP와의 조합이 필요한 이유

  • WebSocket은 기본 메시지 포맷이나 메시지 라우팅에 대한 기능이 부족하기 때문에, 채팅방과 같이 여러 사용자가 각각 다른 채널에서 주고받는 메시지를 관리하기에는 한계가 있습니다.
  • STOMP(Simple/Streaming Text Oriented Messaging Protocol)는 WebSocket 위에 메시징 프로토콜을 더해 메시지 구독, 전송, 라우팅을 쉽게 구현할 수 있도록 도와줍니다.
  • 특정 채널에 대한 구독과 다양한 이벤트 처리가 필요할 때, STOMP는 각 채팅방을 독립적으로 운영할 수 있는 구조화된 메시징 시스템을 제공합니다.

STOMP + WebSocket 조합

  • 모임별 채팅방을 별도로 관리할 수 있고, 다양한 이벤트를 효율적으로 처리할 수 있어 복잡한 채팅 기능을 구현할 수 있습니다.
  • 스프링에서 STOMP와 WebSocket의 조합을 통해 채널 구독, 메시지 전송, 사용자 연결 관리를 간단하게 구현할 수 있어 생산성과 유지보수성이 높아집니다.


3. WebSocket과 STOMP의 차이

  • WebSocket
    WebSocket은 서버와 클라이언트 간의 실시간 통신을 위한 프로토콜로, 양방향 연결을 유지하며 데이터를 빠르게 주고받을 수 있습니다. 실시간 반응이 필요한 서비스에 적합하지만, 메시지 전송의 구조가 없어 복잡한 메시징 시스템을 구현하기에는 부족할 수 있습니다.

  • STOMP (Simple/Streaming Text Oriented Messaging Protocol)

    • STOMP는 WebSocket 위에서 사용되는 메시징 프로토콜로, 메세지의 구조를 정의하고, 연결/구독 등의 기능을 제공하여 복잡한 메시징을 쉽게 구현할 수 있습니다. 실시간 채팅방이나 알림 시스템에서 흔히 사용됩니다.
    • WebSocket만으로는 관리하기 어려운 메시징 기능을 지원하여, 특정 채널 구독, 메시지 구조화, 이벤트 처리가 더 편리합니다.


결론

양방향 실시간 통신에 적합한 기술로 Pusher와 WebSocket이 있었으나, Pusher는 유료라는 점에서 제한이 있었습니다. 대신 WebSocket과 STOMP를 함께 사용하면 WebSocket의 실시간 성능과 STOMP의 메시지 구독 관리 기능을 결합할 수 있어 구조화된 메시지 처리가 필요할 때 유리하다는 점을 알게 되었습니다.

이러한 이유로 비용 효율성과 구조화된 메시징을 모두 충족할 수 있는 WebSocket + STOMP 조합을 선택하게 되었습니다.