Spring Socket란?

김정수·2023년 9월 21일

Spring Socket

Spring Socket는 Spring Framework에서 제공하는 WebSocket 프로토콜을 지원하는 기능이다.실시간 양방향 통신을 위한 프로토콜로, 서버와 클라이언트 간에 지속적인 연결을 유지하고 데이터를 실시간으로 주고받을 수 있게 해준다.
클라이언트와 서버 간에 실시간 데이터 푸시, 채팅 애플리케이션, 주식 시세 업데이트, 게임 등과 같은 실시간 기능을 구현할 수 있다.기존의 HTTP 프로토콜과 달리 WebSocket은 전이중(full-duplex) 통신을 지원하여 클라이언트와 서버가 동시에 데이터를 주고받을 수 있다.

동작과정

WebSocketHandler: WebSocket 연결과 관련된 이벤트와 데이터 처리를 담당하는 핸들러입니다. 클라이언트와의 연결, 연결 해제, 메시지 수신, 메시지 송신 등의 작업을 처리합니다.

WebSocketSession: WebSocket 연결을 나타내는 객체로, 클라이언트와 서버 간의 통신 상태와 데이터를 유지합니다.

WebSocketMessage: 클라이언트와 서버 간에 교환되는 메시지를 나타내는 객체입니다. 텍스트 또는 바이너리 형식으로 전송될 수 있습니다.

WebSocketConfigurer: WebSocket 관련 구성을 위한 인터페이스로, WebSocket 핸들러 및 엔드포인트 등을 설정할 수 있습니다.

사용 예시

▶ WebSocketHandler 구현:

import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Component
public class ChatWebSocketHandler implements WebSocketHandler {
    private List<WebSocketSession> sessions = new ArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 새로운 세션이 연결되었을 때 호출됩니다.
        sessions.add(session);
    }

    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        // 클라이언트로부터 메시지를 수신받았을 때 호출됩니다.
        String payload = message.getPayload().toString();
        // 받은 메시지를 모든 세션에게 전송합니다.
        for (WebSocketSession s : sessions) {
            s.sendMessage(new TextMessage("Received: " + payload));
        }
    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        // 전송 오류가 발생했을 때 호출됩니다.
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        // 세션이 닫혔을 때 호출됩니다.
        sessions.remove(session);
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
}

▶ WebSocket 구성:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    private final ChatWebSocketHandler chatWebSocketHandler;

    public WebSocketConfig(ChatWebSocketHandler chatWebSocketHandler) {
        this.chatWebSocketHandler = chatWebSocketHandler;
    }

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(chatWebSocketHandler, "/chat").setAllowedOrigins("*");
    }
}

▶ WebSocket 사용 예시:

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class ChatController {
    @MessageMapping("/send") // 클라이언트로부터의 메시지를 처리하는 엔드포인트
    @SendTo("/topic/messages") // 메시지를 클라이언트로 브로드캐스팅하는 엔드포인트
    public ChatMessage sendMessage(ChatMessage message) {
        // 클라이언트로부터 받은 메시지를 처리하고, 모든 클라이언트에게 전달합니다.
        return message;
    }
}

위의 코드 예시에서는 WebSocketHandler를 구현하여 새로운 세션을 추적하고 메시지를 처리하고 전송한다. WebSocketConfigurer를 사용하여 WebSocket 핸들러와 URL 매핑을 설정하고, Controller에서는 클라이언트로부터의 메시지를 처리하고 브로드캐스팅한다.

SpringSocket은 어떻게 사용되는가?

클라이언트의 연결 요청: 클라이언트가 WebSocket 연결을 요청한다. 이는 HTTP Upgrade 요청을 통해 이루어지고, 클라이언트는 WebSocket 프로토콜로의 전환을 요청한 뒤 서버는 이를 수락합니다.

WebSocket 핸드셰이킹: 클라이언트와 서버 간에 WebSocket 핸드셰이킹이 이루어진다. 이 과정에서 클라이언트와 서버는 WebSocket 연결에 필요한 메타데이터를 교환하고 연결을 설정한다.

연결 설정: WebSocket 연결이 설정되면 클라이언트와 서버는 WebSocketSession 객체를 통해 연결을 유지한다. 이 객체는 클라이언트와 서버 간의 통신 상태와 데이터를 관리

이벤트 처리: WebSocket 연결이 설정된 후, 클라이언트 또는 서버 측에서 발생하는 이벤트를 처리. 이벤트에는 메시지 수신, 메시지 송신, 에러 처리, 연결 해제 등이 포함된다.

실시간 데이터 교환: 연결이 설정된 후에는 클라이언트와 서버가 실시간으로 데이터를 주고받을 수 있다. 클라이언트가 서버로 메시지를 전송하면 서버는 이를 수신하고, 서버가 클라이언트로 메시지를 전송하면 클라이언트는 이를 수신

SpringSocket을 사용하는 있는 곳

SpringSocket을 사용하고 있는 곳은 정말 많다. 페이스북, 트위터, 넷플릭스, 게임 개발사들 등 많은 회사에서 사용을 하고 있다. 그리고 실시간 채팅, 상호작용, 음악, 비디오 스티리밍 등에 WebSocket을 활용하고 있으며, 실시간 통신이 필요한 다양한 분야에서 활용되고 있다. 특히 웹 및 모바일 애플리케이션에서 많이 사용되고 있다.

profile
현재진행형

0개의 댓글