Upgrade: websocket, Connection: Upgrade를 담아 연결 방식을 바꿀 것을 제안.COMMAND(명령), Headers(부가정보), Body(내용)로 구성.
destination 헤더가 메시지의 '주소' 역할을 함.CONNECT: STOMP 프로토콜로 통신 시작 요청.SUBSCRIBE: 클라이언트가 특정 destination(주소)으로 오는 메시지를 받겠다고 구독 신청. (예: /topic/chat/room/1)SEND: 클라이언트가 특정 destination으로 메시지를 발행. (예: /app/chat/message)MESSAGE: 브로커가 구독자들에게 메시지를 전달.WebSocketMessageBrokerConfigurer):
registerStompEndpoints("/ws-stomp"): WebSocket 핸드셰이크를 위한 최초 접속 주소를 설정.
.withSockJS(): WebSocket을 지원하지 않는 환경에서 폴링 방식으로 자동 전환해주는 호환성 옵션.configureMessageBroker(): 메시지 라우팅 규칙 설정.
enableSimpleBroker("/topic", "/queue"): /topic, /queue로 시작하는 주소를 메시지 브로커가 직접 처리하여 구독자에게 전달. (메모리 기반, 단일 서버용)setApplicationDestinationPrefixes("/app"): /app으로 시작하는 주소는 @MessageMapping 컨트롤러에게 전달.@MessageMapping, @SendTo):
@MessageMapping: 클라이언트의 SEND 요청을 받을 엔드포인트를 지정.@SendTo: 메서드 처리 후, 결과를 특정 destination으로 발행(브로드캐스팅)할 때 사용.SimpMessagingTemplate: @SendTo로 처리하기 힘든 동적 destination 전송이나 1:1 메시지 전송에 사용.setAllowedOriginPatterns 설정.ChannelInterceptor를 이용해 CONNECT 시점에 토큰을 검증하거나, 특정 destination 구독 권한을 체크.enableSimpleBroker와 setApplicationDestinationPrefixes의 역할과 메시지 흐름의 차이를 설명해 보세요.HTTP의 단방향 요청-응답 구조는 실시간 통신에 비효율적이므로, 이를 극복하기 위해 하나의 TCP 연결을 유지하며 양방향 통신을 하는 WebSocket이 등장했습니다. 하지만 WebSocket 자체는 통신 규칙이 없어, 그 위에 발행/구독 모델과 메시지 형식을 정의한 STOMP 프로토콜을 함께 사용함으로써 복잡한 실시간 애플리케이션을 체계적으로 구현할 수 있습니다.