-
[📋] WebSocket(1)Project/Extra 2024. 7. 17. 23:57
개요
현재 프로젝트에서 채팅 기능을 만들어야 하는데, 회의 중에 WebSocket에 대해 얘기가 나왔고 이에 대해 좀 조사하고 정리하는 과제를 받았다.. 생각보다 양이 많다.
하지만 채팅 기능에 있어서는 필수 기능이니 이번에 공부하자는 차원에서 좀 꼼꼼히 살펴보겠다는 다짐..!
이론
https://www.youtube.com/watch?v=rvss-_t6gzg&t=853s
웹 소켓 이해에 이 영상이 많이 도움이 됐다.
1. WebSocket
필요성
게임, 채팅, 실시간 주식 거래 사이트 등 실시간으로 서버의 데이터를 동기화 해야하는 경우가 있는데, 이 때 실시간성을 보장해줘야 한다.
HTTP를 사용해도 Polling, Long Polling, Streaming 등 여러 실시간성을 보장할 수 있지만, 아무래도 HTTP보다는 조금 더 경제적인 웹 소켓을 사용한다.
HTTP vs WebSocket
- HTTP
- 비 연결성
- 매번 연결 맺고 끊고 과정의 비용 (handshake)
- request - response 구조
- 연결할 때마다 http header 및 통신에 필요한 정보를 계속 보내야 함
- 웹소켓
- 연결 지향
- 연결 유지
- 양방향 통신
- 한 번 연결하면 메시지들만 주고 받을 수 있음 = 경제적
SockJs & Socket.io
웹소켓을 지원하지 않은 웹사이트에서도 웹소켓을 사용하는 것과 비슷한 기능을 제공할 수 있는 라이브러리
WebSocket in Spring
- Spring에서는 기본적으로 한 번 연결된 WebSocket 연결의 Session을 유지함
→ 요청이 들어왔을 때, 사용자 식별이 가능하고 런타임에 필요 정보를 세션에 추가할 수 있음 - 하나의 그룹을 형성하는 Session 집합을 형성하는 기능은 없음 → 따로 집합 정보를 추가해줘야 함
2. STOMP
- Simple Text Oriented Messaging Protocol
- 간단한 메시지를 전송하기 위한 프로토콜
- 메시지 브로커 (publisher/subscriber)
- 외부 메시지 브로커(ex. RabbitMQ) 사용 가능
- 통신 메시지의 헤더에 값 세팅 가능
- 헤더 값을 수정해서 인증 처리 구현도 가능함
메시지 브로커
- subscriber(구독자)는 특정 Topic을 구독하고 publisher(발행자)는 특정 Topic으로 메시지를 날림
- 메시지를 관리하고, 발행자가 메시지를 날리면 구독 중인 구독자들에게 메시지를 보내줌
- 메시지가 [발행자 → 구독자]가 아니라 [발행자 → 메시지 브로커 → 구독자]의 형태로 전달됨
내부 브로커 문제점
- 서버 프로세스 자원(메모리)를 사용
- 2대 이상의 서버일 경우 프로세스 간 유저 세션 동기화 불가능
- 다른 서버의 구독자 존재 인식 불가
3. Test 도구
- Postman
HTTP로 restful api만 써봤는데웹 소켓도 테스트 할 수 있다.
- wscat
- 서버 또는 터미널에서 사용하기 좋다는 테스트 도구인데, 나중에 한 번 써볼지도?
의문
1. STOMP가 꼭 필요한가
WebSocket만으로 충분히 좋은 소켓 서버를 만들 수는 있다.
하지만 단순한 통신 구조라서, 해당 메시지가 어떤 요청인지, 어떻게 처리해야 하는지에 따라 채팅룸과 세션을 일일히 구현하고 메시지 발송 부분을 관리하는 추가 코드를 구현해 줘야 함
→ 편한 개발?을 위해서 STOMP가 거의 필수적인듯
STOMP의 pub/sub 방식을 이용 → 웹소켓 세션 관리 불필요
2. 외부 브로커를 사용해야 할까
STOMP의 단점 중 하나가 서버가 여러 개면 프로세스 간 유저 세션 동기화가 불가능하다는 점이다.
쉽게 설명하면, 서버A에 사용자a가 구독 중이면, 서버B는 사용자a의 존재를 인식할 수 없다는 것이다.
그렇지만 서버를 여러 개나 둘 정도로 큰 프로젝트일까 싶기도 한데, 확장성을 따지면 외부 브로커를 사용하는 게 맞을 것 같기도..
어떻게 아키텍처 구조가 나오냐에 따라 달라질 것 같아서 이 부분은 팀원과 조금 더 이야기를 나눠봐야할 것 같다.
https://brunch.co.kr/@springboot/695
Spring Websocket & STOMP
오랫만에 작성하는 기술블로그 포스팅입니다. 이 글에서는 스프링 부트 기반의 웹소켓 및 STOMP에 대해서 설명합니다. 이 글을 읽기 위해서는 기본적인 HTTP 지식이 있어야 하며, 스프링 프레임워
brunch.co.kr
STOMP의 sub/pub를 그림까지 그려주면서 설명해주신 그저 빛
참고
https://github.com/spring-guides/gs-messaging-stomp-websocket
GitHub - spring-guides/gs-messaging-stomp-websocket: Using WebSocket to build an interactive web application :: Learn how to the
Using WebSocket to build an interactive web application :: Learn how to the send and receive messages between a browser and the server over a WebSocket - spring-guides/gs-messaging-stomp-websocket
github.com
[Spring][WebSocket] 스프링 STOMP와 웹 소켓 개념 및 사용법 (Web Socket with STOMP) (1)
[Spring][WebSocket] 스프링 STOMP와 웹 소켓 개념 및 사용법 (Web Socket with STOMP) (1)
클라이언트와 서버가 통신할 때 HTTP 통신을 주로 사용한다. HTTP 통신은 다음과 같은 특징이 있다. 비연결성 (connectionless) : 연결을 맺고 요청을 하고 응답을 받으면 연결을 끊어버린다. 무상태성 (
growth-coder.tistory.com
[혼자왔니] 채팅 서버 구현을 통해 알아본 redis와 kafka의 차이점
[혼자왔니] 채팅 서버 구현을 통해 알아본 redis와 kafka의 차이점
RUAlone(혼자왔니) 혼밥 메이트 구하기 프로젝트
hi-june.github.io
'Project > Extra' 카테고리의 다른 글
[📋] Jwt Token 저장 위치 - http header vs cookie (0) 2024.07.27 [회의] BackEnd 4차 회의 (5) 2024.07.24 [📋] MariaDB 연동 시도 (1) 2024.07.17 [📋] QR 구현 방안 생각해보기 (0) 2024.07.17 [회의] BackEnd 2차 회의 (0) 2024.07.17 - HTTP