CS

[Network] 실시간 통신 - webSocket

KJihun 2024. 1. 31. 16:25
728x90

 

 

webSocket

서버 - 클라이언트 간 언제든 양방향 통신 및 데이터 전송이 가능하도록 Socket Connection을 유지하는 기술이다.

SNS, LoL같은 멀티플레이어 게임, 구글 Doc, 증권거래, 화상채팅 등 Real-time web application구현을 위해 널리 사용되고 있다.

 

 

연결단계

1. HTTP 통신을 통해 서버에 연결한다. (일반 웹 브라우저에서 서버로의 일반적인 HTTP 요청과 응답과 동일)

2. 연결 후, webSocket을 사용하여 실제 양방향 통신을 위한 Socket Connection을 설정한다.

    HTTP Upgrade header를 사용하여 HTTP 프로토콜에서 WebSocket 프로토콜로 전환(WebSocket HandShake)

3. webSocket연결 후, HTTP와 webSocket 은 독립적으로 동작한다.

 

  • 클라이언트가 접속 요청을 하고 웹 서버가 응답한 후 연결을 끊는 것이 아닌 Connection을 그대로 유지하고 클라이언트의 요청 없이도 데이터를 전송할 수 있는 프로토콜이다.
  • WebSocket API는 기본적인 양방향 통신만을 제공하기에, 메시지 포맷이나 구조는 보통 STOMP를 통해 관리하며, 복잡한 기능은 오픈 소스 라이브러리를 사용하여 보완할 수 있다.

 

 

STOMP (Streaming Text Oriented Messaging Protocol)

메시지 브로커와 클라이언트 간 통신하는 데 사용되는 프로토콜이다.

websocket 위에서 동작하는 프로토콜로써, 클라이언트 - 서버 간 전송할 메세지 유형, 형식, 내용 등을 정의한다.

메시징 방식만 잘 정의하면 STOMP를 쓰지 않고 WebSocket만으로도 잘 만들 수 있으나 추가적으로 구현해주어야 될 것이 많다.

pub/sub 방식을 사용하여 메세지 브로커를 발행자/구독자로 구분하여 발행자의 메세지를 구독자에게 전달한다.

 

 

 

 

pub/sub 구조

  • 발행 - 구독의 의미로 소프트웨어 아키텍처 패턴 중 하나이다.
  • 메시지 브로커를 통해 다수의 컴포넌트나 시스템 간 메시지를 주고받을 수 있게 해준다
  • 확장이 용이하며 낮은 결합도를 유지할수 있고, 비동기적으로 동작하므로 실시간성이나 뫂은 처리량을 오규하는 시스템에 적합하다.
  • ex: 채팅방 생성 시, chatingRoom UUID를 구독자에게 전달하여 통신이 가능하도록 할 수 있다.

 

Message Broker(메세지 브로커)

Publisher(송신자)로부터 전달받은 Message(메세지)를 동일한 Topic의  Subscriber(수신자)로 전달해주는 중간 역할을 한다.

한마디로 메시지를 저장하고 라우팅하며, 통신의 중개자 역할을 수행한다.

메세지가 적재되는 공간을 Message Queue(메시지큐), 메시지의 그룹을 Topic(토픽) 이라고 한다.

대표적으로 Kafka, Redis, RabbitMQ, Celery 가 있다.

 

 

 

  • 실시간 데이터 처리를 할 때 DB 에서 조회하여 처리하는 것 보다 성능이 좋지만, 적재된 데이터 그대로를 사용해야 한다(필터링이 불가능하다) => 적재 시 필터링된 데이터를 적재하던가 적재된 데이터를 필터링하여 사용해야 한다.
  • 장기적인 보관을 할 수 없다.
  • Queue가 가득 차서 더는 Queue에 메시지를 저장할 수 없는 상황에는 메세지를 다른 곳에 보존하거나 버려지게 된다.
  • 큐를 운영하기 위한 추가적인 자원이 필요하다.
  • 큐에 들어가고 나오는 과정에서 피할 수 없는 오버헤드가 발생할 수 있다.

 

 

 

 

 

이외에도 websocket은 브라우저별로 지원하는 웹소켓 버전이 다르며, 지원하지 않는 브라우저도 존재한다.

webSocket을 지원하지 않는 환경에서도 실시간 통신을 가능하게 하기 위해 대표적으로 사용되는 방법은 SockJS를 사용하는 방식이다.

webSocket을 지원하지 않는 환경에서는 주로 Long Polling 방식으로 fallback 한다.

 

SockJS

 

 

 

 

 

sockJS

 

velog

 

velog.io

 

 

실시간 네트워크 통신이 가능한 다른 기술

  • WebRTC: P2P 방식. 모든 사용자가 서버 없이 직접 연결할 수 있어야 한다
  • MQTT: TCP/IP 기반의 메시징 프로토콜로서, 주로 IoT - 서버 간에 쓰인다
  • Comet, SSE 등은 단방향 통신
 

실시간으로 소통하고 싶다면?

트센 ㄱㅈㅇㅇㅇ

velog.io

 

 

 

 

springboot Web socket 구현

 

SpringBoot + WebSocket server 간단하게 구현해보기

스프링부트에서 웹소켓 서버 세팅을 하여 실시간으로 메세지를 주고받을 수 있는 서버를 만들어 보겠습니다. 정말 간단합니다. 먼저 의존성을 주입해줍시다. [Gradle] implementation 'org.springframework.b

yjkim-dev.tistory.com