Spring Boot에 채팅 기능을 구현해보자.
이번 글에서는 자세한 내용에 대해 이야기하기 앞서 채팅 기능의 원리, 그리고 STOMP와 RabbitMQ에 대해 간략하게 알아보자.
1. 채팅 기능 작동 원리
기본적으로, 사용자가 상대방의 답변을 기다리지 않고도 지속적으로 메시지를 보낼 수 있고
실시간으로 메시지를 확인하기 위해서는 서버와 클라이언트 간의 실시간 통신이 필요하다.
이전에는 Polling과 같이 지속적으로 서버에 새로운 데이터가 있는지 물어보는 방식의 통신을 사용했다면
현재는 web socket이라는 것을 사용하여 새로운 request를 여러번 보내는 것이 아니라,
한번의 연결을 지속적으로 유지하면서 서버와 클라이언트와의 실시간 통신을 가능하게 한다.
이렇게 WebSocket을 사용해서 채팅 기능을 구현할 수 있다.
2. STOMP & RabbitMQ
STOMP (Simple Text Oriented Messaging Protocal)
STOMP은 간단하게 말해 메시지 브로커와 통신하기 위한 프로토콜이다.
WebSocket 위에서 동작하며, 메시지의 전송 및 구독 (publish/subscribe)을 쉽게 구현할 수 있게 도와준다.
장점
- 간편한 사용:
- WebSocket과 쉽게 통합할 수 있어 빠르게 실시간 통신 기능 구현 가능
- 표준화된 프로토콜:
- 이해하기 쉬운 텍스트 기반의 프로토콜
- 다양한 클라이언트와 서버에서 사용 가능
단점
- 확장성 부족:
- 다수의 클라이언트가 동시 접속할 경우, 성능 저하가 있음
- 단일 서버에서 모든 연결을 관리해야하기 때문
- 복잡한 메시지 관리:
- 메시지의 라우팅, 보관, 재전송 등의 기능을 관리하기가 어려움
- 예시) 특정 유저에게만 메시지를 전송한다거나 메시지를 임시저장 후 다시 전달하는 등의 경우
RabbitMQ
RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 구현한 메시지 브로커다.
높은 성능과 확장성을 제공하며, 다양한 메시지 패턴을 지원한다.
AMQP
AMQP(Advanced Message Queuing Protocol)는 메시지를 주고받는 시스템을 위한 표준 프로토콜이다.
다시 말해, 서로 다른 시스템들 간에 메시지를 안전하게 전달하기 위한 규칙을 정의한 것입니다.
- Message:
- Queue:
- 큐는 메시지가 잠시 머무르는 장소
- 메시지는 큐에 저장되었다가 소비자(consumer)가 꺼내 사용한다
- Exchange:
- 메시지를 적절한 큐로 보내는 역할
- 예시) 교환기는 메시지의 종류에 따라 다른 큐로 메시지를 보낼 수 있음
- Binding:
- 바인딩은 교환기와 큐 간의 연결을 정의하는 규칙
장점
- 높은 확장성:
- 대규모 트래픽을 효율적으로 처리
- 여러 서버에 분산하여 운영 가능
- 많은 사용자들이 동시에 접속해도 안정적인 성능을 유지
- 신뢰성:
- 메시지를 안전하게 전달
- 시스템 오류가 발생해도 메시지를 잃지 않도록 보장
- 메시지는 큐에 저장되며, 필요할 때 꺼내 사용할 수 있음
- 다양한 기능:
- 다양한 메시지 전달 방식(큐, 토픽, 라우팅 등)을 지원
- 유연성:
- 예시) 특정 조건에 맞는 메시지를 필터링하거나, 여러 큐로 메시지를 분산시킬 수 있음
단점
- 복잡성:
- 많은 기능을 제공하는 만큼 설정과 운영이 복잡할 수 있으며, 추가적인 학습이 필요
- 추가적인 인프라:
- 서버를 별도로 운영해야 하므로, 추가적인 리소스와 비용이 발생할 수 있음
STOMP와 RabbitMQ를 같이 사용하는 이유
장점
- 확장성과 성능:
- STOMP를 사용하여 간편한 메시지 전송과 구독을 구현하면서, RabbitMQ를 통해 확장성과 성능을 극대화할 수 있음
- 많은 클라이언트가 동시에 접속해도 안정적인 성능을 유지할 수 있음
- 관리 용이성:
- RabbitMQ의 메시지 큐잉과 라우팅 기능을 활용하여 복잡한 메시지 쉽게 관리
- 신뢰성:
- RabbitMQ의 신뢰성을 활용해 메시지 손실을 최소화할 수 있음
- 메시지가 지속적으로 저장되며, 시스템 오류가 발생하더라도 안전하게 전달 가능
보완되는 단점
- 복잡성 관리:
- STOMP의 간편함과 RabbitMQ의 강력한 기능을 결합하여 상대적으로 복잡성을 줄일 수 있음
- STOMP를 통해 메시지 전송과 구독을 쉽게 구현하고, RabbitMQ를 통해 복잡한 메시지 관리
결론
STOMP의 간편함을 활용해 메시지 전송/구독을 구현하고 RabbitMQ의 기능들을 통해 메시지의 저장, 분산 처리 등 복잡한 메시지 관리를 효율적으로 진행해 장기적으로 더 안정적이고 확장성 있는 시스템을 구축하기 위함