스프링 웹 소켓 알아보기(5)
스프링 웹 소켓 알아보기 마지막 포스팅
스프링 웹 소켓에 대한 마지막 포스팅이다.
핵심 개념이라 생각되는 것 들은 앞 포스팅에서 정리해왔고 이제는 부가적인 정보만 정리해보겠다.
어노테이션
@MessageMapping
- STOMP 메시지의 destination 헤더에 따라 메시지를 특정 메서드로 라우팅하는데 사용
- 메서드, 클래스 레벨에 적용 가능
- 메서드 레벨 : 개별 메시지 경로 매핑
- 클래스 레벨 : 해당 클래스의 모든 메서드에 공통 경로 적용
- Ant-style, 템플릿 변수 지원
- Ant-style ex)
/thing*,/thing/** - 템플릿 변수 ex)
/thing/{id}->@DestionationVariable로 접근 가능
- Ant-style ex)
- 경로 스타일 지원
/room/{id}(기본 슬래시 스타일)room.id(점(.) 스타일)
지원 메서드
| 인자 | 설명 |
|---|---|
Message |
메시지 전체를 가져올 수 있음 |
MessageHeaders |
메시지 헤더에 접근 가능 |
@Payload |
* 메시지의 본문에 접근. * 자동변환은 설정된 MessageConverter에 의해 처리됨* @Valid를 적용하여 검증기능 가능 |
@Header |
특정 헤더 값에 접근 |
@Headers |
모든 헤더에 접근 가능.(Map 형태로 주입) |
java.security.Principal |
WebSocket 핸드셰이크 시 인증된 사용자 정보를 반영 |
@SubscribeMapping
- 구독 요청에 대해 한 번만 응답하는 1회성 요청-응답 처리
- 기본적으로 브로커가 아닌 클라이언트로 직접 응답함
brokerChannel이 아닌clientOutboundChannel로 응답
- 구독 정보를 저장하거나 반복 브로드캐스트 하지 않음
- 사용 사례: 초기 데이터 로드나 클라이언트 초기화 요청 처리
@MessageExceptionHandler
@MessageMapping에서 발생한 예외를 처리- 예외 객체를 메서드 인자로 받아서 처리
- 동일한 컨트롤러 내에서만 적용되며, 전역으로 적용하려면
@ControllerAdvice사용
SimpMessagingTemplate
- 스프링에서 제공하는 메시지 전송 유틸리티 클래스
- 컨트롤러 외부에서도 WebSocket 클라이언트로 메시지를 전송할 수 있음
@Controller
public class GreetingController {
private SimpMessagingTemplate template;
@Autowired
public GreetingController(SimpMessagingTemplate template) {
this.template = template;
}
@RequestMapping(path="/greetings", method=POST)
public void greet(String greeting) {
String text = "[" + getTimestamp() + "]:" + greeting;
this.template.convertAndSend("/topic/greetings", text);
}
}
SimpMessagingTemplate은 내부적으로brokerChannel로 메시지를 전송- 활용 사례:
- 백그라운드 작업 완료 후 결과 알림
- 특정 사용자에게 실시간 알림 전송
- 외부 이벤트 기반 메시지 전송
인증처리
(스프링 시큐리티를 사용한다고 가정)
기본 인증시와 토큰기반 인증상황을 살펴보자.
- 기본인증
- 대부분 HTTP 요청에서 인증을 이미 설정
- 인증된 사용자는 쿠키 기반 세션을 통해 HTTP 요청에서 인증정보를 유지
- WebSocket 핸드셰이크 시, Spring이 HTTP세션의 인증정보를 가져와 WebSocket 세션과 연결
- 이후 STOMP 메시지에
user헤더로 인증정보가 자동으로 포함
- 토큰기반인증
- WebSocket은 핸드셰이크에서 커스텀 헤더를 전송할 수 없음
- 따라서 핸드셰이크 이후 CONNECT 프레임을 전송할때 Authorization 프로퍼티를 추가하여 보내면 됨
- 클라이언트 라이브러리(예: stomp.js)를 사용하면 CONNECT 프레임은 자동 전송됨.
- 커스텀 클라이언트의 경우 수동으로 CONNECT 프레임에 Authorization 헤더를 추가해야 함.
여기까지 웹 소켓에 대한 이론적인 내용을 마치도록 하겠다.
원래는 비트코인 자동매매시 거래정보를 가져오는 방식으로 웹 소켓을 이용하려고 하였는데 아직 한번도 써보지 않았으며 투자에 대한 지식을 더 마련해야할 것 같다.
따라서 실시간 채팅을 만들어보면서 이해도를 가져가보려고 한다.