최근 facebook에서 개발한 GraphQL이라는 API 쿼리 언어를 접하고 한번 공부해보기로 했다.
GraphQL에 대해 학습을 하기 전 REST와 다른점은 무엇인지에 대해 궁금해져 그 부분들을 먼저 짚고 시작해보려 한다.
자원의 정보와 자원에 대한 행위
REST는 한 URL에 자원의 정보와 자원에 대한 행위(HTTP Method)가 묶여 있음
GET /books/1
GraphQL은 자원의 정보와 행위가 분리되어 있음
//자원의 정보
type Book {
id: ID
title: String
published: Date
price: String
author: Author
}
type Author {
id: ID
firstName: String
lastName: String
books: [Book]
}
//자원에 대한 행위
type Query {
book(id: ID!): Book
author(id: ID!): Author
}
```
자원의 종류와 양에 대한 결정
REST는 서버에서 정의
GraphQL은 필요한 자원의 종류와 양을 클라이언트에서 정의
요청 형식
REST는 GET /books/:id
, GET /authors/:id
과 같이 API가 접근할 수 있는 자원의 정보가 리스트로 되어 있는 linear 형식
GraphQL은 자원의 정보 및 자원에 대한 행위를 URL에 표기하지 않고 GraphQL schema
에 표기
//Query- 조회
type Query {
book(id: ID!): Book
author(id: ID!): Author
}
//Mutation- 수정(삽입, 삭제, 변경)
type Mutation {
addComment(input: AddCommentInput): Comment
}
type Book { ... }
type Author { ... }
type Comment { ... }
input AddCommentInput { ... }
complex resources
REST는 복잡한 관계로 얽힌 자원들에 대한 정보를 여러 요청으로 얻음
GraphQL은 한번의 요청으로 복잡한 관계로 얽혀있는 자원들에 대한 정보를 얻을 수 있음
handler와 resolver
REST에서는 하나의 요청 당 하나의 handler 함수를 호출하지만,
GrapghQL에서는 하나의 쿼리로 많은 resolvers를 호출해 여러 자원에 접근한 응답을 얻을 수 있음
REST와 GraphQL의 동작 과정들은 유사하다.
결국, 근간은 원하는 자원에 접근해서 원하는 응답을 받는데 있기 때문이다.
차이점 중에 가장 핵심인 부분은 GraphQL은 한번의 요청으로 여러 자원에 대한 정보를 얻을 수 있다는 것이다.
이로 인해 API를 설계할 때, 여러 엔드 포인트를 정의할 필요가 없어지고, 클라이언트는 필요한 데이터만 얻을 수 있게 해주어 개발의 효율성과 더불어 많은 것들을 절약할 수 있게 해준다.
아직은 REST에 비해 reference와 tool 등이 적지만, 유용하고 배워봄직하다는 것은 틀림없다.
++ GQL 사용해보면서 느낀점 쓰기. GQL과 REST의 사용 시기 구분하기(언제 GQL이 유리하고, 언제 REST가 유리한지)
https://www.apollographql.com/blog/graphql/basics/graphql-vs-rest/