웹소켓 하트비트(Heartbeat)란?
**웹소켓 하트비트(Heartbeat)**는 클라이언트와 서버 간의 연결 상태를 **정기적으로 확인하기 위한 신호(패킷)**임.
웹소켓은 항상 연결이 유지되는 실시간 통신 방식이지만,
네트워크 문제나 브라우저 중단 등으로 인해 연결이 끊겼을 때 즉시 감지하기 어려움.
이러한 상황을 방지하고 연결을 모니터링하기 위해 일정한 간격으로 하트비트(=헬스 체크 메시지)를 주고받음.
1. 하트비트의 필요성
왜 하트비트가 필요한가?
- TCP 소켓 자체는 연결이 끊겨도 서버나 클라이언트가 바로 감지하지 못하는 경우가 있음
- 네트워크 장애, 와이파이 끊김, 브라우저 강제 종료 등 예외 상황에서 연결 유지를 보장할 수 없음
- 클라이언트나 서버가 죽었을 때를 빠르게 감지하고 재연결하거나 리소스를 정리할 필요가 있음
→ 이를 위해 하트비트 신호를 사용하여 연결이 살아 있는지를 확인함
2. 하트비트의 동작 방식
일반적인 흐름:
- 클라이언트가 일정 시간마다 서버로 PING 메시지를 전송함
- 서버가 정상적으로 연결되어 있다면 PONG 메시지로 응답함
- 일정 횟수 이상 응답이 없으면 연결 종료 또는 재연결 시도
예시 (클라이언트 중심 하트비트):
setInterval(() => {
if (socket.readyState === WebSocket.OPEN) {
socket.send(JSON.stringify({ type: "PING" }));
}
}, 10000); // 10초마다 하트비트 전송
서버에서는 해당 메시지를 받고 응답하거나, 응답이 없으면 연결 종료로 간주함
3. Spring STOMP + WebSocket 에서의 하트비트 설정
Spring에서는 STOMP를 사용할 때 자동 하트비트 설정 기능을 제공함
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setSendTimeLimit(15 * 1000)
.setSendBufferSizeLimit(512 * 1024);
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic")
.setHeartbeatValue(new long[]{10000, 10000}); // [클라이언트→서버, 서버→클라이언트]
}
- setHeartbeatValue(long[] heartbeat):
- 첫 번째 값: 클라이언트가 서버로 보내는 주기
- 두 번째 값: 서버가 클라이언트로 보내는 주기
- 단위는 밀리초(ms)
4. 하트비트가 실패하는 경우
- 하트비트 응답이 오지 않으면 서버 또는 클라이언트가 연결 종료로 간주함
- 예: STOMP에서는 일정 시간 응답이 없으면 자동으로 연결을 닫음
- 이 경우 클라이언트는 재연결 로직을 구성하여 자동 복구하는 것이 일반적임
5. 하트비트 관련 실무 고려사항
항목 | 설명 |
네트워크 트래픽 | 하트비트 주기가 너무 짧으면 과도한 트래픽 발생 가능 |
배터리 소비 | 모바일에서는 하트비트가 많으면 배터리 소모 증가 |
NAT, 방화벽 문제 | 일정 시간 트래픽 없으면 방화벽이 연결을 닫는 경우 있음 → 하트비트로 유지 필요 |
연결 끊김 감지 후 재시도 | 클라이언트 측에서 onclose, onerror 이벤트를 활용하여 재접속 로직 구성 필요함 |
6. 하트비트와 Ping/Pong 차이
구분 | 하트비트 메시지 | Ping/Pong |
정의 | 애플리케이션 레벨에서 직접 구현하는 메시지 | 웹소켓 레벨의 프로토콜 메시지 (자동) |
제어 | 클라이언트 코드에서 정의함 | 일부 라이브러리/브라우저에서 자동 전송 |
내용 | 일반적으로 JSON {type: "PING"} 형태 | 바디 없는 바이너리 프레임 |
→ WebSocket 자체 Ping/Pong과 별개로, STOMP/애플리케이션 레벨 하트비트를 구성하는 것이 일반적임
정리
웹소켓 하트비트는 클라이언트와 서버가 연결이 살아 있는지 주기적으로 확인하기 위해 사용하는 경량 메시지임.
네트워크 예외 상황이나 클라이언트 강제 종료 등에 대응하기 위해 필수적인 기능이며,
STOMP 기반 웹소켓 통신에서는 Spring에서 하트비트 설정을 통해 자동으로 관리할 수 있음.
실무에서는 하트비트 실패 시 자동 재접속 로직과, PING 간격 조절 전략도 함께 고려해야 함.
출처 : ChatGPT
'BE > Spring & Spring Boot' 카테고리의 다른 글
@ElementCollection (0) | 2025.05.20 |
---|---|
[Spring Boot] HttpClient (0) | 2025.05.12 |
[Spring Boot] PRG 패턴 (1) | 2025.05.06 |
[Spring Boot] CommandLineRunner (0) | 2025.05.05 |
[Spring Boot] 퍼사드 패턴 (0) | 2025.05.02 |