REST(Representational State Transfer) API 는 오늘날 가장 많이 사용되는 데이터 전송 방법 입니다.
이는 자원, 행위, 행위 내용으로 구성 됩니다.
| 구성 | Http 요소 |
|---|---|
| 자원 (Resource) | HTTP URI |
| 행위 (Verb) | HTTP Method |
| 행위 내용 (Representations) | HTTP Message Payload |
REST 는 HTTP 통신을 사용하여 통신합니다. 따라서 새로운 인프라를 구축할 필요가 없는 장점이 있습니다.
그러나 표준이 존재하지 않으므로 자체적인 설계 기준을 정의해야한다는 단점이 있습니다.
RESTFul API 는 REST 의 특징을 따르는 API 를 의미합니다.
REST 의 특징은 다음과 같습니다.
| 특징 | 설명 |
|---|---|
| Server-Client | 서버와 클라이언트가 명확히 구분됩니다 |
| Stateless | 서버는 클라이언트의 상태를 저장하지 않습니다 |
| Cacheable | 클라이언트가 동일한 요청을 반복적으로 보낼 때 캐시를 사용하여 최적화 합니다. |
| Layered System | 클라이언트와 서버 사이에 여러가지 계층(Proxy, Gateway 등)이 존재할 수 있습니다 |
| Uniform Interface | 일관된 인터페이스를 사용해야 합니다 - REST 의 요소를 사용해야 합니다 - URI 는 명사로 작성되야 하며 명사의 연결은 하이픈을이용해야 합니다 - URI 는 계층적으로 작성되어야 합니다 - 컬렉션 리소스는 복수형으로 작성되어야 합니다 - URI 에 파일 확장자는 작성하지 않습니다 |
RPC(Remote Procedure Call) 란 서버가 작성한 프로시저 인터페이스를 클라이언트가 작성한 코드처럼 로컬에서 호출하는 방식으로 통신합니다. 통신을 위한 공통된 인터페이스를 작성해야 하기 때문에 REST 보다 엄격한 규칙을 약속한다는 특징이 있습니다. TCP, HTTP, SMTP 등 다양한 프로토콜을 사용합니다.
gRPC(Google Remote Procedure Call) 는 Google 에서 개발한 원격 프로시저 호출(RPC) 을 위한 오픈소스 시스템 입니다. Java, Python, Swift, Go 등 주요한 개발 언어에서 모두 사용가능 합니다.
넷플릭스, 우버 등에서 사용하고 있으며, 구글의 거의 모든 서비스가 gRPC 로 이루어져있다고 알려져 있습니다.
서버와 클라이언트는 .proto 파일이라는 명세를 공유하여 호출 가능한 메서드와 메시지 구조를 사전에 정의하고 이에 맞춰 개발을 진행합니다. 이로 인해 REST API보다 더 강한 결합력과 명확한 계약 기반 통신을 가지게 됩니다. 또한 기본적으로 HTTP 를 통한 호출이 차단되어 있으므로 보안에 좋습니다.
서버와 클라이언트는 HTTP/2.0 을 사용하여 통신하며 Protobuf(프로토콜 버퍼) 직렬화/역직렬화를 활용하여 통신 용량 절감, 파싱 간소화를 통해 빠른 속도로 통신하도록 돕습니다.
또한 REST API 와 같은 단순 요청-응답 외에도 스트리밍, 양방향 스트리밍 등 다양한 통신 방식을 지원합니다.
gRPC 는 브라우저에서 직접 호출이 불가합니다. 따라서 로직을 검증하려면 검증을 위한 추가 테스트코드 혹은 API, 혹은 grpcurl, intellij .http 과 같은 외부 라이브러리가 필요합니다.
gRPC는 요청과 응답이 바이너리 형식으로 전송 되므로, 디버깅과 모니터링이 RESTful API보다 어려울 수 있습니다.
REST API는 서버에 별도의 방화벽 제어가 없는 경우 누구나 접근이 가능하므로 외부 서비스에서 자사 서비스를 호출할 때 적합합니다. gRPC는 엄격한 명세서와 빠른 통신이 가능하므로 서비스 간 강한 결합과 고성능 통신이 요구되는 내부 시스템 간 통신에 적합합니다.

Link: gRPC Example Project