서울시 Sesac에서 풀스택 실무프로젝트 과정을 들으며 진행했던 팀 프로젝트 [PocaZ], 아이돌 포토카드 거래 플랫폼에서 구현했던 socket.IO를 이용한 채팅 연결을 상세히 기록해보고자 한다.
socket.IO
채팅
프로젝트 구현 전에 통신의 개념을 먼저 알아보도록 하자
네트워크를 통해 서버로부터 데이터를 가져오기 위한 통신으로는 크게 HTTP 통신과 Socket 통신 2가지가 있다.
(HyperText Transfer Protocol) HTTP protocol에서 client 와 server 는 stateless
client
server
초기 웹의 탄생 목적은 문서 전달과 하이퍼링크를 통한 문서 연결이 전부였기 때문에 HTTP 프로토콜이 완벽히 그 목적에 부합했지만, 시대가 변하고 웹에 동적인 표현과 상호작용이 더욱 요구되며 전이중 통신, 즉 쌍방 통신의 새로운 기술이 필요하게 되었다.
기존 HTTP 프로토콜은 서버와 클라이언트 사이의 연결이 유지 되지 않는다. 보다 쉽게 상호작용하는 웹 페이지를 만들려면 브라우저와 웹 서버 사이에 더 자유로운 양방향 메세지 송수신이 필요하다.
HTTP를 바탕으로 Handshake 과정을 통해 연결이 수립되면 응용 프로그램 계층 프로토콜이 HTTP에서 웹 소켓으로 업그레이드가 된다. 👍업그레이드가 되면 HTTP는 사용되지 않고, 웹 소켓 연결이 닫힐 때까지 두 끝 점에서 웹 소켓 프로토콜을 사용하여 데이터를 주고 받게 된다. 웹 소켓 연결은 주로 새로고침이나 창 닫기 등의 이벤트 발생 시 닫힌다.
ws protocol에서는 request를 보낸다. accept 하게 되면 연결이 지속된 상태 connection !!!! 전화통화 같은 것
connection
browser(client)와 server 사이에 bi-directional(양 방향)한 연결이 있어서 서로에게 바로 갈 수 있는 길이 있다. 웹 소켓 은 클라이언트와 서버간 접속이 유지되며 요청과 응답 개념이 아닌 서로 데이터를 주고 받는 형식이다.
근데 websocket이 socketIO랑 다른건가?
Socket.IO는 node.js 기반으로 만들어진 기술로, 거의 모든 웹 브라우저와 모바일 장치를 지원하는 실시간 웹 애플리케이션 지원 라이브러리이다. 다시 말해, Socket.IO는 자바스크립트를 이용하여 브라우저 종류에 상관없이 실시간 웹을 구현할 수 있도록 한 기술이다. 웹 브라우저와 웹 서버의 종류와 버전을 파악하여 가장 적합한 기술을 선택하여 사용한다.
실시간, 양방향, event 기반의 통신
HTML5 웹소켓은 매우 유용한 기술이지만, 브라우저별로 지원하는 웹소켓 버전이 다르며 오래된 브라우저의 경우 아예 지원하지 않는다. 따라서 자바스크립트를 이용하여 브라우저에 상관없이 실시간 웹을 구현할 수 있는 Socket.IO를 좀 더 많이 사용하고 있다.
SocketIO는 websocket을 사용하지만, websocket을 지원하지 않으면 다른 것을 사용한다.
위와 같은 이유로 socket.io 라이브러리를 통해 1:1 채팅을 구현하기로 마음먹었다.
다음 기록에서는 채팅 서비스 설계를 가지고 실제로 구현해보는 과정을 만들어보자