- OverFetching: 클라이언트의 요청보다 더 많은 데이터를 반환하는 경우를 말한다. (필요 없는 데이터까지 제공하는 것)
- Underfetch: 하나의 endpoint에 원하는 데이터가 한 번에 오지 않는 것, 원하는 데이터를 얻기 위해 여러번 API를 호출해야 하는 경우를 말한다.
GraphQL은 HTTP 요청 횟수와 응답 사이즈를 줄일 수 있다.
REST API는 여러 endpoint가 존재하고 endpoint마다 SQL 쿼리가 달라지는 반면, GraphQL은 하나의 엔드포인트를 가지며, 각 GraphQL은 스키마(데이터 리소스)으로 SQL 쿼리가 달라진다.
REST API의 응답 데이터의 크기와 형태는 서버에서 결정하지만, GraphQL은 클라이언트 단에서 요청할 때 정의한다. 또한, REST API는 형태 정의와 데이터 요청 방법(method)이 연결되어 있지만, GraphQL에서는 형태 정의와 데이터 요청(query
, mutation
등)이 분리되어 있다.
학생 정보 중 username
과 gender
여부가 필요하다고 가정한다.
// (GET) https://example.com/api/students/1
{
"username": '홍길동',
"membership": true,
"friends": ['김나비', '이철수', '최영수'],
"gender": "male",
"grade": 4,
"address": "",
}
클라이언트가 원하는 값 이외에도 불필요한 정보도 함께 받는다.(OverFetching) 클라이언트의 요청을 명시할 수 없다.
// https://example.com/graphql
query {
students(studentId: 1) {
name
gender
}
}
{
"data": {
"student": {
"name": "홍길동",
"gender": "male"
}
}
}
클라이언트가 원하는 데이터만 불러올 수 있다. 필요한 데이터를 명시적으로 작성할 수 있다. (커뮤니케이션 비용절감 가능)
캐싱이 REST보다 훨씬 복잡하다.
HTTP에선 각 메소드를 기준으로 캐싱이 구현된다. 하지만 GraphQL에선 항상 POST 메소드만을 이용해 요청을 보내기 때문에 각 메소드에 따른 캐싱을 지원받을 수 없다.
Query로 인해 요청의 크기가 커질 수 있다.
고정된 요청과 응답만 필요할 경우에는 REST API보다 요청의 크기가 더 커진다.
File 전송 등 Text만으로 하기 힘든 작업들을 처리하기 복잡하다.