Loading...
Spring Framework Reference Documentation 7.0.2의 Flow of Messages의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
STOMP endpoint가 노출되면, Spring 애플리케이션은 연결된 클라이언트들을 위한 STOMP 브로커가 됩니다. 이 섹션은 서버 사이드에서의 메시지 흐름을 설명합니다.
spring-messaging 모듈은 Spring Integration에서 시작된 메시징 애플리케이션에 대한 기초적인 지원을 포함하며, 이후 많은 Spring projects와 애플리케이션 시나리오 전반에 더 넓게 사용되도록 Spring Framework에 추출되어 통합되었습니다.
다음 목록은 사용 가능한 몇 가지 메시징 추상화를 간략히 설명합니다:
Message: 헤더와 페이로드를 포함한 메시지에 대한 단순한 표현입니다.
MessageHandler: 메시지를 처리하기 위한 계약입니다.
MessageChannel: 프로듀서와 컨슈머 사이의 느슨한 결합을 가능하게 하는 메시지 전송을 위한 계약입니다.
SubscribableChannel:
MessageHandler 구독자를 가진 MessageChannel입니다.
ExecutorSubscribableChannel:
메시지 전달을 위해 Executor를 사용하는 SubscribableChannel입니다.
Java 설정(즉, @EnableWebSocketMessageBroker)과 XML 네임스페이스 설정(즉, <websocket:message-broker>) 모두 앞의 컴포넌트들을 사용하여 메시지 워크플로를 구성합니다. 다음 다이어그램은 심플 내장 메시지 브로커가 활성화되었을 때 사용되는 컴포넌트들을 보여줍니다:

위 다이어그램은 세 개의 메시지 채널을 보여줍니다:
clientInboundChannel: WebSocket 클라이언트로부터 수신된 메시지를 전달하기 위한 채널입니다.clientOutboundChannel: 서버 메시지를 WebSocket 클라이언트로 전송하기 위한 채널입니다.brokerChannel: 서버 사이드 애플리케이션 코드 내에서 메시지 브로커로 메시지를 전송하기 위한 채널입니다.다음 다이어그램은 서브스크립션을 관리하고 메시지를 브로드캐스트하도록 외부 브로커(RabbitMQ와 같은)가 구성되었을 때 사용되는 컴포넌트들을 보여줍니다:

위 두 다이어그램 사이의 주요 차이점은 TCP를 통해 메시지를 외부 STOMP 브로커로 전달하고 브로커로부터 서브스크립션된 클라이언트로 메시지를 전달하기 위해 “브로커 릴레이”를 사용한다는 점입니다.
WebSocket 커넥션으로부터 메시지가 수신되면, STOMP 프레임으로 디코드되고, Spring Message 표현으로 변환된 후 추가 처리를 위해 clientInboundChannel로 전송됩니다.
예를 들어, destination 헤더가 /app으로 시작하는 STOMP 메시지는 어노테이션이 붙은 컨트롤러의 @MessageMapping 메서드로 라우트될 수 있으며, /topic과 /queue 메시지는 메시지 브로커로 직접 라우트될 수 있습니다.
클라이언트로부터 STOMP 메시지를 처리하는 어노테이션이 붙은 @Controller는 brokerChannel을 통해 메시지 브로커로 메시지를 보낼 수 있고, 브로커는 clientOutboundChannel을 통해 일치하는 구독자에게 메시지를 브로드캐스트합니다.
동일한 컨트롤러는 HTTP 요청에 대한 응답으로 동일한 작업을 수행할 수도 있으므로, 클라이언트는 HTTP POST를 수행하고, 그 다음 @PostMapping 메서드가 메시지 브로커로 메시지를 전송하여 서브스크립션된 클라이언트에게 브로드캐스트할 수 있습니다.
간단한 예제를 통해 흐름을 추적해 볼 수 있습니다. 다음 예제는 서버를 설정합니다:
1@Configuration 2@EnableWebSocketMessageBroker 3public class WebSocketConfiguration implements WebSocketMessageBrokerConfigurer { 4 5 @Override 6 public void registerStompEndpoints(StompEndpointRegistry registry) { 7 registry.addEndpoint("/portfolio"); 8 } 9 10 @Override 11 public void configureMessageBroker(MessageBrokerRegistry registry) { 12 registry.setApplicationDestinationPrefixes("/app"); 13 registry.enableSimpleBroker("/topic"); 14 } 15}
1@Configuration 2@EnableWebSocketMessageBroker 3class WebSocketConfiguration : WebSocketMessageBrokerConfigurer { 4 override fun registerStompEndpoints(registry: StompEndpointRegistry) { 5 registry.addEndpoint("/portfolio") 6 } 7 8 override fun configureMessageBroker(registry: MessageBrokerRegistry) { 9 registry.setApplicationDestinationPrefixes("/app"); 10 registry.enableSimpleBroker("/topic") 11 } 12}
1@Controller 2public class GreetingController { 3 4 @MessageMapping("/greeting") 5 public String handle(String greeting) { 6 return "[" + getTimestamp() + ": " + greeting; 7 } 8 9 private String getTimestamp() { 10 return new SimpleDateFormat("MM/dd/yyyy h:mm:ss a").format(new Date()); 11 } 12 13}
1@Controller 2class GreetingController { 3 4 @MessageMapping("/greeting") 5 fun handle(greeting: String): String { 6 return "[${getTimestamp()}: $greeting" 7 } 8 9 private fun getTimestamp(): String { 10 return SimpleDateFormat("MM/dd/yyyy h:mm:ss a").format(Date()) 11 } 12}
위 예제는 다음과 같은 플로를 지원합니다:
localhost:8080/portfolio에 연결하고, WebSocket 커넥션이 설정되면 그 위로 STOMP 프레임이 흐르기 시작합니다./topic/greeting인 SUBSCRIBE 프레임을 전송합니다. 수신 및 디코드된 후, 메시지는 clientInboundChannel로 전송되고, 그 다음 메시지 브로커로 라우트되어 클라이언트 서브스크립션을 저장합니다./app/greeting으로 SEND 프레임을 전송합니다. /app 프리픽스는 이를 어노테이션이 붙은 컨트롤러로 라우트하는 데 도움을 줍니다. /app 프리픽스가 제거된 후, destination의 나머지 /greeting 부분은 GreetingController의 @MessageMapping 메서드에 매핑됩니다.GreetingController에서 반환된 값은 반환 값을 기반으로 하는 페이로드와 기본 destination 헤더(/app이 /topic으로 대체된 input destination으로부터 파생된 /topic/greeting)를 가진 Spring Message로 변환됩니다. 결과 메시지는 brokerChannel로 전송되고 메시지 브로커에 의해 처리됩니다.clientOutboundChannel을 통해 MESSAGE 프레임을 전송하며, 그곳에서 메시지는 STOMP 프레임으로 인코드되어 WebSocket 커넥션으로 전송됩니다.다음 섹션은 지원되는 아규먼트와 리턴 값의 종류를 포함하여 어노테이션이 붙은 메서드에 대한 더 많은 세부 정보를 제공합니다.
WebSocket Transport
Annotated Controllers