한 줄 정의:
Message(헤더+페이로드)를MessageChannel로 흘려보내고MessageHandler로 처리하는 공통 메시징 추상화와, 그 위에 올라간 STOMP-over-WebSocket 브로커·RSocket 어노테이션 처리 인프라를 제공하는 모듈.
Spring Framework 7.1.0-SNAPSHOT 기준.
서로 다른 메시징 시스템(인메모리 채널, STOMP 브로커, RSocket, JMS, Kafka 등)은 전송 방식이 제각각이지만, 애플리케이션이 보는 모델은 결국 **"헤더가 붙은 페이로드 한 건을 보내고/받고/처리한다"**로 같다. spring-messaging은 이 공통 모델을 다음 세 개의 작은 인터페이스로 못 박는다.
Message<T> : 헤더(MessageHeaders) + 페이로드(T)
MessageChannel : send(Message) — 메시지를 흘려보내는 통로
MessageHandler : handleMessage(Message) — 메시지를 받아 처리
이 세 추상화 위에 다음을 쌓아 올린다.
- 페이로드 변환 (
converter): 자바 객체 ↔ 직렬화 형태(JSON, byte[], String …)를MessageConverter로 통일. - 메시징 템플릿 (
core):JdbcTemplate처럼 "목적지로 보내고/받고/요청-응답"을 한 줄로 (MessageSendingOperations). - 어노테이션 메서드 핸들러 (
handler):@MessageMapping메서드에 메시지를 매핑하고 인자를 해석해 호출 (AbstractMethodMessageHandler). - STOMP/SimpMessaging (
simp): WebSocket 위에서 발행-구독 메시징을 구현하는 브로커, STOMP 프로토콜 인코딩/디코딩, 사용자별 목적지. - RSocket (
rsocket): RSocket 요청/응답을 어노테이션 메서드와RSocketRequester로 처리.
즉 spring-messaging은 "메시징의 공통 언어"를 정의하고, 그 언어로 STOMP·RSocket이라는 두 개의 구체 프로토콜 통합을 완성한 모듈이다. spring-websocket, spring-integration 등이 이 모듈을 기반으로 동작한다.
┌────────────────────────────────────────────┐
│ spring-messaging │
└────────────────────────────────────────────┘
│ 의존(아래로) ▲ 의존받음(위로)
▼ │
spring-core (MimeType, codec, spring-websocket
spring-beans ResolvableType …) spring-integration (외부)
spring-context (Lifecycle, 이벤트) 사용자 애플리케이션
spring-web (HttpHeaders 등, 선택)
reactor-core (리액티브/RSocket, 선택)
io.rsocket (RSocket, 선택)
- 의존하는 모듈:
spring-core(MimeType·codec·ResolvableType),spring-beans/spring-context(빈·SmartLifecycle·이벤트), 선택적으로spring-web·Reactor·RSocket·Netty. - 의존받는 모듈:
spring-websocket(STOMP-over-WebSocket을 이 모듈의 simp 인프라로 구현), 그리고 외부의 Spring Integration·Spring Cloud Stream 등이 핵심 추상화를 재사용한다.
| 번호 | 제목 | 다루는 패키지 | 핵심 질문 |
|---|---|---|---|
| 01 | 메시지 기본 추상화 — Message·Channel·Handler | (루트), support |
메시지 한 건은 어떻게 표현되고 채널을 어떻게 통과하는가 |
| 02 | 페이로드 변환과 메시징 템플릿 | converter, core |
자바 객체는 어떻게 직렬화되고, 목적지로 어떻게 한 줄에 보내는가 |
| 03 | 메서드 핸들러 — @MessageMapping 처리 엔진 | handler, handler/annotation, handler/invocation |
메시지가 어떻게 컨트롤러 메서드 호출로 바뀌는가 |
| 04 | STOMP와 SimpMessaging 브로커 | simp 전체 |
WebSocket 위 발행-구독 메시징은 어떻게 구성되는가 |
| 05 | RSocket 통합과 TCP 전송 | rsocket, tcp |
RSocket 요청을 어노테이션과 Requester로 어떻게 다루는가 |
읽는 순서는 번호 그대로다. 0102가 기반 추상화, 03이 공통 메서드 처리 엔진, 0405가 그 위에 올라간 두 구체 프로토콜이다.
org.springframework.messaging
│
├── (루트) ── 핵심 인터페이스 5종 + 예외
│ Message, MessageChannel, SubscribableChannel, PollableChannel,
│ MessageHandler, ReactiveMessageHandler, MessageHeaders, 예외들
│
├── support/ ── 추상화의 기본 구현 (챕터 01)
│ GenericMessage, MessageBuilder, MessageHeaderAccessor,
│ NativeMessageHeaderAccessor, AbstractMessageChannel,
│ ExecutorSubscribableChannel, ChannelInterceptor …
│
├── converter/ ── 페이로드 변환 (챕터 02)
│ MessageConverter, SmartMessageConverter, AbstractMessageConverter,
│ JacksonJsonMessageConverter, StringMessageConverter,
│ CompositeMessageConverter, ContentTypeResolver …
│
├── core/ ── 메시징 템플릿 (챕터 02)
│ MessageSendingOperations, MessageReceivingOperations,
│ MessageRequestReplyOperations, AbstractMessageSendingTemplate,
│ GenericMessagingTemplate, DestinationResolver …
│
├── handler/ ── 메서드 핸들링 (챕터 03)
│ │ HandlerMethod, MessageCondition, DestinationPatternsMessageCondition
│ ├── annotation/ ── @MessageMapping, @Payload, @Header, @SendTo …
│ │ ├── support/ ── (블로킹) 인자 리졸버·핸들러 팩토리
│ │ └── reactive/ ── (리액티브) 인자 리졸버·MessageMappingMessageHandler
│ └── invocation/ ── AbstractMethodMessageHandler, InvocableHandlerMethod
│ └── reactive/ ── 리액티브 버전 + ChannelSendOperator
│
├── simp/ ── Simple Messaging Protocol = STOMP (챕터 04)
│ │ SimpMessageType, SimpMessageHeaderAccessor, SimpMessagingTemplate
│ ├── broker/ ── SimpleBrokerMessageHandler, SubscriptionRegistry
│ ├── stomp/ ── StompCommand, StompDecoder/Encoder,
│ │ StompBrokerRelayMessageHandler, DefaultStompSession
│ ├── config/ ── AbstractMessageBrokerConfiguration, MessageBrokerRegistry
│ ├── user/ ── 사용자별 목적지 (UserDestinationResolver …)
│ └── annotation/ ── @SubscribeMapping, @SendToUser + 핸들러
│ └── support/ ── SimpAnnotationMethodMessageHandler
│
├── rsocket/ ── RSocket 통합 (챕터 05)
│ │ RSocketRequester, RSocketStrategies, MetadataExtractor
│ ├── annotation/ ── @ConnectMapping
│ │ └── support/ ── RSocketMessageHandler
│ └── service/ ── @RSocketExchange 인터페이스 클라이언트 프록시
│
└── tcp/ ── TCP 전송 추상화 (챕터 05)
│ TcpOperations, TcpConnection, ReconnectStrategy
└── reactor/ ── Reactor Netty 기반 구현
각 박스의 "왜 존재하고 호출되면 무슨 일이 일어나는가"는 해당 챕터에서 소스 근거로 풀어 설명한다.