WebSocket을 설명하기전에
HTTP
- Http는 클라이언트가 요청을 보내야 응답을 반환해주는 단방향 모델이다.
- 연결은 요청마다 초기화됨. 폴링, 롱폴링으로 실시간 기능을 구현할 순 있지만 비효율적
WebSocket
- 초기 핸드셰이크(HTTP 기반) 후 지속적인 풀듀플렉스(Full-Duplex) 연결 유지 할 수있음.
- 서버가 먼저 클라이언트에게 요청도 가능하다.
- 양방향 통신이 가능하다.
WebSocket은 어떤 기능에 적합한지 ?
비교하기 위한 표
| 구분 | HTTP | WebSocket |
|---|
| 통신 방식 | 클라이언트 → 서버 (요청/응답) | 서버 ↔ 클라이언트 (양방향) |
| 연결 방식 | 요청마다 새 연결 | 지속적인 연결 유지 |
| 실시간성 | 폴링/롱폴링 필요 | 기본적으로 실시간 지원 |
| 예시 | 게시글 보기, 검색 등 | 채팅, 실시간 알림, 게임 등 |
WebSocket이 적합한 기능
- 실시간 채팅 : 여러 사용자 간의 메세지 교환이 가능해야함
- 실시간 알림 : 모바일 앱의 푸쉬알림이나 SNS업데이트 등이 있음
이외에도 실시간으로 동기화가 가능한 온라인게임이나 실시간 데이터스트리밍(주식) 등이 있다
HTTP로도 가능하지만 WebSocket을 사용해야하는 이유
- 단순히 데이터를 조회용 이거나 정적 콘텐츠를 제공하는 경우 (게시글 로드, 검색 결과)
- 데이터 업데이트가 드문 경우 HTTP로 충분함
- 서버가 수많은 동시 연결을 처리할 수 없는 경우, WebSocket의 지속적 연결은 부담이 될 수 있음
브로드 캐스팅(Broadcasting)
서버가 여러 클라이언트에게 동시에 메시지를 보낼 수 있는 기능
웹소켓을 이용하여 기능을 구현하다보면 여러 사용자에게 동시에 데이터를 전달도 해야하는 기능이 필수!
예시
• 채팅방에서 한 사용자가 메시지 전송 → 같은 방에 있는 모든 사용자에게 전달
• 실시간 알림 기능에서 새로운 알림 전송 → 앱에 연결된 모든 사용자에게 전달
이것을 구현하려면 WebSocket에서 room 이라는 개념을 제공하는데
Room
- 하나의 웹소켓 서버에서 사용자들을 그룹으로 지정해서 분리하는것
사용 이유
- 모든 유저에게 브로드캐스팅을 하게되면 리소스 낭비가 된다.
관련 메서드
- socket.join('roomName') - 해당 사용자를 특정 room에 참가시킴
- socket.leave('roomName') - 해당 사용자를 room에서 나가게 함
- io.to('roomName').emit(...) - 해당 room에 있는 사용자들에게만 메시지를 보낸다
✅ 정리
Room은 브로드캐스팅을 제어할 수 있는 유닛으로 실시간 채팅, 협업도구
알림에서 특히 알맞은 특정 다수에게 실시간정보를 보내야 할 때 필수적임!