WebSocket vs SSE 언제, 어떻게 사용해야 할까? (feat. Spring Webflux)

소일로·2024년 10월 8일
1
post-thumbnail

글을 쓰게 된 동기

제가 글을 쓰게 된 이유는 그동안 실시간 알림 등의 처리를 WebSocket을 통하여만 구현하다가, 최근 Spring WebFlux와 SSE의 결합으로 구현해보게 되어 두 차이점에 대한 본질적인 궁금증이 생겼습니다. 이 두 기술의 근본적인 차이언제 어떤 상황에서 각 기술을 사용해야 하는지 한 번 정리해볼 필요가 있다고 생각했습니다. 이 글을 통해 그동안의 경험을 바탕으로 두 기술을 비교하고, 적절한 사용 사례를 정리해보고자 합니다. 부족한 점이 있으면 알려주시면 감사하겠습니다!


1. 기술 개요

WebSocket

  • 양방향 실시간 통신: 클라이언트와 서버 간 양방향으로 실시간 데이터를 주고받을 수 있습니다.
  • 프로토콜 전환: HTTP 핸드셰이크 후 WebSocket 프로토콜로 전환되어, 지속적인 연결 상태에서 데이터를 자유롭게 교환할 수 있습니다.
  • 텍스트 및 이진 데이터 지원: WebSocket은 텍스트 데이터뿐만 아니라 이진 데이터(바이너리)도 전송할 수 있습니다.
  • 고성능 통신: WebSocket은 연결 후 헤더 오버헤드가 적어, 실시간 통신에서 빠르고 효율적인 전송을 지원합니다.

Server-Sent Events (SSE)

  • 단방향 통신: 서버에서 클라이언트로 단방향으로 데이터를 지속적으로 전송합니다.
  • HTTP 기반: 기존 HTTP 연결을 유지하며, 서버가 클라이언트에게 주기적으로 데이터를 푸시합니다.
  • 텍스트 데이터 지원: text/event-stream MIME 타입을 사용하여 텍스트 데이터를 실시간으로 스트리밍합니다.
  • 자동 재연결: SSE는 연결이 끊어지면 자동으로 재연결을 시도하는 기능이 내장되어 있습니다.

2. SSE: 언제 적합할까?

  • *Server-Sent Events (SSE)는 서버가 클라이언트로 지속적으로 데이터를 푸시해야 하는 상황에서 매우 효과적인 방법입니다. 특히 단방향 통신**이 필요하고, 서버에서 클라이언트로 실시간 데이터를 지속적으로 전달하는 경우에 적합합니다.

SSE가 적합한 시나리오

  1. 단방향 업데이트:
    • 클라이언트에서 서버로의 요청이 필요하지 않고, 서버가 클라이언트로 지속적으로 데이터를 전송할 때, SSE는 간단하고 효과적인 솔루션입니다. 예를 들어, 실시간 알림 시스템, 주식 시세 업데이트, 뉴스 피드 등의 애플리케이션에서 서버가 클라이언트로 정보를 푸시하는 용도로 SSE가 적합합니다.
  2. 자동 재연결 지원:
    • 네트워크 연결이 불안정하거나 끊어졌을 때, 클라이언트가 자동으로 재연결하는 기능이 필요하다면, SSE는 별도의 재연결 로직을 구현할 필요 없이 자동으로 처리됩니다. 이는 클라이언트 측에서 안정적인 데이터 수신을 보장해 줍니다.
  3. HTTP 기반 인프라와의 호환성:
    • SSE는 기존 HTTP/1.1 연결을 유지하면서 작동하기 때문에, 추가적인 프로토콜 전환 없이 쉽게 기존의 HTTP 인프라에 통합될 수 있습니다. 이를 통해 복잡한 설정이나 서버 구성이 필요하지 않으며, HTTP/2와 함께 사용하면 다중화된 연결을 통해 성능을 더욱 향상시킬 수 있습니다.
  4. 브라우저 호환성:
    • SSE는 대부분의 현대적인 브라우저에서 기본적으로 지원되므로, 클라이언트 측 구현도 간단합니다. JavaScript에서 EventSource 객체를 사용하여 쉽게 서버의 스트림 데이터를 받을 수 있습니다.

3. SSE와 Spring WebFlux 의 결합

SSE는 실시간 데이터 스트리밍을 처리할 때 특히 유용하며, 서버에서 클라이언트로 데이터를 지속적으로 보내야 하는 상황에서 많이 사용됩니다. SSE는 주로 서버에서 많은 데이터를 클라이언트에게 스트리밍할 때 사용되며, 단방향 통신이 필요할 때 매우 유용합니다. 또한, 서버 리소스 관리가 중요한 애플리케이션에서 효율적으로 동작합니다.

SSE와 Spring WebFlux: 언제 사용하면 좋은가?

SSE는 Spring WebFlux와 함께 사용하면 리액티브 프로그래밍의 이점을 극대화할 수 있습니다. WebFlux는 비동기 처리 및 논블로킹 I/O를 지원하기 때문에, 다수의 클라이언트에 대해 효율적으로 SSE를 통해 데이터를 푸시할 수 있습니다.

WebFlux와 함께 사용할 때 효과적인 경우

  1. 대규모 실시간 스트리밍:
    • 서버에서 수많은 클라이언트에게 실시간으로 데이터를 지속적으로 스트리밍할 때 WebFlux와의 결합은 매우 효율적입니다. WebFlux는 논블로킹 I/O를 통해 대규모 트래픽을 처리하는 데 최적화되어 있어, 여러 클라이언트에게 실시간 알림이나 데이터 스트림을 푸시하는 작업에 유리합니다.
  2. 리액티브 데이터베이스와 결합:
    • WebFlux와 함께 리액티브 데이터베이스(예: R2DBC)를 사용하면, 데이터베이스와의 상호작용까지 비동기적으로 처리할 수 있습니다. 서버가 DB에서 데이터를 불러와 클라이언트로 스트리밍하는 경우, WebFlux는 이 작업을 효율적으로 관리해 서버 자원을 아낄 수 있습니다.

WebFlux와 함께 사용하기 적합하지 않은 경우

  1. 블로킹 I/O를 사용하는 경우:
    • 만약 애플리케이션이 전통적인 JDBC 기반의 블로킹 데이터베이스와 상호작용해야 한다면, WebFlux와 SSE의 성능이 제한됩니다. WebFlux는 논블로킹 방식으로 작동하는 반면, 블로킹 I/O는 리소스를 점유하므로 서버가 많은 클라이언트에게 동시에 데이터를 스트리밍하는 상황에서 병목이 발생할 수 있습니다.
  2. 작은 규모의 단순한 애플리케이션:
    • WebFlux의 리액티브 특성은 대규모 실시간 데이터 처리를 위해 설계되었습니다. 만약 애플리케이션이 소규모이거나 간단한 스트리밍 요구사항을 가지고 있다면, 굳이 복잡한 WebFlux를 도입할 필요 없이, 전통적인 Spring MVC 기반의 SSE 처리만으로도 충분할 수 있습니다.

4. WebSocket: 언제 적합할까?

WebSocket은 클라이언트와 서버 간의 양방향 실시간 통신이 필요한 상황에서 가장 적합한 선택입니다. 특히 텍스트 데이터뿐만 아니라 이진 데이터도 실시간으로 주고받아야 하는 경우, WebSocket은 효율적입니다. WebSocket은 다양한 실시간 애플리케이션에서 널리 사용되며, 지속적인 데이터 전송과 상호작용이 필요한 경우 뛰어난 성능을 제공합니다.


5. SSE와 WebSocket 사용 시 주의할 점

SSE 사용 시 주의할 점

  1. 브라우저 연결 제한:
    • 대부분의 브라우저에서는 최대 6개의 SSE 연결까지만 허용됩니다. 즉, 하나의 도메인에서 6개 이상의 SSE 연결을 동시에 시도할 경우, 추가 연결이 제한될 수 있습니다. 여러 탭을 열거나 다중 스트리밍이 필요한 애플리케이션에서는 이 제한을 고려해야 합니다.
  2. 단방향 통신:
    • SSE는 서버에서 클라이언트로의 단방향 데이터 전송만 가능하기 때문에, 클라이언트에서 서버로 데이터를 전송해야 하는 양방향 통신이 필요한 경우 적합하지 않습니다. 이 경우 WebSocket과 같은 양방향 통신 프로토콜을 사용하는 것이 좋습니다.
  3. 인터넷 익스플로러(IE) 지원 부족:
    • 대부분의 최신 브라우저는 SSE를 기본적으로 지원하지만, 인터넷 익스플로러(IE)에서는 SSE를 지원하지 않습니다. 따라서, 브라우저 호환성이 중요한 애플리케이션이라면 이를 고려해야 합니다.

WebSocket 사용 시 주의할 점

  1. 방화벽 및 프록시:
    • WebSocket은 기존 HTTP 프로토콜과는 다른 방식으로 연결을 유지하기 때문에, 방화벽이나 프록시 서버에서 WebSocket 연결을 차단하거나 제한하는 경우가 있을 수 있습니다. 특히 기업 환경이나 보안이 중요한 네트워크에서는 WebSocket 연결이 원활하지 않을 수 있습니다.
  2. 재연결 처리:
    • WebSocket은 기본적으로 자동 재연결 기능을 제공하지 않습니다. 만약 네트워크 문제로 인해 연결이 끊어질 경우, 클라이언트 측에서 재연결 로직을 별도로 구현해야 합니다. 이를 위해서는 클라이언트에서 연결 상태를 지속적으로 모니터링하고, 재연결 시도를 하는 추가적인 구현이 필요합니다.

6. SSE vs WebSocket: 어떤 기술을 선택해야 할까?

SSE를 선택해야 하는 경우

  • 서버에서 클라이언트로 단방향 실시간 데이터를 전송해야 하는 경우.
  • HTTP 기반 인프라에서 쉽게 통합할 수 있어야 하고, 설정이 간단해야 할 때.
  • 자동 재연결이 필요한 경우.
  • 텍스트 데이터 스트리밍이 주된 작업일 때.
  • Spring WebFlux와 리액티브 데이터베이스를 함께 사용해 대규모 실시간 데이터를 처리할 때.

WebSocket을 선택해야 하는 경우

  • 클라이언트와 서버 간에 양방향 실시간 데이터 통신이 필요한 경우.
  • 이진 데이터를 주고받아야 하는 경우.
  • 낮은 오버헤드로 실시간 상호작용이 중요한 애플리케이션을 개발할 때.
  • 빠르고 효율적인 응답 시간이 중요한 경우.

7. 결론

SSEWebSocket은 각각의 장점과 한계를 가지고 있으며, 애플리케이션의 요구 사항에 따라 적절히 선택해야 합니다. SSE단방향 실시간 데이터 전송이 필요한 상황에서 효과적이며, 특히 Spring WebFlux와 결합하면 대규모 실시간 스트리밍에서 성능을 극대화할 수 있습니다. 반면, WebSocket은 양방향 실시간 통신과 이진 데이터 전송이 필요한 경우에 적합한 고성능 솔루션입니다.

두 기술은 각각의 제약 사항도 존재하기 때문에, 여러 브라우저 탭이나 방화벽 문제, 자동 재연결 여부 등 주의할 점을 고려하여 선택해야 합니다. 대규모 클라이언트 처리 및 비동기 스트리밍이 필요할 경우 SSE와 WebFlux의 결합이 뛰어난 성능을 제공할 수 있습니다.

profile
백엔드 개발자

0개의 댓글