spring boot/websocket, stomp in springboot

using websocket, STOMP in springboot

Hello World Study 2025. 3. 1. 16:34

inflearn

https://www.inflearn.com/course/websocket-stomp-springboot

 

[지금 무료]WebSocket, STOMP in springboot 강의 | Hello World - 인프런

Hello World | , WebSocket, STOMP 관한 가장 짧고 핵심만 다루는 강의WebSocket, STOMP 를 처음 다루는 개발자들은 최소 몇 시간의 구글링과 시행착오를 겪습니다. 초보자들이 가장 헷갈려하는 부분과 반드시

www.inflearn.com

 

 

github

https://github.com/ChunGeun-Yu/websocket

 

 

stomp 기본 설정

@Configuration
@EnableWebSocketMessageBroker
public class StompConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/app");                   // @MessageMapping 를 이용해서 메시지 수신할 destination prefix
        config.enableSimpleBroker("/topic", "/queue");      // 위 목적 외 destination prefix
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
//        registry.addEndpoint("/helloworld");                    // websocket
        registry.addEndpoint("/helloworld").withSockJS();       // sockjs
    }

}

< https://docs.spring.io/spring-framework/reference/web/websocket/stomp/enable.html >

 

 

@Controller
public class StompController {


    @MessageMapping("/hello")
    @SendTo("/topic/hello")
    public ResDto basic(ReqDto request) {
        return new ResDto(request.getMessage().toUpperCase(), LocalDateTime.now());
    }

    @MessageMapping("/multi")
    @SendTo({"/topic/hello", "/topic/hello2"})
    public ResDto nulti(ReqDto request) {
        return new ResDto(request.getMessage().toUpperCase(), LocalDateTime.now());
    }

    @MessageMapping("/hello1")
    @SendTo("/topic/hello")
    public ResDto annotations(Message<ReqDto> message, MessageHeaders headers, ReqDto request) {
        return new ResDto(request.getMessage().toUpperCase(), LocalDateTime.now());
    }

    @MessageMapping("/hello/{detail}")
    @SendTo("/topic/hello")
    public ResDto detail(@DestinationVariable("detail") String detail, ReqDto request) {
        return new ResDto("[" + detail + "]_" + request.getMessage().toUpperCase(), LocalDateTime.now());
    }

    @MessageMapping("/sessions")
    @SendToUser("/queue/sessions")
    public ResSessionsDto sessions(ReqDto request, MessageHeaders headers) {       
        String sourceSessionId = headers.get("simpSessionId").toString();
        return new ResSessionsDto(생략);
    }
    
}

< https://docs.spring.io/spring-framework/reference/web/websocket/stomp/handle-annotations.html >

 

programmatically

@Autowired
SimpMessagingTemplate messagingTemplate;

// @SendTo
messagingTemplate.convertAndSend("/topic/hello", resDto);


// @SendToUser
messagingTemplate.convertAndSendToUser(sourceSessionId, "/queue/sessions", resSessionsDto, createHeaders(sourceSessionId));

///////////////////////////////////////////////

MessageHeaders createHeaders(@Nullable String sessionId) {
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
    headerAccessor.setSessionId(sessionId);
    headerAccessor.setLeaveMutable(true);
    return headerAccessor.getMessageHeaders();
}

event

@EventListener
public void listener(SessionConnectEvent sessionConnectEvent) {
    log.info("sessionConnectEvent. {}", sessionConnectEvent);
}

< https://docs.spring.io/spring-framework/reference/web/websocket/stomp/application-context-events.html >

 

 

exception handler

@ControllerAdvice
public class StompExceptionHandler {

    @MessageExceptionHandler
    @SendTo("/topic/hello")
    public String handleException(IOException exception, MessageHeaders headers) {
        log.error("exception: {}", exception.getClass());
        return "error!!";
    }
    
}

 

reference

https://docs.spring.io/spring-framework/reference/web/websocket.html

https://spring.io/guides/gs/messaging-stomp-websocket