본문 바로가기
Framework & Lib & API/스프링

웹소켓 허트비트 heatbeat 설정(소켓 연결 상태확인)

by 코딩공장공장장 2020. 11. 30.

안녕하세요. 

 

스프링프레임워크 환경에서 sockjs와 stomp로 채팅기능을 구현하고 있습니다. 

 

실제 채팅 어플리케이션에서 사용하는 메시지를 상대방이 읽었는지 안읽었는지

 

읽음/안읽음 기능을 구현하기 위해 소켓 연결생성시 실행되는 메소드와 연결종료시 발생하는

 

메소드를 사용해서 구현하려고 했기데 소켓이 연결되고 종료되는 시점을 채팅창을 벗어나면 

 

서버에서 바로 알아차려야합니다. 

 

사파리를 제외한 모든 브라우저에서 채팅창을 벗어나는 순간 소켓을 종료시키지만 사파리의 경우에만 

 

최대 1분 정도의 딜레이 시간이 있었습니다. 

 

정확히 말하면 윈도우용 사파리에서만 딜레이가 있습니다. 맥과 아이폰 환경에서 최신 사파리를 사용하면 

 

다른 브라우저와 마찬가지로 페이지를 벗어나는 순간 소켓이 종료됩니다. 

 

현재 사파리에서는 윈도우용 사파리에 더이상의 업데이트를 제공하지 않겠다고 하였으니 윈도우용 사파리에서는

 

별도의 heatbeat 설정을 해야 소켓 종료시점을 빠르게 파악할 수 있을 것입니다. 

 

 

 

 

구현 방법은 클라이언트에서 하는 방법과 서버에서 하는 방법 두가지가 있습니다. 

 

 

 

클라이언트단

 

 //this line.
    function connect() {
    //파라미터이름, 순서바뀌면안됨, afterConnectionClosed메서드에서참조함
        var socket = new SockJS("https://lessonwang.com/hello?chatroom_id="+chatroom_id+"&username="+sender);
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            stompClient.subscribe('/queue/message-'+chatroom_id, function(greeting){
                      appendMessage(greeting);
             });
             
		stompClient.heartbeat.outgoing = 0;
		stompClient.heartbeat.incoming = 0;
        });
   
    
    }

 

 

 

서버단

 

public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer implements SchedulingConfigurer  {

	private static final  Logger logger = LoggerFactory.getLogger(WebSocketConfig.class);
	
    public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
    	stompEndpointRegistry.addEndpoint("/hello").setAllowedOrigins("*").withSockJS()
        .setHeartbeatTime(1000);
        
    }

 

 

 

위의 두가지 방법에서 보는것과 같이 

 

클라이언트단에서는  heartbeat.incommig과 heartbeat.outgoin으로 

 

서버단에서는 .setHeartbeatTime(); 메서드로 연결상태 확인 주기를 ms(1000분의 1초)단위로 설정할 수 있다. 

 

 

 

개인적으로 윈도우용 사파리로 접속한 사용자들에게 다른 브라우저로 접속을 권장해야할 것 같다.

 

윈도우용 사파리에서는 이외에도 여러 문제가 많았다. 

 

사파리로 인해 별도로 구현해야하는 부분들이 많았다. 

 

처음에는 모든 사파리가 그런줄 알았지만 맥이나 ios에서는 정상적으로 작동이 되었다.

 

사파리에서 나타나는 오류를 제거하려고 하다보면

 

오히려 시스템 성능에 많은 부하를 주고 코드가 굉장히 복잡해진 것 같았다.

 

윈도우용 사파리는 deprecate되어 더이상 업그레이 되지 않는다. 

 

사용률도 높지 않으니 윈도우용 사파리에 접속하는 클라이언트에게 다른 브라우저 환경으로 

 

접속을 권장하는 경고창을 날려주는게 가장 적절한 선택이 될 것 같다.

반응형