본문 바로가기

개발공부

[ JAVA SPRING ] JavaSpring에서 STOMP 설정

SocketConfig 설정

STOMP를 사용하기 위해 WebSocketMessageBrokerConfigurer를 상속해 클래스를 생성했다. Java Spring Security에서 CORS 설정이 되어있을 때 setAllowedOrigins에 와일드카드(*)을 사용할 수 없어 필요한 Origins를 구체적으로 입력을 했다.

 

@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("/gs-guide-websocket")
                .setAllowedOrigins("http://localhost:3000","http://172.20.10.2:3000")
                .withSockJS();
    }
}

Filter 설정

CORS 설정 때문에 Filter 쪽에도 Origin에 대한 코드를 작성해줬다.

 

    @Override
    protected void doFilterInternal(HttpServletRequest request, 
        HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            
            String origin = request.getHeader("Origin");
            response.setHeader("Access-Control-Allow-Origin", 
                allowedOrigins.contains(origin) ? origin : "");
            response.setHeader("Vary", "Origin");
         
            response.setHeader("Access-Control-Max-Age", "3600");

            response.setHeader("Access-Control-Allow-Credentials", "true");

            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");

            response.setHeader("Access-Control-Allow-Headers",
            "Origin, X-Requested-With, Content-Type, Accept, " + "X-CSRF-TOKEN");
        }
    }

ChatController 작성

Sub, Pub를 채팅방 번호(chatId)를 기준으로 설정을 했다.

 

@Controller
@RequiredArgsConstructor
public class ChattingEndpoint {
    private final ChatService chatService;

    @MessageMapping("/chat/{chatId}")
    @SendTo("/topic/chat/{chatId}")
    public ChatResponse chatting(ChatRequest chatRequest,
                             @DestinationVariable String chatId) throws Exception {
        var chatLog = chatService.saveChatLog(chatRequest.toChatLog(Long.valueOf(chatId)));

        return ChatResponse.from(chatLog);
    }
}