GraphQL은 빠르게 변화하는 Web 환경에 대응하고자 개발된 query language이다. 특히나 이전에는 (현재에도 많이 사용되고 있지만) 통신 표준으로 REST API가 많이 사용되고 있지만 최근 REST API가 가진 한계점으로 인해 점차 GraphQL이 각광을 받고 있다. 실제로 GraphQL 개발을 했던 (현재는 주체가 GraphQL Foundation으로 넘어갔지만) Facebook 외에도 Github, Pinterest 등 많은 서비스가 GraphQL을 사용하고 있다.
그렇다면 GraphQL이 무엇이기에 많이 사용되고 있는지 알아보도록 하자.
GraphQL은 API를 구성하는 query language로 클라이언트 입장에서 정확히 필요한 데이터만 요청 할 수 있게 한다.
그런데 생각해보면 REST API 또한 API 호출을 통해 필요한 데이터만 얻어 올 수 있기 때문에 '큰 차이가 없다' 라고 생각할 수 있다. 그렇기 때문에 REST API와의 비교를 통해 GraphQL의 강점을 알아보도록 하자.
그림 1. REST API Sample
위의 그림 1은 클라이언트에서 서버에 REST API를 사용하여 호출하는 방식이다.
[GET] /users/<id> |
[GET] /users/<id>/posts |
[GET] /users/<id>/followers |
user : { "id" : ... "name" : ... "address" : ... "birthday" : ... } |
posts : [{ "id" : ... "title" : ... "content" : ... "coments" : ... ]} |
followers : [{ "id" : ... "name" : ... "address" : ... "birthday" : ... }] |
표에서 간단히 확인 할 수 있듯이 각 방식은 원하는 데이터를 받기 위해 다른 API 호출을 하고 그에 따른 응답 또한 다르다.
그림 2. GraphQL Sample
그림 2는 GraphQL을 사용한 호출로 클라이언트의 필요한 요구 사항만 포함해서 API 호출을 한다. 그런데 REST API와는 다르게 특정 값을 가져오기 위해 규격화된 API를 사용하지 않고 요청 구문에 필요한 데이터만 Query 요청한다. (이후 서버에서는 Query를 해석해서 JSON으로 결과를 돌려준다.)
이처럼 REST API와 GraphQL 간에는 요청 형식부터 차이가 있다. 그러면 다음 부분으로 넘어가기전에 REST API와 GraphQL를 좀 더 비교해보자.
- 정확히 필요한 데이터만 가져오기 어렵다.
언급한 것처럼 REST API는 요청에 따른 데이터가 정해져 있다. 그래서 Overfetching 문제로 표현되는 클라이언트 입장에서 필요한 데이터보다 더 많은 데이터를 가져 올 수 있다. 반대로 Underfetching 문제로 클라이언트에게 필요한 데이터를 충분히 제공해 주지 않는 것이다. 때문에 데이터를 더 가져오기 위해 클라이언트는 다른 API을 (Query 요청 방식을 바꿔서) 호출해야 한다.
- 변경된 API의 적용이 빠르게 이루어지지 않는다.
API의 Spec을 변경하는 일은 클라이언트와 서버를 동시에 변경해야 하기 때문에 위험할 수 있다. (최악에는 API를 사용하는 쪽에서 많은 문제가 발생 할 수 있다.) 또한 요구 사항에 의해 종종 변경되는 일은 제품 생산성을 떨어뜨릴 수 있다. (다른 것을 개발해야하는데 Legacy API를 손봐야 하기 때문에)
- 추가적인 커뮤니케이션 비용이 발생하지 않는다.
GraphQL의 가장 기본은 스키마를 정의하는 것이다. 때문에 API 상에 추가적인 요구 사항이 발생해도 스키마 안에 포함되어 있으면 Query 형식만 변경해주면 된다.
때문에 서버와 클라이언트 간에 API를 맞추기 위한 추가적인 비용이 발생하지 않는다.
'GraphQL이 더 낫다' 나열을 했지만 REST API가 무조건 GraphQL 보다 나쁜 것은 아니다.
따지고 보면 GraphQL의 Query 구문을 내부에서 해석을 해야 하기 때문에 단순한 데이터 (또는 단순한 구조) 같은 경우는 도리어 GraphQL이 성능이 더 좋지 않을 수 있다. 게다가 API Gateway 에서 Caching을 사용 하는 경우에는 REST API가 낫다.
결과적으로 서로 간의 장단점이 존재하지만 GraphQL은 CRUD(Create, Read, Update, Delete) 작업을 할 때 REST API 보다 더 적합하다고 할 수 있다.
그래서 지금까지 언급한 것을 바탕으로 GraphQL만의 특징을 알아보면 다음과 같다.
1) 필요한 데이터만 전달해 준다.
2) 한 번 요청에 많은(다양한) 데이터를 가져 올 수 있다.
3) 속성에 대한 타입을 지정하여 정확한 데이터를 가져 올 수 있다. (잘못된 타입으로 인해 발생하는 에러를 피할 수 있다.)
4) 버전 관리가 필요하지 않다.
참조
- https://www.howtographql.com/basics/1-graphql-is-the-better-rest/
- https://www.holaxprogramming.com/2018/01/20/graphql-vs-restful-api/
'IT > Web' 카테고리의 다른 글
[GraphQL] SDL (Schema Definition Language) (0) | 2019.03.16 |
---|---|
[GraphQL] Architecture Pattern (0) | 2019.03.16 |
Golang Web Framework 비교 (0) | 2018.08.06 |
댓글