[Spring Boot Websocket] - 커미션 채팅방 (1) 채팅방을 만들려는 이유 + 웹소켓은 무엇인가?

jinvicky·2025년 1월 6일
0

Why?

커미션을 하다 보면 간혹 크레페 회원이 아니면서 카카오톡이 불가피해서 카페 디엠이나 문자메세지로 연락하는 분들이 계신다. 문자메세지는 주로 다른 문자들에 의해 쉽게 묻히고, 카페 디엠까지 관리하기엔 sns 피로도가 너무 컸다. 그래서 카페 디엠, 문자메시지 등의 기타 연락수단을 통합해서 크레페 디엠, 오픈카톡, 채팅방 이렇게 최대 3개까지만 관리하고자 이 채팅방 프로젝트를 시작했다.

웹소켓 기본 History

구글링만 해도 설명이 다양하게 잘 나와있어서 필자가 몰랐던 정보들 기준으로 정리해 보았다.

본디 HTTP 프로토콜은 요청과 응답으로 이루어져 있고, 핑퐁하면서 데이터를 요청하고 응답받는 식이다. 더 발전해서 TCP/IP 연결을 재사용할 수 있게 되면서 (HTTP/1.1) 성능이 향상되었고,
이후에 단방향이 아닌 양방향 통신이 요구되면서 어떤 방식을 사용할 것인지 고민하게 된다.

양방향 통신의 예로는 내가 메세지를 보냈을 때 다른 사람 컴퓨터에도 그 메세지가 실시간으로 반영되는 채팅방이 있다.

처음에는 Polling이 있었다. 클라이언트가 계속 n초 간격으로 요청을 날리는 방식이다.
Polling의 문제점은 계속된 요청은 서버에 부담을 주고, 서버에서 줄 내용이 없어도 계속 불필요하게 요청을 날린다는 것이다.

Long Polling은 매번 서버가 응답을 보내지 않고, timeout을 기다렸다가 이벤트가 발생했을 때만 응답을 리턴하는 것이다. 클라언트는 응답이 오면 재연결한다. 이 방식은 Polling의 개선이지만 여전히 빈번한 데이터 업데이트일 때 비효율적이다.

Streaming은 요청시 커넥션을 맺고 커넥션동안 서버 -> 클라이언트로 데이터를 보낸다. 클라이언트가 다른 요청을 하려면 새 커넥션을 맺어야 한다.

WebSocket

웹소켓을 쓰면 커넥션 개수가 줄어들고, 많은 동시접속자들을 수용할 수 있으며, 실시간 양방향 데이터 통신이 가능하다. 웹소켓은 연결시 http 프로토콜을 사용했다가 통신중엔 ws 프로토콜을 사용한다.

Spring Boot Websocket

처음에 작은 채팅방을 위해서는 스프링이 제공하는 websocket 의존성으로 충분하다. (단일 서버 기준)
채팅방의 사이즈가 커지면서 채팅 서버가 n대가 된다면 웹소켓에 추가적으로 stomp를 고려하게 된다.
stomp를 사용하면 외부 메세지 큐(Kafka, RabbitMQ)를 도입할 수 있다.

stomp : 메세지 브로커를 활용하여 쉽게 메시지를 주고받을 수 있는 프로토콜 , 웹소켓 위에 얹어 "함께" 사용

나의 경우 소규모이며 단일 홈서버로 구축할 것이기에 기본 websocket 의존성으로 프로젝트를 만들었다.

Note & Contributors

2023년부터 이어오고 있는 커미션 프로젝트입니다. 백엔드는 Spring Boot, 프론트는 Next.js(+React)를 사용합니다.

🔗 이벤트 커미션 기능 배포 (Payapp + Gooble Cloud MySQL)

jinvicky
Front-End, Back-End Developer
✉️ Email: jinvicky17@gmail.com
💻 Github: https://github.com/jinvicky

wkdu0723
Front-End Developer
✉️ Email: wkdu0712@naver.com
💻 Github: https://github.com/wkdu0723

profile
Front-End와 Back-End 경험, 지식을 공유합니다.

0개의 댓글