spring + stomp 웹소켓에서 message 중복 전송되는 경우

최근 블로그 포스팅이 더뎠는데 stomp를 통한 1:1 채팅 구현때문에 포스팅을 못하였다
아직도 문제점이 많고 공부중이라 포스팅에 신경을 못썼는데 구현이 끝나면 한번에 정리하고자 한다.
덤으로 네트워크도 같이 공부하고 있어서 바쁘다바빠

사건의 발단

jsp에서 채팅을 웹소켓에 전송했을 때 MESSAGE전송이 콘솔창에 연속으로 4개 찍히는 것을 보고 이상함을 느낌

 

 

실제로도 메시지를 한번만 입력하더라도 4번이나 출력되는 것을 볼 수 있었다.

 

 

현재 내 웹소켓 프로세스가 실행되는 순서는

커넥트에서 소켓에 연결을 하고 채팅을 보내게 되면

 

sendMessage를 통해 /chatMessage로 매핑된 곳으로 메시지를 보내게 된다.

그 후에 ChatController에서 채팅방을 구분해서 채팅 메시지를 보내준다.

이 후에 아까의 connect함수에서 stompClient.subscribe를 통해 받아준 메시지를 다시 쏴주는 과정이다. 일단 어느 단계에서 메시지 중복 전달이 이루어지는지 확인하고자 콘솔창을 통해 확인 해 보았다.

 

 

콘솔창을 확인 해보았을때 /subscirbe/11147이라는 목적지로 메시지를 4번 쏴주는 것을 확인 할 수있는데 쏴주는 것은 ChatController의 send 함수이니 convertAndSend 과정에서 문제가 발생하는 것으로 추측해볼 수 있었다.

 

converAndSend가 문제라고 생각한 것은 send() 함수에서 아무 메시지나 출력하면 하나만 출력하기 때문에 send() 함수 자체가 중복 실행되는 것은 아니라고 생각했기 때문이다.

 

 

로그에서 봤을 때 채팅이 발생했을 때 inboundChannel에 애초에 내가 요청한 메시지 보다 많은 양이 전달되는 것 같았다. 이렇게 봤을 때 함수 자체의 문제보다는 stomp의 환경설정 단계에서 내가 빼먹은 것이 있거나 잘못 설정한게 있지 않을까 라는 추측을 해보았다.

그러던 중 콘솔에서

애초에 커넥션이 일어날때 중복해서 일어나는 점을 보았고 (subscribe가 sub-0, sub-1 두개가 생겼다)

웹소켓 연결시에 뭔가 문제가 발생하지 않았나 생각하게 되었다.

해결

소스를 한곳에서 진득하게 보지않고 구글링을 통해 이곳저곳에서 짬뽕하다 보니 중복 설정이 들어가게 되었다.

stomp broker 설정시에

WebsocketConfig를 만들어주던가 혹은  xml에 따로 추가를 해야하는데 나는 이 두 곳 모두에 broker 설정을 해주었다. 그렇기 때문에 두개의 broker가 생긴거고 메시지가 중복해서 보내진 것이었다.

 

 

둘 중에 하나만 설정해줘야 한다.!

해결법은

https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/html/websocket.html

을 통해 알게되었음

+ Recent posts