[Spring] WebSocket & STOMP 를 이용하여 채팅 고도화하기
이부분에서는 메시지 브로커사용을 하지않고 STOMP를 이용하여 채팅을 구현할 예정이다.
1. STOMP ?
- STOMP는 스트리밍 텍스트 지향 메시징 프로토콜이다.
- 기존에 작성한 WebSocket을 좀 더 효율적으로 다루기 위한 프로토콜이다.
- 기존에 작성한 WebSocket에서는 Handler의 요청을 받으면 해당 ChatRoom을 찾아서 Session들에게 메세지를
뿌려주어야하는 과정을 코드로 일일이 작성을 해야하는 번거러움이 있었다.
- STOMP는 메세지를 전송하기전 Subscriber 와 Publisher를 지정한다.
- Subscriber를 하면 해당 URL로 들어오면 메세지는 나에게 올수 있도록 Socket을 만들어주는 셈이고, Publisher을 하면
내가 Publisher한 URL로 메세지가 이동하게 되는 Socket을 만들어준다고 생각하면 될거 같다.
- STOMP 클라이언트는 추후 적용할 STOMP 프로토콜을 지원하는 메시지 브로커와 통신한다. STOMP를 이용해
손쉬운 연결, 송수신, 구독, 연결 끊기 등과 같은 명령을 사용 가능하다.
2. 구현
먼저 Stomp가 중간 메세지 브로커 역할을 하기 때문에 WebSocketMessageBrokerConfigurer을 구현해야한다.
resgisterStompEndpoints : /chat url로 동작하는 SockJs를 만들어 등록하는것
config.enableSimpleBroker : subscriber할때 perfix URL /topic
config.setApplicationDestinationPrefixes : publisher할때 perfix URL /app
@MessageMapping : /app의 경우 기본 publish로 지정했기 때문에 /app이후 url만 MessageMapping으로 요청받고
각자 입맛에 맞게 변형한 뒤 SimpMessagingTemplate를 통해서 내가 보내주고자 하는 사람이 subscribe한 링크로 보내주면 된다.
최초 room 방문시 sockJs("/Chat)을 등록하고
stomp를 통해서 /topic/ + roomId 를 Subscriber 합니다.
메세지 전송은 /app/chat/send 를 통해서 할수있고, /topic/+roomId 를 subscriber 한 유저에게 메세지가 전달되게 됩니다.