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));
데이터 전달 방식
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 요청의 컨텍스트에서 인식할 수 없습니다.
WebSocketSession
은 WebSocket 연결이 성립되었을 때만 생성되는 객체이며, 일반 HTTP 요청으로 WebSocket 핸드셰이크를 시작할 때 사용할 수 없습니다.@RequestMapping
은 일반 HTTP GET/POST 요청을 처리하기 위한 어노테이션이므로, 이를 통해 WebSocket의 세션을 얻으려는 시도는 실패하게 됩니다.WebSocketConfigurer
또는 STOMP 설정을 사용해야 합니다. 일반 HTTP 요청으로 WebSocketSession
을 직접 주입하는 방식은 올바르지 않으므로 이 부분을 수정해야 합니다.WebSocketHandler
를 사용하여 WebSocket 요청을 수신하고 WebSocketSession
을 처리해야 합니다.WebSocketHandler
를 구현하고, 이를 통해 WebSocket 세션을 관리할 수 있습니다.