Programming/Spring | Spring-Boot

[Spring Boot] chat web application with websocket - 1

seandoesdev 2024. 4. 7. 02:22

웹에서 채팅할 수 있는 애플리케이션을 개발해보려고 한다. 채팅을 구현 방법으로 Polling, Long Polling, Streaming 등의 방식들이 있다. 하지만, 요즘 많이 사용하는 기술을 한 번 적용해보겠다.

웹 통신으로 단방향인 HTTP 프로토콜을 사용한다. 요청이 발생하면 응답을 해주는 방식이다. 그럼 websocket은 어떤 프로토콜일까?

 

WebSocket

HTTP 프로토콜과 호환되어 양방향 통신을 제공하기 위해 개발된 TCP 기반의 프로토콜이다. 누군가 요청하지 않아도 서로 간에 메시지를 주고 받을 수 있게 된다.

실시간성을 보장해야 하고, 변경 사항의 빈도가 잦거나 짧은 대기시간, 고주파수, 대용량의 조합인 경우 적용하는 게 적합하다.

 

장점

  • 일반 socket과 달리 HTTP 80 Port를 사용하므로 방화벽에 제약이 없다.
  • HTTP 규격인 CORS 적용이나 인증 등을 동일하게 설정할 수 있다.
  • 웹 환경에서 연속된 데이터(문자열 등)를 빠르게 통신한다.
  • 채팅, 주식, 비디오 관련 데이터들을 예로 들 수 있다.
  • 여러 단말기에 빠르게 데이터를 교환한다.

 

단점

  • 문자열을 송수신하는 것만 수행한다.
  • 형식이 정해져 있지 않기 때문에 애플리케이션에서 해석하기 힘들다.
    그래서 sub-protocol를 사용해서 주고 받는 메시지의 형태를 약속하는 경우가 많다.(STOMP)

 

연결 순서

1. 유저가 HTTP 통신으로 websocket 통신을 요청한다.(핸드 쉐이킹) - GET Method로 요청

2. 클라이언트와 서버 간의 신원 확인한다.(인증)

3. 서버에서 websocket으로 변경한다. - http에서 ws로 변경

4. 양방향 websocket 통신 시작한다.

 

 

STOMP

STOMP (Simple Text Oriented Messaging Protocol)은 WebSocket 위에서 동작하는 프로토콜로써 클라이언트와 서버가 전송할 메세지의 유형, 형식, 내용들을 정의하는 매커니즘이다. 기본적으로 pub/ sub 구조로 메세지를 전송하고 메세지를 받아서 처리하는 부분이 명확하게 정해져 있기 때문에 개발자 입장에서 정확하게 인지하고 개발할 수 있는 이점이 있다. pub는 클라이언트가 서버로 메세지를 보내는 것을 의미하고, sub는 클라이언트가 서버로부터 메세지를 받는 것을 메시지 구독한다는 의미이다.

또한 STOMP는 메세지의 헤더에 값을 넣어 헤더 값을 기반으로 통신 시 인증 처리를 구현하는 것도 가능하며, STOMP 스펙에 정의한 규칙만 잘 지키면 여러 언어 및 플랫폼 간 메세지를 상호 운영할 수 있다.

 

이번 채팅 기능 구현에서는 STOMP를 적용해보려고 한다. 위의 내용대로 개발자의 입장에서 이점이 있고, 인증 처리 구현, 여러 언어를 적용해볼 수 있다는 장점을 한 번 적용해보려 한다.