[SW정글 114일차] 채팅의 시작

rg.log·2023년 1월 10일
0
post-thumbnail

우리 Send Wish 어플은 친구 생일선물, 부모님 생신 선물 등을 혼자 또는 함께 상품을 고를 때 해야하는 많은 의사결정을 도와주는 툴로써 만들어지고 있다!

함께 결정하기 위해 상품들을 한눈에 보면서 이야기 나누고 싶다는 의견을 받아들여 공유 장바구니 내부 채팅방을 만들게 되었다.

우리는 react-native와 Spring framework를 사용하고 있었기에 Stomp와 Socket.IO 중에 어떤 것을 사용해야할까 고민이 들었다.
Stomp는 spring-websocket 모듈을 통해서 제공하기에 우리 기술 스택과 맞지만 react-native와 연결된 자료가 많지 않았다. 반면 Socket.IO 는 node.js 기반으로 만들어진 기술로 우리에겐 새로운 기술스택이지만 react-native와 사용된 자료가 많았다. 개발 프로젝트 초심자들로 react-native의 버전업과 호환에 시간을 많이 쏟았기에 더이상 시간을 지체할 수 없어서 나온 고민이었다.

이미 python으로 진행한 스크래핑 서버도 띄운 상태라 node.js라는 새로운 프레임워크를 추가로 사용한다는 것이 우리 서비스에 어떤 의미일까 하는 고민으로 생각이 흘렀다.

긍정적으로는 한동안 유행했던 MSA와 같이 빠른 서비스 개발, 유지보수, scale-out의 장점을 살릴 수 있지 않을까 였던 반면, 우리는 아직 작은 서비스인데 여러 분산된 다른 기술 스택의 서버를 사용한다는 것이 오히려 트랜잭션 유지와 실제로 배포 후 테스트 함에 있어서 복잡하지 않을까, 또한 자료가 부족하다는 이유로 하지 않는 것은 후회될 것 같아서 팀원들을 설득했고 백엔드는 Stomp, 프론트는 SockeJS로 진행하게 되었다. 다시 한번 진지하게 이야기를 들어준 팀원들에게 감사합니다..! 🙇🏻‍♀️


WebSocket과 Stomp는 비교대상이 될까?

자료를 찾아보면서 헷갈리는 부분이 많았다. WebSocket과 Stomp와 Socket.IO와 SockJS ...
처음에는 'WebSocket과 Stomp는 각각의 라이브러리인가?' 싶었지만 아니었다.

WebSocket

웹소켓은 TCP 연결을 통해 양방향 통신 채널을 제공하는 프로토콜이다. 그후에 모든 애플리케이션 메시지는 같은 tcp connection을 가지고 주고 받게 된다.

WebSocket 기술이 없다면 30초 또는 1분에 한번씩 데이터를 요청하는 Polling, Long Polling 등의 방식으로 실시간은 아니지만 비슷하게 구현했을 것이다.

기존 다른 TCP 기반의 프로토콜은 TCP layer에서의 Handshake를 통해 연결하는 반면, 웹 소켓은 HTTP 요청 기반으로 Handshake 과정을 거쳐 연결한다.

Stomp

STOMP(Simple Text Oriented Messaging Protocol)는 메세징 전송을 효율적으로 하기 위해 탄생한 프로토콜로, pub / sub 구조로 되어있어 메세지를 전송하고 메세지를 받아 처리하는 부분이 확실히 정해져 있어 개발자 입장에서 명확히 인지하고 개발이 가능하다.

WebSocket 위에서 동작하는 프로토콜로써 클라이언트와 서버가 전송할 메세지의 유형, 형식, 내용들을 정의하는 매커니즘이다.

STOMP를 이용하면 메세지 헤더에 값을 줄 수 있어 헤더 값을 기반으로 통신시 인증 처리 구현도 가능하다.

웹소켓 클라이언트와 서버는 Http 핸드쉐이크 요청에서 Sec-WebSocket-Protocol을 사용해서 STOMP와 같은 높은 레벨의 메시징 프로토콜을 사용할 수 있다. 이런 방법이 아니라면 별도의 다른 규약이 필요하다.


즉, WebSocket만 사용해서 구현하게 되면 해당 메시지가 어떤 요청인지, 어떤 포맷으로 오는지, 메시지 통신 과정을 어떻게 처리해야 하는지 정해져 있지 않아 일일이 구현해야 한다.
따라서 STOMP라는 프로토콜을 서브 프로토콜로 사용하는 것이다! 둘을 대립되는 형태로 보기보다 WebSocket에서 더 나아가 개발자를 도와주는 프로토콜로 보면 좋을 것 같다.


Socket.IO

클라이언트와 서버 간의 짧은 대기 시간 , 양방향 및 이벤트 기반 통신 을 가능하게 하는 라이브러리로, WebSocket 프로토콜 위에 구축되었다.
Java netty를 사용해서 Socket.IO 서버 구현이 가능하지만 JavaScript 기반 라이브러리이기에, JavaScript로 개발해야 문제 발생을 줄일 수 있을 것이다.

SockJS

WebSocket과 유사한 객체를 제공하는 브라우저 JavaScript 라이브러리로, 내부적으로 SockJS는 기본 WebSocket을 먼저 사용하려고 시도하다가 실패하면 다양한 브라우저별 전송 프로토콜을 사용한다.

Spring 프레임워크에서 WebSocket을 지원한다. 스프링 메뉴얼을 보면 브라우저 문제를 해결하기 위한 방법으로 SockJS를 솔루션으로 제시한다.SockJS에서 Java Client를 Spring-websocket 모듈을 통해 제공한다.


참고. spring websocket
Spring webSocket with stomp 기본 개념 정리
Socket.IO
SockJS
sockjs-client
MSA 아키텍처란


오늘의 나는

새로운 기술 사용할 생각에 설렜다..💗

협력사 채널코퍼레이션에서 왔다갔다.
내가 만든 제품을 내가 사용해보면서 업그레이드할 수 있다는게 가장 큰 메리트로 와닿았다.
채널코퍼레이션에서는 채팅관련 데이터베이스로 DynamoDB를 사용하고 있다고 했다. 마침 채팅을 구현중이라 관심이 갔지만 작은 프로젝트에서는 사용하지 않는 것을 권장한다고 하셨기에 pass!

0개의 댓글