GraphQL이란 SQL(Structed Query Language)와 마찬가지로 쿼리 언어이다. 그러나 SQL은 데이터베이스 시스템에 저장된 데이터를 효율적으로 가지고 오는 것이 목적이고, GraphQL은 웹 클라이언트가 데이터를 서버로 부터 효율적으로 가져오는 것을 목적으로 한다.
GraphQL에서는 모든 데이터가 그래프 형태로 연결되어 있다고 전제한다. 그래프를 누구의 입장에서 정렬하느냐(클라이언트가 어떤 데이터를 필요로 하느냐)에 따라 트리 구조를 이룰 수 있다.
이를 통해 GraphQL은 클라이언트 요청에 따라 유연하게 트리 구조의 JSON 데이터를 응답으로 전송할 수 있다. 즉, GraphQL은 REST API 방식의 고정된 자원이 아닌 클라이언트 요청에 따라 유연하게 자원을 가져올 수 있다.
GraphQL은 HTTP를 통해 API 서버로 요청을 보내고 응답을 받는다.
응답을 받을 시, 데이터 결과를 JSON 형식으로 받는다.
GraphQL은 서버 개발자가 작성한 각 필드에 대응하는 resolver 함수로 각 필드의 데이터를 조회할 수 있다.
GraphQL은 GraphQL 라이브러리가 조회 대상 schema가 유효한지 검사한다.
/graphql
이라는 하나의 endpoint로 요청을 받고 그 요청에 따라 query , mutation을 resolver 함수로 전달해서 요청에 응답한다. 모든 클라이언트 요청은 POST
메소드를 사용한다.POST
메소드만을 이용해 요청을 보내기 때문에 각 메소드에 따른 캐싱을 지원받을 수 없다. 그래서 이를 보완하기 위해 Apollo 엔진의 캐싱과 영속 쿼리 등이 등장하게 되었다.Overfetch는 경우 클라이언트가 필요없는 정보까지 제공받는 경우를 말한다.
예를 들어 유저의 이름만 필요한 상황에서 REST API를 사용한다면, 응답 데이터에는 유저의 주소, 생일 등과 같이 실제로는 클라이언트에게 필요없는 정보까지 모두 포함되어 있다.
Underfetch는 endpoint가 필요한 정보를 충분히 제공하지 못하는 경우를 말한다. Underfetch의 경우 클라이언트는 필요한 정보를 모두 확보하기 위해 추가적인 요청을 보내야 한다.
예를 들어 유저 정보 뿐만 아니라 유저의 목록 및 유저가 보유한 팔로워까지 필요하다면, 필요한 정보를 모두 가져오기 위해 REST API에서는 각각의 자원에 따라 엔드포인트를 구분하기 때문에 3가지 엔트포인트에 요청을 보내야한다.
REST API는 Resource에 대한 형태 정의와 데이터 요청 방법이 연결되어 있지만, GraphQL에서는 완전히 분리되어 있다.
REST API는 Resource의 크기와 형태를 서버에서 결정하지만, GraphQL에서는 Resource에 대한 정보만 정의하고, 필요한 크기와 형태는 클라이언트 단에서 요청 시 결정한다.
REST API는 URI가 Resource를 나타내고 Method가 작업의 유형을 나타내지만, GraphQL에서는 GraphQL Schema가 Resource를 나타내고 Query, Mutation 타입이 작업의 유형을 나타낸다.
REST API는 여러 Resource에 접근하고자 할 때 여러 번의 요청이 필요하지만, GraphQL에서는 한번의 요청에서 여러 Resource에 접근할 수 있다.
REST API에서 각 요청은 해당 엔드포인트에 정의된 핸들링 함수를 호출하여 작업을 처리하지만, GraphQL에서는 요청 받은 각 필드에 대한 resolver를 호출하여 작업을 처리한다.