본문 바로가기
Spring/기타 여러가지

Spring WebSocket 01

by doriver 2025. 2. 1.

ServletWebSocketHandlerRegistration은 
WebSocket핸들러를 서블릿 컨테이너에 등록하는 역할을 함

초기 WebSocket연결(핸드셰이크)만 서블릿 컨테이너가 처리하고
, 이후 실시간 메시지 송수신은 WebSocket세션에서 직접 이루어짐.

WebSocket 연결이 수립되면 
이후 메시지는 서블릿 컨테이너를 거치지 않고 직접 핸들러(WebSocket 세션)를 통해 주고받음

클라이언트와 서버 간 직접적인 통신 채널(WebSocket 세션)

 

WebSocketSession의 생명주기는 
클라이언트가 WebSocket에 연결하고 종료할 때까지의 과정을 의미

 

Spring WebSocket 내부에서 
WebSocketSession은 DefaultWebSocketSession 클래스로 구현되어 있음.
DefaultWebSocketSession은 서버의 WebSocket 컨텍스트에서 살아 있음.


WebSocketSession은 서블릿 컨테이너의 WebSocket컨텍스트에서 활성 상태로 존재 

서블릿 컨테이너(Tomcat, Jetty 등)에서 WebSocket 컨텍스트는 활성화된 WebSocket 연결을 관리하는 영역
WebSocket 연결이 생성되면, 서블릿 컨테이너는 해당 세션을 WebSocket 컨텍스트에서 관리

 

서블릿 컨테이너의 WebSocket컨텍스트를 직접 관리하는 클래스 : WsServerContainer

WebSocket컨텍스트는 WsServerContainer내부에서 관리됨

package org.apache.tomcat.websocket.server;

public class WsServerContainer extends WsWebSocketContainer implements ServerContainer {  }

org.apache.tomcat.websocket.server.WsContextListener가 

Tomcat의 WebSocket환경을 설정하고, WsServerContainer를 생성

 

WsServerContainer는 현재 활성화된 WebSocket세션을 저장하고 WebSocket핸드셰이크 요청을 처리함

 

현재 활성화된 WebSocket 세션을 얻기
WsServerContainer#getOpenSessions() 사용

import org.apache.tomcat.websocket.server.WsServerContainer;
import javax.websocket.Session;
import javax.websocket.server.ServerContainer;
import javax.websocket.server.ServerEndpointConfig;
import java.util.Set;

public class WebSocketSessionManager {

    private final WsServerContainer serverContainer;

    public WebSocketSessionManager(ServerContainer container) {
        this.serverContainer = (WsServerContainer) container;
    }

    public Set<Session> getOpenSessions() {
        return serverContainer.getOpenSessions();
    }
}

 

서블릿 컨테이너의 ServerContainer얻기
ServletContext.getAttribute("javax.websocket.server.ServerContainer")

import javax.servlet.ServletContext;
import javax.websocket.server.ServerContainer;
import org.springframework.stereotype.Component;

@Component
public class WebSocketContainerProvider {

    private final ServerContainer serverContainer;

    public WebSocketContainerProvider(ServletContext servletContext) {
        this.serverContainer = (ServerContainer) servletContext.getAttribute("javax.websocket.server.ServerContainer");
    }

    public ServerContainer getServerContainer() {
        return serverContainer;
    }
}

'Spring > 기타 여러가지' 카테고리의 다른 글

@Scheduled을 이용해 일정 시간 마다 코드 실행  (0) 2025.02.04
ServletContainer 01  (0) 2025.02.01
STOMP  (1) 2025.01.30
Spring WebSocket, 스프링 공식문서  (0) 2025.01.29
WebSocketMessageBroker관련 01  (0) 2025.01.29