Rest, GraphQL 등 다양한 네트워크 방식이 존재한다.
실제로 웹 프론트엔드에서 많이 사용하는 네트워크 방식들을 정리해서 설명해보겠다.
REST 한 API를 RESTful API라고 하는데 과연이 REST는 무엇일까?
서버-클라이언트 구조로 이루어져있다.
무상태로, 클라이언트의 Context를 서버에서 저장하지 않는다.
캐시로 저장해서 이전에 요청한 정보를 빠르게 다시 제공할 수 있다.
등의 특징이 있다.
REST API는 REST 함을 HTTP를 사용한 API로 확장한 것을 뜻한다.
자원 기반: 자원(Resource)은 URI(Uniform Resource Identifier)로 식별된다. 예를 들어, /users는 사용자 목록을, /users/123은 특정 사용자를 나타낸다.
HTTP 메서드: HTTP 메서드를 사용하여 자원에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행한다.
GET: 자원을 조회한다.
POST: 자원을 생성한다.
PUT/PATCH: 자원을 업데이트한다.
DELETE: 자원을 삭제한다.
무상태성: 서버는 각각의 요청을 독립적으로 처리하며, 요청 간의 상태를 저장하지 않는다. 모든 필요한 상태는 요청에 포함되어야 한다.
캐싱: HTTP의 캐싱 메커니즘을 사용하여 응답 데이터를 캐시할 수 있다.
계층 구조: 시스템은 계층화될 수 있으며, 클라이언트는 여러 서버와 상호작용할 수 있다.
일관된 인터페이스: 자원에 접근하는 방식이 일관되어야 한다.
GraphQL은 RESTful API를 활용해서 마치 쿼리로 API를 요청하는 것이다.
/graphql
과 같은 하나의 엔드포인트에서 body 값을 쿼리로 계속 바꿔가며 요청하면, 응답이 매번 달라지는 것이다.
클라이언트 주도형 데이터 요청: 클라이언트는 필요한 데이터와 구조를 정확하게 지정할 수 있다.
단일 엔드포인트: 모든 요청이 단일 엔드포인트로 전송된다. 예를 들어, /graphql.
강력한 타입 시스템: 스키마를 사용하여 API의 타입을 정의하고, 이를 통해 클라이언트와 서버 간의 계약을 명확히 한다.
계층적 데이터 구조: 쿼리는 계층적으로 작성되어, 복잡한 데이터 구조를 한번의 요청으로 가져올 수 있다.
실시간 업데이트: Subscription을 통해 실시간 데이터를 제공할 수 있다.
하지만 위의 두가지는 한계가 있다. 바로 실시간성이 없다는 것이다.
카카오톡과 같은 채팅 서비스를 웹으로 만든다면 어떻게 해야할까?
1초마다 계속 메시지 리스트 조회 API를 요청할 것인가? 너무 오버헤드가 클 것이다.
그래서 이벤트성으로 특정 이벤트가 발생하면 이를 감지하는 방식의 Socket 통신을 활용한다.
실시간 통신: 지속적인 연결을 통해 실시간 데이터를 전송한다.
이벤트 기반: 서버는 클라이언트에게 이벤트를 푸시할 수 있다.
낮은 지연 시간: HTTP보다 낮은 오버헤드로 빠른 통신이 가능하다.
a라는 언어로 b언어를 실행하는 함수를 원격으로 호출할 수 있다.
직접 이 컴퓨터에서 계산을 할 때, 자원이 드는 것이 부담스러울 때 외부의 컴퓨터와 연결해 다른 언어환경에서의 함수를 실행시킬 수도 있다.
이것이 바로 Remote Procedure Call(원격 프로시저 호출)로 RPC라고 하는데, 프로시저는 우리가 아는 그 절차형 프로그래밍의 절차를 의미한다.
구글에서 개발한 RPC 오픈소스라서 gRPC라고 부른다.
HTTP/2 사용: 멀티플렉싱, 헤더 압축, 양방향 스트리밍 지원한다.
프로토콜 버퍼: 효율적인 바이너리 직렬화를 위한 프로토콜 버퍼를 사용한다.
다중 언어 지원: 다양한 프로그래밍 언어에서 사용 가능하다.
이것도 구글이 만든 기술로, 브라우저 간의 실시간 통신을 가능하게 한다. 영상통화도 되고 음성통화도 되며 채팅도 가능하다.
Websocket도 사실 채팅예시만 많이 봤겠지만 영상통화도 가능해서, 이렇게 되면 WebSocket과 진배 없는 것이라고 여길만한데, WebRTC는 P2P 통신에 가깝다.
WebRTC는 서버-클라이언트가 아니라, 클라이언트(P2P에선 피어라고 함) 여러명 중 1명이 서버와 클라이언트 둘의 역할을 다하게 된다.
SDP 인터페이스로 어떤 방식의 연결설정을 할 지 정하고(영상통화라면 비디오코덱 똑같이 맞추기 등), ICE 프레임워크를 통해 피어가 피어끼리 서로 IP 주소를 묻거나 어떻게 빠르게 연결을 할 수 있을지 방법을 찾아서 연결한다.
실시간 통신 (Real-Time Communication): 웹 브라우저나 모바일 애플리케이션에서 플러그인 없이 실시간 음성, 영상, 데이터 스트리밍이 가능하다.
P2P 연결 (Peer-to-Peer Connection): 데이터 전송을 직접적으로 브라우저 간에 처리하여 지연 시간과 대역폭 사용을 최소화한다.
보안: 모든 WebRTC 컴포넌트는 디폴트로 암호화되어 있으며, SRTP (Secure Real-time Transport Protocol)를 사용해 데이터 스트림을 보호한다.