

차자바 프로젝트에서 1:1 채팅 서비스를 개발하면서, 단순한 웹소켓을 넘어서 보다 안정적이고 효율적인 실시간 메시징 시스템을 구축하고자 했습니다.
처음에는 STOMP(WebSocket)만을 사용하여 채팅 기능을 구현했지만, 메시지의 손실과 관리의 어려움이 발생했습니다. 이에 따라 메시지 브로커를 도입해야겠다고 판단하였고, 최종적으로 STOMP + RabbitMQ 조합을 선택하여 채팅 시스템을 구축하였습니다.
웹소켓을 보다 간편하게 사용
여러 목적지를 설정할 수 있음
/topic, /queue 등의 목적지를 활용하여 1:1 채팅과 그룹 채팅을 유연하게 처리할 수 있습니다.백엔드와 프론트엔드의 손쉬운 연동
메시지의 안정적인 저장과 전달
메시지 큐잉을 활용한 부하 분산
다양한 메시지 브로커와의 확장성
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue", "/topic");
registry.setApplicationDestinationPrefixes("/app");
}
}
registerStompEndpoints: 클라이언트가 WebSocket을 연결할 수 있는 엔드포인트 등록enableSimpleBroker: 메시지를 전달할 수 있는 목적지 설정 (1:1 채팅은 /queue, 그룹 채팅은 /topic)@Component
public class ChatMessageListener {
private final SimpMessagingTemplate messagingTemplate;
@RabbitListener(queues = "chat.queue")
public void receiveMessage(ChatMessage message) {
messagingTemplate.convertAndSendToUser(
message.getReceiver(), "/queue/messages", message
);
}
}
@RabbitListener를 통해 메시지를 수신하고, 이를 STOMP를 통해 해당 사용자에게 전달


이번 프로젝트를 통해 실시간 채팅 시스템을 구축하며, STOMP와 RabbitMQ를 활용한 비동기 메시징 시스템의 중요성을 배울 수 있었습니다.
💡 배운 점
향후 Redis, Spring Batch, Kafka 등의 기술을 추가로 도입하여 더욱 안정적이고 효율적인 실시간 채팅 시스템을 완성해 나가고자 합니다. 🚀