반응형
서버 쪽 핸들러에 문제가 있는 건가 했는데, 결론적으로는 클라이언트에서 웹소켓 연결 요청할 때 전달되는 쿼리스트링에 인코딩 되지 않은 특수문자가 포함되어 있던 것이 원인이었다.
Websocket-STOMP & SockJS 코드 일부분
✅ 클라이언트 코드
const socket = new SockJS('http://localhost:8083/ws?token=' + username);
✅ 서버 코드
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws")
.setAllowedOriginPatterns("*")
.setHandshakeHandler(customHandshakeHandler)
.withSockJS();
}
✅ 문제상황
위 이미지들을 보면 웹소켓 요청이 실패하여 폴백을 사용하고 있음을 알 수 있다.
즉 토큰 쿼리스트링 값이 정상적으로 전달되지 않아 웹소켓 요청이 실패한 것이다.
URL에 변수를 넣어 전달할 경우 꼭 인코딩 처리를 하자
- 토큰으로 전달되는 값이 ?? 문자열인데, URL을 통해 전달된 공백, =, &, ?, # 같은 특수 문자들은 URL에서 예약된 문자로 전환되므로 의도한 대로 요청이 전달되지 않는다.
- 즉 클라이언트 코드를 다음과 같이 수정해야 한다.
const socket = new SockJS('http://localhost:8083/ws?token=' + encodeURIComponent(username));
마치며
- 클라이언트와 서버 코드의 전체적인 논리는 틀린 게 없는데 웹소켓 요청이 계속 실패했다.
- 인코딩 처리가 왜 필요한지 알 수 있었다.
- SockJS 사용 시 웹소켓 연결에 실패하면 폴백을 사용한다는 점을 알 수 있었다.
이미지 출처
How to Test WebSocket Applications Using a Mobile Phone
The Hypertext Transfer Protocol (HTTP) is an application-layer protocol for communication between web browsers and servers. On the…
medium.com
'개발 > 스프링' 카테고리의 다른 글
Redis 도입을 통한 데이터 캐싱 처리 (5) | 2025.04.06 |
---|---|
Websocket-STOMP 및 DB 통합 테스트해보자 (0) | 2025.04.05 |
[Trouble-shooting] 중첩 클래스명 중복으로 Swagger가 고장났다 (2) | 2025.03.21 |
Faker가 만들어 주는 테스트 데이터, 또 나만 몰랐지 (3) | 2025.03.19 |
[Trouble-shooting] MyBatis는 카멜케이스 설정을 직접 해야 한다 (2) | 2025.03.18 |