Representational State Transfer의 약자이다.
일반적으로 REST라고 하면 좁은 의미로 HTTP를 통해 CRUD를 실행하는 API를 뜻한다.
자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것을 의미한다.
즉 자원(recource)의 표현(repersentation)에 의한 상태전달
자원은 해당 소프트웨어가 관리하는 모든것이며
자원의 표현은 그 자원을 표현하기 위한 이름이다.
DB의 유저정보가 자원이라면 "user"를 자원의 표현으로 정한다.
데이터가 요청되어지는 시점에서 자원의 상태(정보)를 전달한다.
JSON혹은 XML을 통해 데이터를 주고 받는것이 일반적.
REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍쳐 스타일이다.
HTTP URI를 통해 자원을 명시하고 , HTTP Method(post,get,put,delete)를 통해 해당자원에 대한 CRUD Operation을 적용하는 것을 의미한다.
위처럼 REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍쳐 스타일이다.
HTTP 프로토콜을 사용하므로 REST API 사용을 위한 인프라를 구축할 필요가 없다.
HTTP 표준프로토콜을 따르는 모든 플랫폼에서 호환된다. (범용성)
REST API 메시지가 의도하는 바를 명확하게 나타내므로 의도하는 바를 쉽게 파악할 수 있다.
서버와 클라이언트의 역할을 명확하게 분리한다.
표준이 존재하지 않는다.
사용할수 있는 메소드가 4가지 밖에 없다.
구형의 브라우저가 아직 지원하지 못하는 부분이 존재한다.
REST API는 클라이언트 서버 프로토콜을 사용하기 때문에 (주로 HTTP)
REST ? 웹상에서 사용되는 여러 리소스를 stateless 클라이언트 서버 프로토콜중에서 HTTP URI 로 표현하고 그 리소스에 대한 행위를 HTTP method로 정의하는 것
API ? 애프리케이션에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
interface ? 어떠한 두 주체가 서로 상호작용하기 위해 제공되는 도구
URI ? 해당 사이트에 특정 자원에 위치를 나타내는 유일한 주소 ( EX) 나 )
*URL ? URI가 URL을 양식으로 사용한다 ex)내가 있는 장소 , 장소로 표현
GraphQL 은 Graph Query Language 의 줄임말이다.
Query Language 란 무엇인가?
Query Language 는 정보를 얻기 위해 보내는 질의문(Query)을 만들기 위해 사용되는 Computer 언어의 일종이다.
GraphQL 은 이런 Query Language 중에서도 Server API 를 통해 정보를 주고받기 위해 사용하는 Query Language 이다.
GraphQL API 는 주로 하나의 Endpoint 를 사용한다.
GraphQL API 는 요청할 때 사용한 Query 문에 따라 응답의 구조가 달라진다.
GraphQL API 는 유연하다 백엔드에서 지정해놓는 틀이 거의 없기 때문이다.
GraphQL 은 다음과 같은 장점을 가진다.
HTTP 요청의 횟수를 줄일 수 있다.
RESTful 은 각 Resource 종류 별로 요청을 해야하고, 따라서 요청 횟수가 필요한 Resource 의 종류에 비례한다.
반면 GraphQL 은 원하는 정보를 하나의 Query 에 모두 담아 요청하는 것이 가능하다.
HTTP 응답의 Size 를 줄일 수 있다.
RESTful 은 응답의 형태가 정해져있고, 따라서 필요한 정보만 부분적으로 요청하는 것이 힘들다.
반면 GraphQL 은 원하는 대로 정보를 요청하는 것이 가능하다.
GraphQL 은 다음과 같은 단점을 가진다.
File 전송 등 Text 만으로 하기 힘든 내용들을 처리하기 복잡하다.
고정된 요청과 응답만 필요할 경우에는 Query 로 인해 요청의 크기가 RESTful API 의 경우보다 더 커진다.
재귀적인 Query 가 불가능하다. (결과에 따라 응답의 깊이가 얼마든지 깊어질 수 있는 API 를 만들 수 없다.)
물론 GraphQL 에서 File 전송을 할 수 없는 것은 아니나,
일반적인 GraphQL API 에 비해서 복잡해지거나 외부의 Service 에 의존해야하는 등 문제가 발생한다.
그렇다면 GraphQL 과 RESTful 중 어떤 것을 선택해서 사용해야하는가?
다음과 같은 기준으로 선택하면 될 것이다.
서로 다른 모양의 다양한 요청들에 대해 응답할 수 있어야 할 때
대부분의 요청이 CRUD(Create-Read-Update-Delete) 에 해당할 때
HTTP 와 HTTPs 에 의한 Caching 을 잘 사용하고 싶을 때
File 전송 등 단순한 Text 로 처리되지 않는 요청들이 있을 때
요청의 구조가 정해져 있을 때
그러나 더 중요한 것은, 둘 중 하나를 선택할 필요는 없다는 것이다.