GraphQL은 페이스북에서 만들었다
Server API (혹은 Server-side web API)는 적절한 요청을 하였을 때, 그에 맞는 응답을 되돌려주는 창구 (Endpoint)를 Web을 통해 노출한 것을 말한다
이런 Server API 는 어떤 정보들(환율, 주식 시세, 뉴스 등등)을 요청하고 수정하기 위해서 만들어지는 경우가 많다
이 Server API 를 만드는 방법론 중 하나로 REST 라는 것이 있으며, 이 방법론은 많은 Server API 들을 구성하기 위해 사용되어왔고, 또 현재도 많이 사용되고 있다
모든 Resource (자료, User, 정보 등등)들을 하나의 Endpoint 에 연결해놓고, 각 Endpoint는 그 Resource 와 관련된 내용만 관리하게 하자는 방법론이다
예시로 어떤 API 가 Community site 용 API 이며, 이 API 를 사용해 사용자들이 글을 작성/수정/삭제 할 수 있고, 각 글에 댓글을 작성/수정/삭제할 수 있다고 해보자
이때, API 의 Endpoint 를 다음과 같이 구성하면 REST 의 조건을 간략히는 만족하게 된다
1. 글 관련 API = /posts - 글 작성 = POST /posts - 글 수정 = PATCH /posts/[postid] - 글 삭제 = DELETE /posts/[postid] 2. 댓글 관련 API = /posts/[postid]/comments - 댓글 작성 = POST /posts/[postid]/comments - 댓글 수정 = PATCH /posts/[postid]/comments/[commentid] - 댓글 삭제 = DELETE /posts/[postid]/comments/[commentid]
(물론 실제 API에는 이보다 더 많은 것들 (글 가져오기, 회원가입하기, 회원인증하기, 회원정보 확인하기 등등) 이 필요할 것이다)
이런 REST 의 조건을 만족하는 API를 RESTful API 라고 부르고, 이런 방식으로 API를 작성하는 것을 RESTful 하다고 한다
GraphQL은 Graph Query Language의 줄임말이다
Query Language는 정보를 얻기 위해 보내는 질의문(Query)을 만들기 위해 사용되는 Computer 언어의 일종이다
GraphQL은 이런 Query Language 중에서도 Server API를 통해 정보를 주고받기 위해 사용하는 Query Language 이다
RESTful API 로는 다양한 기종에서 필요한 정보들을 일일히 구현하는 것이 힘들었다
예로, iOS 와 Android 에서 필요한 정보들이 조금씩 달랐고, 그 다른 부분마다 API 를 구현하는 것이 힘들었다
이 때문에 정보를 사용하는 측에서 원하는 대로 정보를 가져올 수 있고, 보다 편하게 정보를 수정할 수 있도록 하는 표준화된 Query language 를 만들게 되었다
이것이 GraphQL이다
GraphQL 을 통한 API는 RESTful API와는 다른 측면을 보인다
위에서 말했듯 RESTful API는 Resource 마다 하나의 Endpoint를 가지고, 그 Endpoint에서 그 Resource에 대한 (거의) 모든 것을 담당한다
반면, GraphQL은 전체 API를 위해서 단 하나의 Endpoint만을 사용한다
각각 v3 root endpoint와 v4 root endpoint로 Endpoint를 제공하지만,
v4의 경우 Root endpoint를 제외한 어떤 Endpoint도 없는 반면, v3의 경우는 각 Resource 마다 수많은 Endpoint들을 제공한다
RESTful API는 하나의 Endpoint에서 돌려줄 수 있는 응답의 구조가 정해져 있는 경우가 많다
API를 작성할 때 이미 정해놓은 구조로만 응답이 오게 되는 것이다
반면, GraphQL은 사용자가 응답의 구조를 자신이 원하는 방식으로 바꿀 수 있다
마찬가지로 Github API 를 예시로 보면,
v3 repository api는 구조가 예시에 나온 모양으로 고정되어 있는 반면,
v4 api 의 경우는
query {
repository(owner: "Ailrun" name: "rxan") {
nameWithOwner
}
}
를 사용하느냐
query {
repository(owner: "Ailrun" name: "rxan") {
languages(first: 2) {
nodes {
name
}
}
}
}
를 사용하느냐에 따라서 응답의 구조가 완전히 다르게 된다
1. HTTP 요청의 횟수를 줄일 수 있다
2. HTTP 응답의 Size를 줄일 수 있다
File 전송과 같이 RESTful이 더 유리한 API 가 있을 수 있고, 다양한 정보를 주고받는 것 같이 GraphQL이 더 유리한 API가 있을 수 있다
이럴 때 둘 중 하나만 선택해야할 필요는 없다
하나의 Endpoint를 GraphQL 용으로 만들고, 다른 RESTful endpoint 들을 만들어 놓는 것은 API 개발자의 자유다
주의해야할 것은 하나의 목표를 위해 두 API structure를 섞어놓는 것은 API의 품질을 떨어트릴 수 있다는 점이다
(ex, 사용자 정보를 등록하는 것은 RESTful API 로, 사용자 정보를 수정하는 것은 GraphQL API 로 한다면...)
즉, 유리한 쪽으로 잘 선택해서 적정하게 사용하면 꽤 괜찮은 API를 만들 수 있을꺼 같다