🌐 HTTP와 WebSocket 비교 및 구현
📡 HTTP
- 클라이언트 <------ 요청(Request) / 응답(Response) ------> 서버
- 요청이 있을 때만 응답 가능한 방식
- 통신 상태를 유지하지 않는 무상태(Stateless) 프로토콜
- 매 요청마다 연결 및 매핑 필요
🔄 WebSocket
- 지속적인 양방향 연결 가능한 통신 프로토콜
- Socket: 통신의 종착점(엔드포인트)
- 클라이언트 소켓이 서버 소켓에 연결 요청
주요 사용처
- 실시간 통신 (채팅, 게임 등)
- 실시간 알림, 보안 등
⚙️ 스프링 웹소켓 구현
| 단계 | 설명 |
|---|
| 1 | websocket 라이브러리 설치 |
| 2 | 서버 웹소켓 핸들러 클래스 생성 (ChatHandler) |
| 3 | TextWebSocketHandler 상속, 필수 메서드 오버라이딩 |
| 4 | @Component 애노테이션으로 스프링 컨테이너에 등록 |
| 5 | 연결, 종료, 메시지 처리 메서드 구현 |
상속받는 주요 메소드
| 메소드명 | 역할 |
|---|
afterConnectionEstablished(session) | 클라이언트와 서버 연결 성공 시 호출 |
afterConnectionClosed(session, status) | 연결 종료 시 호출 |
handleTextMessage(session, message) | 메시지 수신 시 호출 |
🔌 서버 웹소켓 및 경로 매핑
@Configuration, @EnableWebSocket 애노테이션 추가
WebSocketConfigurer 인터페이스 구현
registerWebSocketHandlers 메서드에서 핸들러 객체와 매핑 경로 등록
👨💻 클라이언트 WebSocket 구현 (JS)
- 각 브라우저별 세션 별도로 관리 됨
- 클라이언트 웹소켓 생성
const socket = new WebSocket("ws://서버주소");
| 이벤트명 | 설명 |
|---|
onopen(event) | 서버와 연결 성공 시 실행 |
onclose(event) | 연결 종료 시 실행 |
onerror(event) | 에러 발생 시 실행 |
onmessage(event) | 메시지 수신 시 실행 |
.send(message) | 서버에 메시지 전송 |
- 접속중인 클라이언트 정보를 저장하는 Map 또는 List 관리 필요
🗂️ 실전 활용 팁
- 접속 중인 클라이언트 소켓 관리 위해,
Vector 등 동기화 된 배열 사용 권장
- 웹소켓 관련 자세한 구현 예제는 Day02 참고
🔎 HTTP와 WebSocket 주요 비교
| 특성 | HTTP | WebSocket |
|---|
| 통신 방식 | 요청-응답 (클라이언트 주도) | 양방향 (클라이언트/서버 주도) |
| 연결 상태 | 비연결(Stateless) | 지속 연결(Stateful) |
| 데이터 전송 | 단방향, 요청 시만 가능 | 전이중(Full Duplex), 양방향 실시간 가능 |
| 오버헤드 | 매 요청마다 헤더 포함, 상대적으로 높음 | 최초 연결 후 최소 헤더, 낮은 오버헤드 |
| 사용 사례 | 웹 페이지 로드, REST API | 실시간 채팅, 실시간 알림, 게임 |
| 보안 | HTTPS, 기본 보안 표준 | 별도 WSS 적용 필요, 보안 상대적 취약 |
⏳ WebSocket 작동 원리
- 클라이언트가 HTTP 핸드셰이크 요청
- 서버가 HTTP → WebSocket 프로토콜로 업그레이드(스위칭)
- 지속적인 소켓 연결 형성, 전이중 통신 시작
- 클라이언트와 서버가 연결 종료 전까지 실시간 양방향 데이터 교환