tioon's Devlog

스프링 웹소켓(Web Socket) (STOMP) 본문

자바/스프링

스프링 웹소켓(Web Socket) (STOMP)

tioon 2023. 8. 5. 21:58
웹소켓(Web Socket)이란?

-클라이언트와 서버간의 양방향 통신을 가능하게 하는 프로토콜입니다. HTTP와 같은 웹표준 프로토콜입니다.
이는 실시간, 이벤트 기반 통신이 필요한 애플리케이션을 개발할때 쓰이며, 서버와 클라이언트간에 자유롭게 메세지를 보낼 수 있게 연결을 합니다. 이 연결을 통해 클라이언트와 서버는 자유롭게 데이터를 서로 송수신을 할 수 있고, 서버측에서는 웹소켓 연결된 클라이언트를 관리할 수 있습니다.

 

 

스프링 웹소켓 구현 과정

 

WebSocket 설정

@Configuration과 @EnableWebSocketMessageBroker를 이용해 웹소켓 설정 파일을 구현합니다.
이 설정 클래스는 WebSocketMessageBrokerConfigurer를 구현하고 있는데, 총 두개의 메서드로 구성되어있습니다.
첫번째 메서드는 configureMessageBroker로 메시지 브로커의 구성을 정의 합니다.
즉,메세지 브로커의 url을 설정하여 해당 주소로 보내진 메세지는 메세지 브로커가 다시 다른 사용자들에게 브로드캐스트로 전달해주는 역할을 합니다.
두번째 메서드는 registerStompEndpoints로 웹소켓 엔드포인트를 등록하고 서버와 웹소켓 연결하는데 사용하는 메서드입니다.
즉,이 메서드를 사용해 클라이언트가 서버와 웹소켓 연결을 할 수 있게 하며, 웹소켓 통신을위해 가장 기초적인 설정을 할 수 있게 합니다.

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
//웹소켓 설정 클래스 (이 클래스로 웹소켓 설정을 다룰 수 있음)

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    } //메시지 브로커 설정 메서드(브로드 캐스트)

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket-endpoint").withSockJS();
    } // 웹소켓 연결 설정 메서드 (메세지 전송)
}

 

 

웹소켓 컨트롤러 생성

-웹소켓 메세지를 핸들링하는 컨트롤러를 생성합니다. 이 컨트롤러는 클라이언트로부터 메세지를 받아들이고, 다른 클라이언트에게 메세지를 전달하는 역할을 합니다.


 

  • @MessageMapping()
    -연결된 클라이언트로부터 웹소켓 메세지를 받는 메서드입니다. 해당 url을 통해 클라이언트로부터 웹소켓 메세지를 받을 수 있습니다. 
@MessageMapping("/hello")
public void handleHello(HelloMessage message) {
    // 메시지 처리
}

 

 

  • @SendTo()
    -해당 메서드에서 반환된 객체는 SendTo 매개변수 경로를 구독하고있는 모든 클라이언트들에게 브로드캐스트로 메세지를 보냅니다.
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) {
    return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
}

 

 

 

  • @Payload
    -메세지에 저장되어있는 본문 메세지를 메서드의 매개변수로 바인딩하여, 클라이언트 측에서 추가적인 데이터를 보내 서버에 전송할 수 있게 합니다. 주로 JSON 형식의 메세지를 보내고 받을 수 있습니다.
    @MessageMapping("/hello")
    public void handleHello(@Payload HelloMessage message) {
        // 메시지 처리. 예를 들어, message 객체에서 name을 가져와서 사용합니다.
        String name = message.getName();
        System.out.println("Hello, " + name + "!");
    }

 

 

  • DestinationVariable
    -경로 변수를 메서드의 매개변수로 바인딩하는 애노테이션입니다. {}안에 경로변수를 지정할 수있으며, 매개변수로 해당 경로변수를 지정할 수 있습니다.
@MessageMapping("/chat/{roomId}")
public void handleChat(@DestinationVariable String roomId, @Payload ChatMessage message) {
    // 메시지 처리
}

 

 

  • SubscribeMapping()
    -클라이언트가 메세지를 받고싶은 url을 구독요청을하는 메서드입니다. 이 메서드는 구독시작할때 한번만 실행되며, 한번 실행되면 그 이후로는 구독한곳에서 메세지가 올때마다 브로드캐스트로 메세지를 받을 수 있습니다.
@SubscribeMapping("/chat/{roomId}")
public WelcomeMessage handleSubscription(@DestinationVariable String roomId) {
    return new WelcomeMessage("Welcome to room " + roomId + "!");
}