스프링 웹 소켓 알아보기(5)

스프링 웹 소켓 알아보기 마지막 포스팅

스프링 웹 소켓에 대한 마지막 포스팅이다.
핵심 개념이라 생각되는 것 들은 앞 포스팅에서 정리해왔고 이제는 부가적인 정보만 정리해보겠다.

어노테이션

@MessageMapping

  • STOMP 메시지의 destination 헤더에 따라 메시지를 특정 메서드로 라우팅하는데 사용
  • 메서드, 클래스 레벨에 적용 가능
    • 메서드 레벨 : 개별 메시지 경로 매핑
    • 클래스 레벨 : 해당 클래스의 모든 메서드에 공통 경로 적용
  • Ant-style, 템플릿 변수 지원
    • Ant-style ex) /thing*, /thing/**
    • 템플릿 변수 ex) /thing/{id} -> @DestionationVariable로 접근 가능
  • 경로 스타일 지원
    • /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 헤더를 추가해야 함.

여기까지 웹 소켓에 대한 이론적인 내용을 마치도록 하겠다.
원래는 비트코인 자동매매시 거래정보를 가져오는 방식으로 웹 소켓을 이용하려고 하였는데 아직 한번도 써보지 않았으며 투자에 대한 지식을 더 마련해야할 것 같다.
따라서 실시간 채팅을 만들어보면서 이해도를 가져가보려고 한다.