목차
- SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (1) - 현재 게시글
- SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (2)
- SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (3)
이번에 사이드 프로젝트를 진행하면서 채팅 기능을 구현하게 됐다. 관련하여 공부해본 내용을 작성해본다.
채팅이라고 하면 일반적으로 아래와 같은 프로세스로 통신 하게 된다.
이 때 클라이언트와 서버는 HTTP 통신이 아닌, 소켓 통신을 하게 된다.
Why? 클라이언트와 서버간 연결을 수립해두고, 해당 경로를 통해 통신하기 위함이다. HTTP 통신은 한번 연결 수립 후 응답이 오게 되면 연결이 끊기게 된다.
클라이언트A와 서버가 연결되고, 클라이언트B와 서버가 연결된 상태에서 클라이언트A가 채팅 메시지를 보내면 서버가 클라이언트B에게 보내주는 형태이다.
이러한 방식은 클라이언트A와 B 모두 서버와 연결되어 있을 때만 사용 가능하다. 즉, 한 사람이 채팅 앱을 꺼뒀다면 메시지를 주고 받을 수 없는 것이다. 하지만 카카오톡을 비롯한 채팅 서비스는 그렇지 않다.
실제 상용 채팅 서비스는 클라이언트의 채팅 메시지 전송을 수신한 뒤 데이터베이스에 저장하고, 만약 수신자가 서버와 연결되어 있다면 소켓 통신을 통해 메시지를 곧장 보내주고 그렇지 않다면(앱이나 채팅방을 꺼뒀다면) 앱에 메시지가 왔다는 푸쉬 알람을 보내는 형식으로 동작한다.
오늘은 이 중 소켓 통신을 이용한 클라이언트<->서버<->클라이언트간 통신에 대해 다뤄보고자 한다.
소켓 통신 예시
소켓 통신 시 클라이언트와 서버는 아래와 같은 메시지를 주고 받게 된다.
1. ClientA -> Server
{"type":"ENTER", "sender":"ClientA"}
2. ClientB -> Server
{"type":"ENTER", "sender":"ClientB"}
3. Server -> ClientA
{"type":"ENTER", "sender":"ClientB"}
4. ClientB -> Server
{"type":"MESSAGE", "sender":"ClientB", "message": "안녕하세요."}
5. Server -> ClientA
{"type":"MESSAGE", "sender":"ClientB", "message": "안녕하세요."}
정말 간단한 예시다. 하지만 이걸 코드로 구현하려면 꽤나 번거롭다.
클라이언트에서 서버로 메시지를 보내는 경로와 서버에서 클라이언트로 메시지를 보내는 경로가 서로 다르고 이걸 관리해야하기 때문이다.
STOMP; Simple (or Streaming) Text Oriented Message Protocol
이걸 조금이나마 쉽게 할 수 있도록 도와주는 프로토콜 중 하나가 STOMP 이다.
풀네임 그대로 텍스트 형태의 메시지를 쉽게 주고받을 수 있는 프로토콜이라 볼 수 있다.
해당 프로토콜은 pub(publish), sub(subscribe)이라는 개념으로 동작하는 프로토콜인데, 클라이언트가 서버로 메시지를 보내는 것을 pub, 클라이언트가 서버로부터 메시지를 받는 것을 메시지를 구독한다는 개념으로 sub이 사용된다.
또한 pub/sub을 중계 해줄 수 있는 브로커(broker)가 필요하다. 유명한 메시징 시스템인 RabbitMQ 같은걸 사용하거나 in-memory broker를 구축 해 사용할 수 있다.
다행스럽게도 SpringBoot에는 pub/sub 개념을 지닌 STOMP 프로토콜을 기반으로 in-memory broker를 함께 제공하는 라이브러리가 존재한다. (물론 in-memory broker는 단점을 지니고 있으며, broker는 외부 메시징 시스템으로 변경할 수 있다)
그래서 이걸 사용하여 시스템을 구현하기로 했다.
다음 편에 계속 - SpringBoot에서 STOMP로 채팅 애플리케이션 만들기 (2)
☕️ Networking
기술 직군의 기술적인 교류, 커리어 이야기, 직군 무관 네트워킹 모두 환영합니다!
위클리 아카데미 오픈 채팅방(비밀번호: 9323)
kakaotalk: https://open.kakao.com/o/gyvuT5Yd