[ 2022.12.14 TIL-WebSocket ]

Coosla·2022년 12월 14일
0

TIL

목록 보기
27/29
post-thumbnail

WebSocket

✏️ WebSocket 개념

  • 기존의 단방향 HTTP 프로토콜과 호환되어 양방향 통신을 제공하기 위해 개발된 프로토콜
  • HTTP 프록시 및 중간 층을 지원하도록 설계되어 HTTP와 호환
  • HTML5 표준 기술, 브라우저와 서버사이의 동적인 양방향 연결 채널 구성

✏️ HTTP VS WebSocket

  • WebSocket은 연결 수립에서 HTTP 사용, 그 이후에는 WebSocket 프로토콜을 사용
  • header가 HTTP보다 작아 overhead가 적음

✏️ WebSocket 이전 통신 방법

  • Polling 방법
    • HTTP Request를 서버로 계속 요청해 이벤트 내용을 전달 받는 방식
    • 클라이언트 수가 많아지면 서버 부담이 커짐
  • Long Polling 방법
    • HTTP Request를 요청한 후 이 상태로 계속 기다리다 서버에서 전달할 이벤트가 있으면 Response 메시지를 전달하며 종료
    • 서버에서 전달하는 이벤트들의 시간 간격이 좁으면 polling과 별 차이 없음
    • 다수의 유저에게 동시에 이벤트가 발생될 경우 서버 부담이 커짐
  • Streaming 방법
    • 처음 HTTP Request를 요청할 때 연결을 하고, 이벤트를 Response할 때 해당 요청을 해제하지 않고 필요한 메시지만 보내기를 반복하는 방식

✏️ WebSocket 작동원리

  • 처음 요청이 들어왔을 때 WebSocket과 연결
    • HTTP 프로토콜을 통해 연결
  • 이후에는 WebSocket 프로토콜로 통신
  • 일정 시간이 지나면 연결을 자동으로 끊어짐

✏️ WebSocket 특징

  • 양방향 통신(Full - Duplex)
    • 데이터 송수신을 동시에 처리할 수 있는 통신 방법
    • 클라이언트와 서버가 서로에게 원할 때 데이터를 주고 받을 수 있음
    • 통상적인 HTTP 통신은 Client가 요청한 경우만 Server가 응답하는 단방향 통신
  • 실시간 네트워킹(Real Time-Networking)
    • 웹 환경에서 연속된 데이터를 빠르게 노출
    • 여러 단말기에 빠르게 데이터 교환
  • 웹 소켓 작동 원리
    • 연결은 HTTP 프로토콜
    • 일정 시간이 지나면 HTTP은 자동으로 끊김

✏️ WebSocket 장단점

  • 장점

    • 실시간이 요구되는 응용 프로그램의 개발을 구현 가능
    • 양방향 통신
  • 단점

    • 프로그램 구현에 보다 많은 복잡성을 초례

    • Cross Browser 문제

      • 브라우저마다 웹소켓을 지원 안하는 경우가 있음
    • Stateful

      • 서버와 클라이언트가 연결을 항상 유지하기 때문에 부하가 발생
      • 비정상적인 연결 끊김에 대한 대응이 필요

✏️ WebSocket이 필요한 경우

  • 실시간 양방향 데이터 통신이 필요한 경우
  • 많은 수의 동시 접속자를 수용해야 하는 경우
  • 브라우저에서 TCP 기반의 통신으로 확장해야 하는 경우
  • 개발자에게 사용하기 쉬운 API가 필요할 경우
  • 클라우드 환경이나 웹을 넘어 SOA(Service Oriented Architecture) 로 확장해야 하는 경우

SockJS

✏️ SockJS란?

  • 웹소켓과 비슷한 기능을 제공하는 브라우저 자바스크립트 라이브러리
  • 웹 서버 사이에서 짧은 지연시간
  • 크로스 브라우징을 지원

✏️ SockJS 사용법

let socket = new SockJS(연결할 URI)

STOMP

✏️ STOMP란?

  • WebSocket 위에서 동작하는 문자 기반 메시징 프로토콜로써 클라이언트와 서버가 전송할 메시지의 유형, 형식, 내용들을 정의하는 매커니즘

✏️ STOMP 특징

  • TCP와 웹소켓과 같은 신뢰할 수 있는 양방향 네트워크 프로토콜에서 사용 가능
  • pub / sub 구조
  • 메세지를 전송하고 받아 처리하는 부분이 정해져있음
  • http와 마찬가지로 frame을 사용해 전송하는 프로토콜

✏️ STOMP 장점

  • 장점
    • 메시징 프로토콜을 만들고, 메시지 형식을 커스터마이징할 필요 없음
    • 외브 브로커인 RabbitMQ, ActiveMQ등을 이용해 Subscription을 관리하고 메시지를 브로드캐스팅 가능
    • STOMP의 Destination 헤더를 기반으로, 컨트롤러의 @MessageMapping 메서드로 라우팅
    • DestinationMessage Type을 기반으로 메시지를 보호하기 위해, Spring Security를 사용할 수 있다.

✏️ STOMP 작동원리


1. 클라이언트가 헤더정보와 데이터를 담은 메시지를 전달
2. Request Channel에서 이를 알맞은 MessageHandler로 전달
3. @MessageMapping 어노테이션을 사용한 컨트롤러 로직 실행
4. 로직 처리 후, 반환된 값을 기반으로 메시지를 만들어 broker channel에 전달
5. broker channel에서는 SimpleBrokerMessageHandler를 통해 구독자를 가져옴
6. 구독자들에게 Response Channel로 메시지를 전달

✏️ Message Broker란?

  • Publisher로 부터 전달받은 메시지를 Subscriber에게 메시지를 주고 받게 해주는 중간 역할
  • 구독자는 SEND, SUBSCRIBE 명령을 통해서 메시지의 내용과 수신 대상을 설명하는 "destination" 헤더와 함께 메시지에 대한 전송이나 구독 가능
  • 브로커를 통해 연결된 다른 클라이언트로 메시지를 보내거나, 서버로 메시지로 보내 일부 작업을 요청 가능
  • In Memory Brocker
    • 단점
      • 세션을 수용할 수 있는 크기 제한
      • 장애 시 메시지 유실
      • 모니터링 불편
    • 이를 해결하기 위한 방법으로 RabbitMQ, ActivieMQ 등 외부 브로커를 사용할 수 있다.

✏️ WebSocket - STOMP 예제 코드

참고

profile
프로그래밍 언어 공부 정리

0개의 댓글