Java & Spring

[Servlet] WebSocket

nippycloud 2026. 2. 16. 19:03

 

순수 서블릿에서의 웹소켓 동작 폼이다.

@ServerEndpoint("/connect")
public class SimpleWebSocketServer {

    @OnOpen
    public void onOpen(Session session) {}

    @OnMessage
    public void onMessage(String message, Session session) {}

    @OnClose
    public void onClose(Session session) {}
}

 

실제로 메서드를 채우면 아래와 같다.

@ServerEndpoint("/connect")
public class SimpleWebSocketServer {

    // Spring에서의 sessions와 동일하게 메모리에서 관리
    private static final Set<Session> sessions = ConcurrentHashMap.newKeySet();

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        for (Session s : sessions) {
            if (s.isOpen()) {
                try {
                    s.getBasicRemote().sendText(message);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @OnClose
    public void onClose(Session session, CloseReason reason) {
        sessions.remove(session);
    }

    @OnError
    public void onError(Session session, Throwable throwable) {
        throwable.printStackTrace();
    }
}

 

순수 서블릿에서 사용하는 웹소켓 코드이다.

스프링에서는 웹소켓이 아래와 같이 변한다.

@Component
public class SimpleWebSocketHandler extends TextWebSocketHandler {

    // 메모리에서 관리하는 사용자들의 세션
    private final Set<WebSocketSession> sessions = ConcurrentHashMap.newKeySet();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        sessions.add(session);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        String payload = message.getPayload();
        for (WebSocketSession s : sessions) {
            if (s.isOpen()) { 
                s.sendMessage(new TextMessage(payload)); 
            }
        }
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        sessions.remove(session);
    }
}

 

 

[Servlet WebSocket -> Spring WebSocketServlet]

@OnOpen public void onOpen(Session session) : 연결 알림

=> afterConnectionEstablished(WebSocketSession session)

 

@OnMessage public void onMessage(String message, Session session) : 메시지 수신

=> handleTextMessage(WebSocketSession session, TextMessage message)

 

@OnClose public void onClose(Session session, CloseReason reason) : 연결 종료

=> afterConnectionClosed(WebSocketSession session, CloseStatus status)

 

 

Servlet WebSocket -> Spring WebSocket 이후 Stomp 개념이 등장한다.

 

 

 

'Java & Spring' 카테고리의 다른 글

[Java] Map 정렬  (0) 2026.03.03
[Spring] ResponseEntity  (0) 2026.02.22
[Spring] Security  (0) 2026.02.15
[Java] Reflection  (0) 2026.01.01
[JAVA] JVM의 구조  (0) 2025.12.09