스프링으로 채팅 기능 구현하기 (개념편)

성훈·2023년 9월 18일
0

프로젝트

목록 보기
2/2

들어가며

  • 새로 진행 중인 프로젝트에서 채팅 기능을 처음으로 구현하고자 한다.
  • 실시간 통신이 가능한 웹소켓과 STOMP에 대해 알아보자.
  • STOMP로 채팅 서비스를 구현해보자.

웹소켓이란?

웹소켓은 응용 계층에서 사용되는 양방향, 전이중 통신 프로토콜로서 클라이언트와 서버가 데이터를 주고 받는 구조를 가지고 있다. 그러나 HTTP와는 다르게, 한 번 연결되면 서버나 클라이언트 중 한 쪽의 연결 해제가 있기 전까지 연결이 유지된다는 특이성이 있다. 그로 인해 실시간 데이터가 지속적으로 업데이트되는 상황(채팅, 게임, 트레이딩)에서 유용하게 사용되곤 한다.

HTTP, HTTPS 연결을 웹소켓으로 업그레이드하여 사용하는데, 과정은 다음과 같다.

  1. 클라이언트에서 서버로 HTTP 요청
  • 헤더에 websocket으로 Upgrade함을 포함, 인증에 사용되는 키도 함께 보낸다.
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
  1. 서버의 응답
  • 101(업그레이드 수락) 메시지와 함께 Accept 키를 반환함.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
  1. 웹소켓 연결 설정
  2. 웹소켓 통신

이러한 과정을 거친 후

STOMP란?

STOMP(Simple Text Oriented Messaging Protocol)는 중개 서버를 통해 클라이언트 간에 비동기 메시지를 전달하기 위해 설계된 간단한 상호 운용 프로토콜이다. 프레임 기반의 프로토콜이며 HTTP를 모델로 한 프레임을 사용한다. STOMP 클라이언트는 생산자로서 SEND 프레임을 통해 서버 대상에게 메시지를 보내거나, 소비자로서 지정된 대상자들에게 SUBSCRIBE 프레임을 전송하고 서버로부터 MESSAGE 프레임으로 메시지를 수신한다. STOMP를 사용하면 메시지의 본문, 설정 데이터, 파싱 방식 등 하위 프로토콜 및 컨벤션을 따로 저의할 필요가 없어 비교적 손쉽게 사용할 수 있다.

STOMP는 커맨드, 헤더, 바디 형태로 이루어져 있다.

<queue/a로 채팅메세지 보냄>

SEND
destination:/queue/a
content-type:text/plain

hello queue a
^@

<sub1이 1번 채팅방에 대해 구독>

SUBSCRIBE
destination: /topic/chat/room/5
id: sub-1


<받은 메세지를 구독자에게 보냄>

MESSAGE
subscription:0
message-id:007
destination:/queue/a
content-type:text/plain

hello queue a^@

STOMP의 통신 흐름은 다음과 같다.

발신자는 /app 목적지를 따라서 서버 로직을 타서 브로커로 전달 후 구독자들 채널로 전달할 수도 있고, /topic 목적지를 따라서 바로 구독자들 채널로 메시지를 전달할 수도 있다.

참고로 스프링은 웹소켓에 STOMP를 얹어 사용하는 방법을 가지고 있다.
다음 게시물에서는 이를 통해 채팅방을 구현해보자.

참고

profile
백엔드 개발자

0개의 댓글