GraphQL
은 Server API 를 구성하기 위해 Facebook 에서 만듬GraphQL
은 클라이언트에서 필요한 데이터만을 쿼리할 수 있도록 하여 위의 문제를 매우 직관적이고 깔끔하게 해결GraphQL
은 클라이언트에서 사용할 Query Language 를 정의GraphQL
에 넘기면 GraphQL
은 쿼리를 해석해 서버에서 필요한 데이터를 가져온 후 클라이언트에 해당 데이터를 반환Tip! 쿼리 언어 ( Query Language )
- 쿼리 언어는 정보를 얻기 위해 보내는 질의문 ( Query ) 를 만들기 위해 사용되는 컴퓨터 언어
- 가장 잘 알려져있는 예시로는 데이터베이스 시스템에 저장된 데이터를 가져오기 위해 사용하는
SQL
이 있음- 예시:
SELECT user_id, username, age FROM users;
GraphQL
( Graph Query Language )SQL
이 데이터베이스 시스템으로부터 데이터를 가져오는 목적을 가진다면 GraphQL
은 클라이언트가 데이터를 서버로부터 가져오는 것을 목적으로 함GraphQL
은 아래와 같은 쿼리를 통해 서버로부터 데이터를 가져옴{
user {
user_id
username
age
}
}
query Author($id: Int) {
author(id: $id) {
name
email
}
}
query Author($id: Int) {
author(id: $id) {
name
email
address
}
}
GraphQL
은 다른 Query Language 인 SQL
등과 같이 쿼리를 선언하면 해당 값에 맞는 데이터를 가져옴Tip!
GraphQL
의 구조
GraphQL
은 데이터의 구조를 정의하는 스키마 ( Schema ) ∙ 데이터 조회를 위한 쿼리 ( Query ) ∙ 데이터 위한 뮤테이션 ( Mutation ) ∙ 조회 결과에 대한 구현을 위한 리졸버 ( Resolver ) 로 구성되며, 이 외에 API명세서의 기능을 하는 인스로펙션 ( Instropection ) 으로 구성
Tip!
GraphQL
의 파이프라인
- GraphQL Query
- Query Language Processor ( Parse ∙ Validate )
- GraphQL Resolver: RDB / NoSQL
- Output ( JSON )
GraphQL
은 RESTful API 가 이미 존재하고 많이 사용되던 2012년 만들어졌음GraphQL
은 어떤 이유에서 만들어졌고 RESTful 과는 어떤 차이가 있을까?GraphQL
이 REST 와 비교해서 가지는 차이점GraphQL
API 는 보통 하나의 엔드포인트를 가짐GraphQL
API는 요청할 때 사용하는 쿼리에 따라 다른 응답을 받을 수 있음GraphQL
은 보통 하나의 엔드포인트만을 사용하며 요청하는 쿼리에 따라 다른 응답을 반환하는 방식example.com/class
example.com/class/{반 index}
example.com/class/{반 index}/students
example.com/class/{반 index}/students/{학생 index}
GraphQL
예시example.com
GraphQL
은 하나의 엔드포인트 ( Root Endpoint ) 에 다른 쿼리로 요청함으로써 다른 응답을 받을 수 있음GraphQL
은 쿼리 작성을 통해 필요한 데이터만 골라 받아올 수 있음https://restapi.com/api/people/1
# REST API 응답 예시
{
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
"hair_color": "blond",
"skin_color": "fair",
"eye_color": "blue",
"birth_year": "19BBY",
"gender": "male",
"homeworld": "http://swapi.dev/api/planets/1/",
"films": [
"http://swapi.dev/api/films/1/",
"http://swapi.dev/api/films/2/",
"http://swapi.dev/api/films/3/",
"http://swapi.dev/api/films/6/"
],
"species": [],
"vehicles": [
"http://swapi.dev/api/vehicles/14/",
"http://swapi.dev/api/vehicles/30/"
],
"starships": [
"http://swapi.dev/api/starships/12/",
"http://swapi.dev/api/starships/22/"
],
"created": "2014-12-09T13:50:51.644000Z",
"edited": "2014-12-20T21:17:56.891000Z",
"url": "http://swapi.dev/api/people/1/"
}
GraphQL
API 를 사용하면 아래와 같이 요청 할 수 있음https://graphqlapi.com
# GraphQL API 요청 예시
query {
person(personID: 1) {
name
height
mass
}
}
# GraphQL API 응답 예시
{
"data": {
"person": {
"name": "Luke Skywalker",
"height": 172,
"mass": 77
}
}
}
GraphQL
은 클라이언트에서 필요한대로 쿼리를 작성해 원하는 데이터만을 가져올 수 있음Over-Fetching
과 Under-Fetching
이 발생/user
API 가 있다고 가정# GET /user/1
# 응답 예시
{
"user_no": 1,
"user_name": "test",
"user_grade": "VVIP",
"zip": "11053",
"last_login_timetamp": "2019-08-08 12:11:44",
...
}
/user/1
API를 호출한 다음 user_name
을 가져와 사용해야함user_grade
∙ zip
등의 데이터는 사용하지 않는 데이터도 같이 반환 받는데 이는 곧 리소스의 낭비라고 볼 수 있고 이와 같은 낭비를 Over-Fetching
이라 함# GET /user/1/
# GET /cart/
# GET /notification/
# GET /wish/
...
Under-Fetching
이라 함GraphQL
이 REST API 와 비교해서 가지는 장점GraphQL
은 원하는 정보를 하나의 쿼리에 모두 담아 요청 할 수 있음GraphQL
을 개발한 초기 이유 중 하나는 모바일 사용의 증가라고 함GraphQL
을 사용함으로써 데이터 사이즈를 최소화하여 모바일 환경의 부담을 줄일 수 있음request
/response
형식에 의존하게 됨GraphQL
은 request
/response
의존도가 많이 없기 때문에 개발자들의 API 개발 부담을 덜 수 있음SQL
은 RDB 가 해당 역할을 수행하는데 GraphQL
은 도대체 누가 그 역할을 할까?GraphQL
이라는 Service Broker 레이어가 더 들어가고 이 GraphQL
에서 절차적으로 처리를 수행GraphQL
을 사용하기 위해서는 서버와 클라이언트의 중간에 GraphQL
이 레이어로 하나 더 있다고 보아야 함GraphQL
레이어와 통신하여 데이터를 가져오게 됨GraphQL
로 옮겨감GraphQL
을 만들면 클라이언트에서는 통신 로직의 구현이 편해지지만 그만큼 서버에서는 일이 가중됨GraphQL
도입을 결정하는 것이 좋음Tip!
GraphQL
의 단점
- 고정된 요청과 응답만 필요할 때에는 쿼리로 인해 요청의 크기가 Restful 보다 커질 수 있음
- 캐싱이 REST 보다 복잡
- 파일 업로드 구현 방법이 정해져있지 않아 직접 구현해야 함