Spring Boot에서 제공하는 SimpMessagingTemplate를 통해서 메세지를 주고받을 수 있다.
이렇게 주입받아서 사용할 수 있다!
@Autowired
private SimpMessagingTemplate messagingTemplate;
채팅방에 사람이 입장했을 때, 구독했다는 것을 알려주면서
동시에 프론트쪽으로 DB에 저장해둔 메세지를 전달해주려고 했다.
그래서 처음에는 그냥
messagingTemplate.convertAndSend("/topic/" + roomId, messages);
이렇게 사용을 했었다.
우선은 채팅창에 데이터를 잘 가져오는지 테스트 하고싶어서
단체 채팅방이지만 그냥 한 사람만 들어가서 확인을 했다.
오 !! 데이터를 잘 불러오는 모습을 확인해서
이제 사람을 더 추가해서 테스트 해봐야지 ! 하고 다른 사람으로 채팅창에 추가로 접속해봤더니
...
아니 .. 왜 데이터를 .. 한 번 더 가져오니 ..?
나는 ... 그.. 그렇게 명령어를 적은 적이 없는데 ,,,
다시 정리하자면,
A, B, C, D ... 등등의 사람이 있는 채팅방에
먼저 B라는 사람이 들어와 있었다면, B에게 해당 채팅방에 있는 내역들이 잘 보여진다.
그러다가 C가 들어오면? C에게는 채팅방 내역들이 잘 로드가 되는데,
B에게 보이는 채팅방에도 내용이 한 번 더 로드가 된다 ... 내용이 2배가 돼 ~ (왜
다른 사람이 들어가면 또 로드가 될 모양인데, 그렇게 둘 순 없다 ㅜㅜ
메소드를 convertAndSend
에서 유저에게 보내는 convertAndSendToUser
로 바꿔서 보내보려고 한다 !
sessionId를 이용하면 되지 않을까? 해서 SimpMessageHeaderAccessor에서 sessionId를 받아와서 넣어서 진행해보았다.
String sessionId = headerAccessor.getSessionId();
messagingTemplate.convertAndSendToUser(sessionId, "/topic/" + roomId, messages);
안된다 ! 안된다 ... 되지 않는다 .. 실패했다 ..
sessionId로 구분할 수 있지 않을까? 해서 sessionId로 시도해본 건데, 실패했다 ..
그럼 내가 convertAndSendToUser
메소드를 잘못 사용했나 ?
convertAndSendToUser
메소드는 보통, 1:1 채팅방에서 해당하는 유저에게 보내기 위해서 사용한다고 한다..
같은 개념이라고 생각해서 적용해보려고 했으나 계속 실패해서 결국 ajax
요청을 보내는 것으로 방법을 수정했다.
그래서 순서는
1) 페이지가 로드되면 (GetMapping)
2) 서버쪽으로 채팅방의 메세지 데이터를 요구한다 (GetMapping)
3) 데이터를 받아서 화면에 출력해준 다음
4) 서버쪽으로 webSocket-STOMP 연결 요청을 보낸다 (MessageMapping)
5) 연결이 완료되면 계속해서 메세지를 주고받을 수 있다 (MessageMapping)
이걸 오늘 아침에 테스트 해보려고 했는데 Docker 오류 덕분에 ^^,,
오후에나 테스트해볼 수 있었다 .. 정말 눈물겹다
Docker 무한 실행 오류
https://velog.io/@azuressu/TIL-Docker-%EC%8B%A4%ED%96%89-%EC%98%A4%EB%A5%98