STOMP란?
- Simple Text Oriented Messaging Protocol는 간단한 텍스트 기반의 메시징 프로토콜이다.
- 웹 소켓 위에서 동작하며, 클라이언트와 서버 간의 비동기 통신을 위해 설계됐다.
- TCP 또는 WebSocket 같은 양방향 네트워크 프로토콜 기반으로 동작
- pub/sub 구조로 동작
프로토콜 특징
- 텍스트 기반 : 사람이 읽을 수 있는 형식으로 되어 있어 디버깅이 쉽다.
- 경량화 : 최소한의 프로토콜 오버헤드로 설계되어 있다.
- 언어 독립적 : 다양한 프로그래밍 언어에서 구현 가능하다.
기본 개념
- Frame : STOMP 메시지의 기본 단위이다.
- Command : 각 프레임의 시작 부분에 있는 동작을 나타내는 문자열이다.
- Header : 키-값 쌍으로 이루어진 메타데이터이다.
- Body : 선택적인 메시지 페이로드이다.
Pub/Sub
- 발행/구독 구조
- publisher가 특정 topic에 메시지를 보내면 해당 topic을 구독하고 있는 subscriber 모두에게 메시지가 전달되는 구조이다.
주요 명령어
- CONNECT : 서버와의 연결을 초기화 한다.
- SUBSCRIBE : 특정 목적지의 메시지를 구독한다.
- SEND : 메시지를 특정 목적지로 전송한다.
- DISCONNECT : 서버와의 연결을 종료한다.
사용 예시
- 실시간 채팅 애플리케이션
- 주식 시세 업데이트
- 실시간 협업 도구
- IoT 디바이스 통신
장점
- 간단한 구현 : 복잡한 설정 없이 빠르게 구현할 수 있다.
- 높은 호환성 : 다양한 언어와 플랫폼에서 지원된다.
- 확장성 : 커스텀 헤더를 통해 프로토콜을 확장할 수 있다.
단점
- 성능 : 텍스트 기반이기 때문에 이진 프로토콜에 비해 효율성이 떨어질 수 있다.
- 기능 제한 : 복잡한 메시징 시나리오에는 부적합할 수 있다.
Spring에서 활용하기 위해 알아둬야할 점
Spring WebSocket 지원
- Spring 프레임워크는 WebSocket과 STOMP를 위한 강력한 지원을 제공한다.
- spring-websocket 모듈을 통해 websocket 서버를 쉽게 구현할 수 있다.
STOMP 메시징 아키텍처
- Message Broker : 클라이언트 간 메시지 라우팅을 담당한다.
- Destination : 메시지의 목적을 나타내는 문자열이다.
- Message Mapping : 특정 Destination으로 오는 메시지를 처리하는 메서드를 매핑한다.
주요 어노테이션
@EnableWebSocketMessageBroker
: WebSocket 메시지 브로커를 활성화한다.@MessageMapping
: 특정 destination으로 오는 메시지를 처리할 메서드를 지정한다.@SubscribeMapping
: 구독 요청을 처리하는 메서드를 지정한다.@SendTo
: 메서드의 반환값을 특정 destination으로 전송한다.@SendToUser
: 특정 사용자에게만 메시지를 전송한다.
구성 클래스
WebSocketMessageBrokerConfigurer
인터페이스를 구현하여 STOMP 설정을 커스터마이즈한다.configureMessageBroker()
: 메시지 브로커 옵션을 설정한다.registerStompEndpoints()
: STOMP 엔드포인트를 등록한다.
메시지 브로커 유형:
- Simple Broker: 메모리 내 메시지 브로커로, 간단한 애플리케이션에 적합하다.
- Full-featured Broker: RabbitMQ나 ActiveMQ 같은 외부 메시지 브로커를 사용한다.
보안:
- Spring Security와 통합하여 WebSocket 연결과 메시지에 대한 인증 및 권한 부여를 구현할 수 있다.
- STOMP headers를 통해 인증 토큰을 전달할 수 있다.
에러 핸들링:
@MessageExceptionHandler
를 사용하여 메시지 처리 중 발생하는 예외를 처리할 수 있다.
클라이언트 측 연동:
- SockJS: WebSocket을 지원하지 않는 브라우저를 위한 폴백 옵션을 제공한다.
- STOMP.js: 클라이언트 측에서 STOMP 프로토콜을 쉽게 사용할 수 있게 해주는 JavaScript 라이브러리이다.
세션 관리:
WebSocketHandler
를 구현하여 WebSocket 세션의 생명주기를 관리할 수 있다.- 연결, 연결 해제, 에러 등의 이벤트를 처리할 수 있다.
메시지 변환:
MessageConverter
를 구현하여 메시지 페이로드의 직렬화/역직렬화를 커스터마이즈할 수 있다.- 기본적으로 JSON 변환을 지원합니다.
인터셉터:
ChannelInterceptor
를 구현하여 메시지 처리 파이프라인에 로직을 추가할 수 있다.- 메시지 필터링, 수정, 로깅 등에 사용됩니다.
테스트:
- Spring Test 모듈은 WebSocket과 STOMP 메시징을 위한 테스트 지원을 제공한다.
StompEndpointRegistry
와StompClient
를 사용하여 통합 테스트를 작성할 수 있다.