Skip to content

Latest commit

 

History

History
119 lines (98 loc) · 7.8 KB

File metadata and controls

119 lines (98 loc) · 7.8 KB

spring-messaging — 메시징 추상화와 STOMP/RSocket 통합

한 줄 정의: Message(헤더+페이로드)를 MessageChannel로 흘려보내고 MessageHandler로 처리하는 공통 메시징 추상화와, 그 위에 올라간 STOMP-over-WebSocket 브로커·RSocket 어노테이션 처리 인프라를 제공하는 모듈.

Spring Framework 7.1.0-SNAPSHOT 기준.


1. 이 모듈이 푸는 문제

서로 다른 메시징 시스템(인메모리 채널, 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 등이 이 모듈을 기반으로 동작한다.


2. 의존 관계

        ┌────────────────────────────────────────────┐
        │              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 등이 핵심 추상화를 재사용한다.

3. 하위 챕터 목차

번호 제목 다루는 패키지 핵심 질문
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가 그 위에 올라간 두 구체 프로토콜이다.


4. 전체 패키지 구조 맵

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 기반 구현

각 박스의 "왜 존재하고 호출되면 무슨 일이 일어나는가"는 해당 챕터에서 소스 근거로 풀어 설명한다.