실시간 데이터 전달 방식

  1. 종목별 구독자 저장 방식

Redis pub/sub 기능으로 종목별 유저의 데이터가 Redis 에 set 자료구조 형태로 저장되어있다.

예를들면 “KRW-BTC” 라는 종목에 “1”, “2” 번의 userId 를 가진 Redis 의 market:KRW-BTC:subscribers 의 key 값에 value 값으로 저장되어있다.

redisTemplate.opsForSet().add("market:" + marketCode + ":subscribers", String.valueOf(userId));
  1. 데이터 전달 방식

    image.png

    image.png

트러블 슈팅

#1.문제상황

2024-10-09T16:48:51.317+09:00 ERROR 12752 --- [market] [io-19100-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet 
[dispatcherServlet] in context with path [] threw exception [Request processing failed: 
java.lang.IllegalStateException: No primary or single unique constructor found for interface org.springframework.web.socket.WebSocketSession] with root cause

해당 오류가 발생한 이유는 handleWebSocketConnect 메서드에서 WebSocketSession 객체를 매개변수로 받으려 시도했기 때문입니다. Spring MVC가 WebSocketSession을 자동으로 주입하려고 하지만, 이 타입은 Spring에서 일반 HTTP 요청의 컨텍스트에서 인식할 수 없습니다.

#1.문제 원인

#1.해결 방안

  1. WebSocket 핸드셰이크 및 연결 방식 수정:
  2. WebSocket 핸들러 정의: