Real‐time Notification&Chat Library - dev-team-projects/DeliTalk GitHub Wiki
작성자 : 정혜영
실시간 알림/채팅 구현 방식
🚀 WebSocket
-
특징
- 양방향 통신 채널 제공
- 클라이언트와 서버 간 실시간 데이터 교환 가능
- 별도의 HTTP 요청 없이 데이터 수신 가능
- 지연 시간이 다소 짧음
-
단점
- 구현 방식이 복잡함
- 서버당 연결 가능 클라이언트 수가 제한됨
- 서버와 연결 유지를 위한 리소스가 낭비됨
클라이언트 ⇄ 서버
📲 SSE(Server-Sent Events)
-
특징
- 서버에서 클라이언트로 단방향 데이터를 실시간으로 전송
- 웹소켓보다 비교적 구현이 간단함
-
단점
- 양방향 통신이 지원되지 않는다
서버 → 클라이언트
📡 Polling VS Long-Polling
Polling | Long-Polling | |
---|---|---|
공통점 | 클라이언트가 서버에 요청을 보낸다 | |
차이점 | 클라이언트가 일정 주기마다 서버에 요청을 보내고, 서버에 새로운 데이터가 있으면 이를 받아온다 | 클라이언트가 요청을 보낸 후, 서버에 새로운 데이터가 발생할 때까지 응답을 지연시킨다 |
장점 | 비교적 구현이 쉽다 | Polling 방식 보다 실시간성이 높다 |
흐름 | 클라이언트 → 서버 (주기적 요청) 서버 → 클라이언트 | 클라이언트 → 서버 (대기) 서버 → 클라이언트 |
📚 실시간 알림/채팅 라이브러리
🔌 socket.io
웹 소켓 연결을 통해 실시간 양방향 통신을 지원하는 JavaScript 라이브러리
- 단점
- Java(Spring)에서는 공식 지원이 없음
📨 STOMP
WebSocket 위에서 동작하는 메시지 프로토콜
- 특징
- pub/sub 기반으로 동작하여 송수신에 대한 처리를 특정 어노테이션만으로 효율적으로 해결이 가능함
- 메시지에 헤더값을 줄 수 있음
- 메시지-브로커-클라이언트로 전달하는 구조
- HTTP 기반 보안 설정과 공통된 검증을 적용할 수 있음
- Spring 환경에 최적화 되어있음
🌐 SockJS
WebSocket이 지원되지 않는 브라우저나 제한된 네트워크 환경에서도 안정적인 통신을 보장하기 위한 라이브러리
- 특징
- WebSocket이 지원되지 않는 브라우저를 위한 fallback 지원
- STOMP와 함께 사용할 경우 안정성 극대화
STOMP + SockJS
선택
✅ 결론
STOMP + SockJS
조합은 Spring 공식 문서에서도 실시간 기능 구현을 위한 권장 방식으로 소개되어 있으며,
이번 프로젝트에서 주문 완료, 조리 시작 등의 상태를 사용자에게 실시간으로 전달해야 하기 때문에 높은 실시간성이 요구됩니다.
WebSocket은 지연 시간이 낮고, 별도의 요청 없이도 데이터를 주고받을 수 있어, 실시간 알림/채팅 기능에 매우 적합한 통신 방식입니다.
또한, 일부 네트워크 환경(방화벽, 프록시 등)이나 구형 브라우저에서 WebSocket 연결이 실패할 수 있는 이슈에 대하여 SockJS가 자동으로 Long-Polling 등으로 대체할 수 있기에 해당 라이브러리를 선택하였습니다.