http 통신, 소켓 통신
들어가기 앞서
저번에 조사했던 http, 소켓 통신 등 여러 통신방식에 대한 정보를 필요로 했던 회의가 여러가지 이슈로 미뤄져 좀 더 조사해보게 되었다. 추가할 내용이 많아 따로 적어본다.
자바스크립트 기반의 웹 서비스에서 실시간으로 데이터를 주고받아야 할 필요성이 있다는게 핵심 요구 사항인데, 그러면 웹 소켓을 써야겠지만 짧은 내 생각으로는 꼭 소켓 통신을 써야하나? 라는 생각도 들고 여러가지 방법을 자세하게 조사해 달라는 말도 있어서 여러 방식을 알아봤다.
1) HTTP 통신
클라이언트가 요청하는 데이터를 서버에서 HTTP 통신 이용하여 전달
API 형식을 작성하여 클라이언트가 API 형식에 따라 데이터 요청하고 받아서 처리
웹 개발을 하는 사람이 데이터를 받고 원하는 형태로 가공하여 화면에 보여줌
서버는 제공하고자 하는 데이터나 기능을 제어할 수 있는 API로 만들면, 접근 권한이 있는 프로그램이 API를 통해 서버에서 제공하는 데이터를 요청해 사용 가능
클라이언트는 서버가 제공하는 API에 원하는 정보를 요청해 데이터를 받고 UI 등의 형태로 사용자에게 정보 제공
실시간 통신을 http 통신으로 구현해야 한다면 다음과 같은 방법이 존재
1. polling
클라이언트가 주기적으로 서버에 요청 보내는 방식
일정 시간마다 클라이언트가 서버로 요청 보내 데이터 갱신 확인, 갱신되면 응답받는 방식
계속 요청해야 하므로 리소스 낭비 발생
구현 단순하므로 요청 시 부담 적고 주기 넉넉하게 잡아도 될 정도로 실시간성이 중요하지 않다면, 데이터 갱신이 특정 주기 갖는다면 해당 방법이 적절
요청을 보내고 서버에서 변경이 일어날 때까지 대기
지속적 요청을 보내진 않기 때문에 polling보다 부담이 적음
만약 유지 시간이 짧으면 polling과 차이가 없고 다수의 클라이언트에게 동시에 이벤트 발생 시 순간적 부담 급증
이벤트 잦으면 부담 증가하므로 실시간 전달 중요하지만 상태가 빈번하게 갱신되진 않을 때 적절
3. SSE
서버에서 클라이언트로 변경이 필요한 데이터를 전송해주는 SSE (Server-sent Events) 기술 존재
서버에서 클라이언트에 업데이트가 필요한 시점에 단방향으로 데이터를 제공하므로 주식, 날씨 정보 등의 업데이트에 유용
IE에서 지원하지 않는다는 단점 존재하나, polyfill (브라우저에서 지원하지 않는 API 플러그인이나 자바스크립트로 흉내 내 구현)로 해결 가능
2) 소켓 통신
특정 포트를 통해 연결 유지하며 서버와 클라이언트가 양방향으로 데이터 주고받기 위해 사용
계속해서 연결을 들고 있어야 실시간 통신이 가능해 많은 리소스 소모
실시간 양방향 데이터 전송을 위해 클라이언트와 서버는 소켓 연결한 상태로 유지
웹 소켓 API는 기본적인 기능만 제공하므로 오픈소스 라이브러리 사용
Java script 기반 node.js 서버 socket.io 라이브러리는 웹 소켓 연결 장애 발생 시 자동으로 http long polling으로 대체하는 기능도 존재하나 데이터 이동이 활발할 시 비용 많이 발생
3) HTTP 통신과 소켓 통신의 차이
HTTP 통신은 클라이언트가 요청해야 서버가 응답
서버로부터 응답받은 후에는 연결 종료
소켓 통신은 특정 포트를 통해 양방향 통신
HTTP 통신에 비해 더 많은 리소스 소모
지속적인 양방향 데이터 통신처럼 보이기 위해서 http 통신은 계속해서 데이터 요청하는 polling 방식 사용
사실상 실시간 연결은 아니므로 대부분 연결이 길어지면 단방향 통신으로 설계되어 헤더가 무거운 http 통신 특성상 여러 문제 발생
소켓 통신이 실시간으로 데이터를 주고받는 상황에서 http 통신에 비해 더 유리하지만, 실시간 기능이 필요하지 않은 상황에 적용 시 http 통신에 비해 비용이 크기 때문에 적절한 선택 필요
4) DB
DB 서버를 기반으로 서비스에 필요한 데이터 제공
DB 접속 권한을 클라이언트나 웹서버에 부여하고 DB 서버에 데이터를 요청해 받아오기 위해 클라이언트나 웹서버에서 위의 HTTP 통신이나 소켓 통신 등을 구현하여 데이터를 제공
내 생각으로는 데이터를 주고받는다면 보통 DB가 기반이기 때문에, 사실상 DB와 어떤 방식으로 통신할지를 결정하는 것