-
WebSocket, STOMP를 이용한 채팅 구현프로젝트/AutoMeet 2024. 4. 4. 20:49
2024-1 정보통신종합설계에서 화상채팅 관련 프로젝트를 진행하기 때문에 실시간 채팅을 구현해야 했다.
스프링에서는 웹 소켓이라는 프로토콜과 STOMP(Simple Text Oriented Messaging Protocol)을 이용해서 실시간 양방향 통신이 이루어진다.
웹 소켓 외에도 HTTP의 폴링과 SSE 방식이 있지만 가장 보편적이며 좋은 것이 웹 소켓이라고 한다.
WebSocketConfigurer
@Configuration @EnableWebSocketMessageBroker public class WebSocketConfigurer implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.enableSimpleBroker("/sub"); registry.setApplicationDestinationPrefixes("/pub"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry. addEndpoint("/ws") .setAllowedOrigins("*"); } }
STOMP는 pub/sub 기반으로 작동한다. pub/sub은 publisher, subscriber 으로 publisher가 topic을 구독하고 있는 subscriber에게 메시지를 전달하는 방식이다.
configureMessageBroker 메서드는 메시지 브로커를 구성하며 /sub 주제 프리픽스를 가진 메시지 브로커를 활성화한다.
registerStompEndpoints 메서드는 STOMP 엔드포인트로 /ws 엔드포인트를 등록해주며 모든 경로를 허용한다.
위의 구성을 통해 클라이언트는 /pub 프리픽스를 가진 엔드포인트로 메시지를 보내고, /sub 프리픽스를 가진 주제를 구독하여 양방향 통신이 이루어진다.
Message
@Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Message { private String type; private String sender; private String channelId; private String data; }
Message 객체에는 type, sender, channelId, data가 있다. 메시지를 보낼 때 각각의 정보를 담아서 메시지를 전송할 수 있다.
MessageController
@Controller @RequiredArgsConstructor public class MessageController { private final SimpMessageSendingOperations simpleMessageSendingOperations; @MessageMapping("/hello") public void message(@RequestBody Message message) { simpleMessageSendingOperations.convertAndSend("/sub/channel/" + message.getChannelId(), message); } }
@MessageMapping은 처음 써보는 어노테이션인데, message를 보내는 STOMP에서 사용된다. simpleMessageSendingOperations를 통해 /sub/channel/channelId로 메시지를 보내게 된다.
스프링을 실행시키고 나서 apic 웹앱을 2개 켜둔 다음에 왼쪽 apic에서 JSON 형태로 Send를 했더니 오른쪽의 Messsages에 출력되었다.
정말 간단한 양방향 통신 시스템이고, 프로젝트에 적용시키려면 수정할 부분이 많이 필요하겠지만 이를 바탕으로 웹 소켓을 통한 실시간 채팅 시스템을 구축할 수 있을 것이다.
완벽하게 구현하고 나서 구현한 것을 포스팅하러 돌아오겠다.
Spring Websocket & STOMP (brunch.co.kr)
위의 블로그를 참고하여 학습했는데 웹 소켓과 STOMP 같은 메시지 브로커에 대해 잘 나와있으므로 웹 소켓에 관심 있으면 찾아보길 바란다.
'프로젝트 > AutoMeet' 카테고리의 다른 글
AutoMeet에 사용하기 위해 fine-tuning한 ai 모델들 (0) 2024.06.27 Mongo db의 embedded 관계로 설계 변경 (0) 2024.05.17 Openvidu를 이용한 화상채팅 서버 (0) 2024.05.12 스키마의 유연성을 위한 mongo db 사용 (0) 2024.04.11