웹소켓
웹소켓(WebSocket)이란 하나의 TCP 접속에 전이중 통신 채널을 제공하는 컴퓨터 통신 프로토콜이다.
웹소켓을 왜 사용하는 걸까?
채팅과 같은 메세지 송수신에서 별도의 요청없이 데이터를 수신할 수 있기 때문에 클라이언트와 서버간 실시간 통신이 가능하다.
소켓 사용 분야: 게임 어플리케이션, 챗봇, 푸시알림, SNS, 채팅 등
채팅구현은 웹소켓으로 밖에 못하나?
그건 아니다!
찾아본 결과 REST API, SSE, Long Polling, HTTP Polling 등 다양한 방식이 있었다.
Youtube LIVE는 HTTP Polling방식을 이용했다고 하는데 WebSocket이랑 무엇이 다른걸까?
Type | 장점 | 단점 |
HTTP Polling |
서비스 구현이 간단 & 편리 | ● 유저가 작성한 메시지 전달 속도는 Polling 주기에 따라 결정됨 ● Polling된 시점에 따라 사용자가 보고 있는 채팅의 내용이 다를 수 있음 ● 메시지 Sync를 위해 많은 클라이언트에서 Polling주기를 짧게 조정하며 서버 부하가 심해짐 |
Web Socket |
● 유저가 작성한 메시지의 전달을 서버에서 진행하여 즉각 전달이 가능함 ● 모든 시점에서 유저가 보고있는 채팅의 내용이 일치함 |
● HTTP Polling에 비해 복잡한 구현방식 ● 서버당 연결 가능한 클라이언트 수가 제한됨 ● 서버와 Connection유지를 위한 리소스가 낭비됨 |
출처: https://kakaoentertainment-tech.tistory.com/109
이번 포스팅은 웹소켓에 대한 이론 내용이지만 프로젝트에 적용을 위한 조사이기에 훗날 사용자가 채팅을 이용하는데 있어 메시지 전달 지연 문제는 치명적이라 생각하여 나 역시 웹소켓으로 구현해보려 한다.
+ 채팅 메시지 영구 저장소(DB)
사실 채팅에는 NoSQL을 많이 사용하는 것으로 알고 있다. 하지만 이번에 나는 MYSQL을 사용하되, 직접 불편함을 느끼고 DB를 교체해보는 과정이 의미있을 것 같다는 판단 하에 MongoDB같은 NoSQL 을 선택하지 않았다.
하지만? 왜 다들 NoSQL(이중에서도 MongoDB)을 사용하는지에 대해 알아보려 한다.
● 채팅에서는 사실상 메시지 수정/삭제보단 저장/조회 Operation이 많이 발생한다.
● Schemaless특성(구조유연)을 통해 다양한 형식의 메시지를 유연하게 저장/관리할 수 있다.
● 계층적인 도큐먼트 형태로 저장되기에 메시지 내 다양한 객체를 포함하여 한번에 저장가능, 효과적으로 메시지 내 모든 객체 관계를 저장/탐색할 수 있다.
● Cloud형태로 제공하는 서버( MongoDB Atlas)를 사용할 수 있기 때문에 DB시스템에 대한 관리 리소스가 별도로 필요하지 않다.
웹 소켓 동작 과정
1. 클라이언트가 HTTP 프로토콜로 Handshake 요청을 한다.
2. 이에 대해 서버는 HTTP 상태코드 101을 응답해준다.
3. 이후 통신 프로토콜을 WebSocket 프로토콜로 변환해 데이터를 전송할 수 있도록 한다.
Spring Socket의 종류
1. WebSocket (HTML5 이후에 나옴)
: 웹 소켓은 기존의 단방향 HTTP프로토콜과 호환되어 양방향 통신을 제공하기 위해 개발된 프로토콜이다.
서버와 클라이언트 사이에 Socket 커넥션을 유지하며 양방향 통신을 가능하게 하는 기술이다.
웹 소켓은 통신을 위해 ws(HTTP 에 대응)를 사용하는데 보안을 위해서는 wss를 사용하여 통신해야 한다는 것!
더불어, 일반 Socket통신과 다르게 HTTP 80, HTTPS 443포트 위에서 동작하도록 설계되어 있어 별도의 포트를 열지 않아도 된다고 한다.
(IE10부터 사용 가능)
2. SockJS
: HTML5 이전에 구현된 서비스에선 웹소켓 기술을 사용할 수 없기 때문에 해당 서비스에서 웹소켓처럼 동작할 수 있도록 도와준다. SockJS는 네이티브 웹소켓을 사용하려 하는 WebSocket 클라이언트이며, 웹소켓을 지원하지 않는 구형 브라우저에 대체 옵션을 제공한다.
우선 WebSocket 연결을 시도하고 실패할 시 SSE, Long-Polling과 같은 HTTP기반 기술로 전환해 다시 연결을 시도한다.
(IE8부터 사용 가능)
3. STOMP(Simple Text Oriented Message Protocol ) :토픽 구독 방식
: 메시지 전송을 효율적으로 하기 위한 프로토콜로, 클라이언트와 서버가 전송할 메시지의 유형, 형식, 내용들을 정의하는 매커니즘이다. 웹소켓만을 이용하면 해당 메시지가 어떤 요청인지, 어떻게 처리해줘야 하는지, 세션 관리 방법 등을 직접 구현해야 하기에 복잡하지만 STOMP를 사용하면 보다 편리하게 관리 가능하다.
Publish(topic / queue) & Subscribe 구조로 동작하며 해당 구조는 메시지를 공급하는 주체, 소비하는 주체를 분리해 제공하는 메시징 방법이기에 메시지 송,수신에 대한 처리를 명확하게 정의할 수 있다.
따라서 이 세가지를 독립적으로 사용할 수도 있지만 필요 기능과 환경에 따라 조합해 사용할 수도 있다고 하니 고민해보는 것이 좋겠다.
[Spring] Web-Socket, SockJS, STOMP 이론
WebSocket, SockJS, STOMP 소개 WebSocket WebSocket은 기존의 단방향 HTTP 프로토콜과 호환되어 양방향 통신을 제공하기 위해 개발된 프로토콜이다. 웹 소켓은 HTTP를 사용하는 네트워크 데이터 통신의 단점을
yoo-dev.tistory.com
가비아 라이브러리
IT 콘텐츠 허브
library.gabia.com
채팅 시스템 설계
가상 면접 사례로 배우는 대규모 시스템 설계 기초 챕터 12 스터디
velog.io
라이브채팅 플랫폼 구현기 1탄 : 개발 언어 및 기반기술 조사
2022년 초, 멜론뮤직어워드(MMA) 2022 행사를 준비하는 과정에서 기존 MMA 생중계 시 사용되는 댓글 시스템이 사용자 참여에 불편함이 있었고, 이를 해소하기 위해 '실시간 채팅 플랫폼'의 필요성이
kakaoentertainment-tech.tistory.com
WebSocket, SockJs, STOMP를 이용한 웹 채팅 구현 - (1) Spring boot
Spring boot 세팅 부분
velog.io
'백엔드' 카테고리의 다른 글
(Design Pattern) 디자인 패턴 들어가기 (핵심 14가지 패턴) (1) | 2025.03.09 |
---|---|
JPA란?(Java Persistence API) with 영속성 컨텍스트 (0) | 2024.12.01 |
STOMP? STOMP 딥다이브 (0) | 2024.11.24 |
⚠️ 스프링 시큐리티(Spring Security)와 그 작동 구조 (0) | 2024.10.05 |
[SERVER] CORS preflight request 에러 (0) | 2024.07.21 |