웹 소켓 연결이 계속 끊길 수 있으니 에러 처리를 잘해주어야 한다.
처리해야 할 상황이 어떤 것들이 있을까?
대부분의 경우는
웹소켓 연결이 종료됐음에도 서버에서 감지하지 못하는 경우일 것이다.
와이파이가 끊기거나, 네트워크 문제가 있어서 클라이언트는 연결이 끊겼는데 서버는 이를 감지하지 못하는 상황이다. 그러면 불필요하게 세션 정보를 계속 메모리에 넣어두어야 하고, 웹소켓 연결이 끊겼음에도 계속 메시지를 전송하게 된다.
이를 해결하려면
서버에서 heartbeat를 체크하는 방식을 사용하면 된다.
클라이언트에 ping을 보내면 pong 응답을 받을 때 연결이 정상적이라고 판단하고
그렇지 않으면 연결을 종료하는 방식이다.
이렇게 설정을 넣어주면 된다.
스프링 공식문서에는 다음과 같은 내용이 있다.
원랜 10초마다 보내는 게 디폴트 설정인가보다.
브로커에 대한 연결이 사라지면, 브로커는 5초마다 재연결을 시도한다.
연결을 시도하니 이렇게 떴다.
heartbeat를 실행할 스케쥴러가 필요하다고 한다.
이렇게 등록해주었다.
스프링 로그를 보면 이런식으로 heartBeat 로그가 뜬다.
일부로 클라이언트와 연결을 하고 네트워크 연결을 꺼봤는데
계속 핑-퐁 로그가 떴다.
이것저것 시도를 해보다(웹소켓 포트를 차단하거나, 네트워크 연결을 끄거나..)
클라이언트 개발자도구에서 디버깅으로 잠시 멈춤을 해봤따.
저 일시 중지 버튼을 누르며 된다.
그러면 스프링 서버에서는 아래와 같은 로그가 뜬다.
ping을 계속 보내다 답변이 없으니
세션을 종료시키는 것이다.
잠시 디버거 모드에서 중지를 시키고
기다린 뒤에 일시중지를 풀었다.
그리고 특정 채널을 구독하는 메시지를 보냈는데
위처럼 이를 처리할 수 있었다.(자기 채널이 아니라서 권한이 없다고 뜸)
그러면, 이 상황에서 메시지들은 네트워크 연결이 잘 됐을 때 갈까?
이런 세션이 있다고 해보자.
그리고 디버거로 멈추게 해보자.
다시 일시정지를 풀었을 때는 메시지가 왔다.