# GraphQL
GraphQL은 Graph Query Language의 줄임말으로 페이스북에서 개발하였으며, 서버 API를 구성하기 위해 만든 데이터베이스 쿼리 언어이다.
쿼리문의 작성이 직관적이며 API를 호출할 때 쿼리문을 원하는 형식으로 작성하여 원하는 데이터만 응답받도록 할 수 있다.
기존 서버 API에서 주로 사용되던 RESTful API는 사용자가 원하는 형태의 모든 API를 구현하는데에 어려움이 있었으며 이러한 니즈는 GraphQL의 등장배경이 되었다.
https://graphql.org/ 에 접속하여 GraphQL의 쿼리문의 형식과 그에 따른 응답을 예제로 볼 수 있다.
# EndPoint
위에 적었듯 GraphQL의 등장배경에는 RESTful API의 구현방식 상 각기 다른 요구 사항에 대하여 EndPoint를 다르게 세팅해주어야 하는(여러 API를 만들어야 하는) 문제가 있었다.
- 학급 관리 API => /class - 학생 관련 => class/{class_number}/student - 학생 추가 => class/{class_number}/student/update [POST] - 학생 삭제 => class/{class_number}/student/update/{student_id} [DELETE] - 학생 조회 => class/{class_number}/student/lists [GET] - 선생님 관련 => class/{class_number}/teacher - 선생님 할당 => class/{class_number}/teacher/update [POST] - 선생님 변경 => class/{class_number}/teacher/change [POST] - 선생님 조회 => class/{class_number}/teacher/who [GET] - 학급 정보 조회 => class/{class_number}/info - 반 성적 조회 => class/{class_number}/info/grade - 평균 조회 => class/{class_number}/info/grade/avg - 반 등수 조회 => class/{class_number}/info/grade/rank - 최고점 조회 => class/{class_number}/info/grade/highest ................................ |
예를 들자면 이런식으로 하나의 API를 구성하려면 엄청나게 많은 Endpoint로 관리되어야 하며, 요구 사항이 복잡해질 수록 더욱 복잡한 형태가 될 것이다.
이러한 형태의 API는 GUI(Graphical User Interface) 형태로 표현된다면 그나마 사용자 입장에서 직관적으로 사용하기 쉽겠지만 단순히 JSON으로 메세지만 오가는 API라면 반드시 표나 문서등으로 정리가 필요할 것이다.
GraphQL은 이러한 1 Resource 1 Endpoint 형태의 문제를 해결하기 위하여 등장하였으며 N Resource 1 Endpoint의 형태를 가진다.
간단한 예로 표현하면 하나의 Endpoint에서 제공하는 쿼리문이 아래와 같이 존재한다고 한다면
query{ class{ classNumber students{ name age grade } teacher{ name age } } } |
이 쿼리 그대로 API에 요청을 한다면 아래와 같은 결과를 얻을 수 있다.
query{ class{ classNumber students{ name age grade } teacher{ name age } } } |
{ "data":{ "class": [ { "classNumber":1, "students":[ { "name": "jason", "age": 9319, "grade": "A" }, { "name":"grace", "age": 27, "grade":"A+" }, { "name":"jinseo", "age":27, "grade":"F" }], "teacher":{ "name":"ace", "age": 46 } }, { "classNumber":2 "students":[ { "name": "lucas", "age": 23, "grade": "C+" }], "teacher":{ "name":"paul", "age": 49 } }] } } |
이번에는 선생님의 정보만 얻고싶다면 쿼리문을 작성할 수 있다.
query{ class{ teacher{ name age } } } |
{ "data":{ "class": [ { "teacher":{ "name":"ace", "age": 46 } }, { "teacher":{ "name":"paul", "age": 49 } }] } } |
이번에는 선생님의 정보 중 나이는 필요없고 이름만 얻고싶다면 위의 쿼리문에서 age를 지워주면 된다.
query{ class{ teacher{ name } } } |
{ "data":{ "class": [ { "teacher":{ "name":"ace" } }, { "teacher":{ "name":"paul" } }] } } |
이처럼 GraphQL에서는 원하는 Resource에 맞게 쿼리문을 요청하는 사용자가 직접 작성하면 되므로 여러개의 endpoint가 필요하지 않다.
또한 Graphiql이나 Playground를 이용한다면 별도의 문서작업 없이 정의 된 스키마를 보고 원하는 쿼리를 작성할 수 있다.
# 장단점
GraphQL은 단일 endpoint를 사용하므로 단 한번의 호출으로 원하는 Resource를 얻을 수 있기 때문에 REST API에 비하여 HTTP 요청의 횟수를 줄일 수 있다.
또한 응답의 형태를 내가 원하는 부분만 쿼리문으로 작성하여 컨트롤 할 수 있기 때문에 HTTP 응답의 Size도 줄일 수 있다.
하지만 GraphQL이 장점만 가진다면 REST API를 사용할 이유가 없지 않은가
GraphQL은 고정과 요청과 고정 된 응답을 필요로 하는 경우에는 Query 때문에 REST API에 비하여 요청의 크기가 증가한다.
또 Text로 처리되지 않는 요청을 처리하기에 비효율적이며 재귀적인 Query가 불가능하다.
이처럼 GraphQL과 RESTful방식은 서로 장단점을 가지고 있기 때문에 원하는 경우에 맞게 API를 작성해주면 되고 꼭 둘중 하나를 선택할 필요 없이 GraphQL이 효율적인 경우에는 GraphQL으로 RESTful이 효율적인 경우에는 RESTful로 API를 구현해주면 된다.
'서버 관련 > Backend 지식' 카테고리의 다른 글
GraphQL 스키마 작성하기 (GraphQL Schema) (0) | 2020.04.18 |
---|---|
GraphQL(Graph Query Language) 란? (0) | 2020.04.16 |
REST API 란? (0) | 2020.04.09 |