GraphQL이란 클라이언트와 서버가 소통하는 API용 쿼리 언어이자,
데이터에 대해 정의한 유형 시스템을 사용하여 쿼리를 실행하기 위한 서버 측 런타임을 말합니다.
2023년 Postman이 4만 명의 개발자를 대상으로 실시한 API 프로토콜 현황 조사에 따르면,
REST의 사용률은 2년 동안 92%에서 86%로 감소한 반면, GraphQL의 채택률은 29%로 증가하는 추세를 보였습니다.
그렇다면 GraphQL이 점차 사랑받고 있는 이유는 무엇일까요?
1. 하나의 엔드 포인트와 단일 POST 메소드
RESTful API의 경우, 다양한 메소드를 사용하며 전송에 사용된 HTTP 메소드, URI를 통해 각 작업을 구분합니다.
이러한 방식은 요청의 내용을 직관적으로 알 수 있다는 장점이 있으나, 많은 엔드포인트를 관리해야 한다는 단점이 있습니다.
또한 어떤 데이터에 대한 요청인 지는 명확히 나타낼 수 있으나, 데이터 중 어떤 항목을 받아올 것인 지는 특정하지 못한다는 점도 존재합니다.
POST https://api.diary.com/f1/foods
GET https://api.diary.com/f1/foods/6
PUT https://api.diary.com/f1/foods/6
PATCH https://api.diary.com/f1/foods/24
DELETE https://api.diary.com/f1/foods/25
위와 같은 경우, foods에 관한 정보가 name과 price만 필요할 때에도 foods/6에 관한 모든 데이터 정보(name, price, ingredients, category, description)를 가져오게 됩니다.
이러한 특징 때문에 데이터 중 몇몇의 항목만 필요하지만 각 리소스의 모든 데이터를 반환받아 필요 이상의 데이터가 전송되는 Overfetching 문제가 발생할 수 있으며, 한 화면을 띄우기 위해 여러 차례의 요청을 보내야 하는 Underfetching 문제도 가지고 있습니다.
각종 서비스들은 이러한 요청과 응답이 지속적으로 교환되기 때문에, 교환 과정에서 적지 않은 데이터 낭비 및 오버헤드가 발생할 수 있습니다.
반면 GraphQL은 하나의 엔드 포인트를 사용하고, 모든 요청을 POST 메소드를 사용합니다.
관련 데이터를 가져오기 위해 여러 API 엔드 포인트를 거치는 과정 없이 단일 쿼리에서 모든 데이터를 얻을 수 있습니다.
또한 클라이언트가 필요로 하는 정보만을 취사 선택해서 서버에 요청할 수 있습니다.
query {
food(id: 123) {
name
price
ingredients {
name
category
quantity
}
}
}
위와 같은 경우, food 중 색인번호가 123인 음식에 관한 정보가 name과 price, 그리고 ingredients 중에선 name, category, quantity만 가져오게 됩니다.
이렇게 하면 한 번의 요청으로 필요한 정보만 모두 받아올 수 있습니다.
이러한 특징 덕분에 GraphQL은 API의 버전 관리가 더 용이하며, 데이터 검색 프로세스에 대한 더 많은 제어권을 제공한다는 장점이 있습니다.

2. Subscription 메소드
GraphQL는 데이터 조회할 땐 guery 메소드를 사용하고, 데이터 추가, 수정, 삭제할 땐 mutation 메소드를 사용합니다.
추가로 subscription라는 메소드를 제공하는데 이는 말 그대로 특정 리소스에 데이터가 업데이트될 때마다 자동으로 데이터를 받을 수 있도록 해줍니다.
subscription {
reviewAdded(foodId: "123") {
comment
rating
user {
name
}
}
}
RESTful API 같은 경우, 실시간으로 추가되는 정보를 반영하려면 주기적으로 서버에서 데이터를 받아오도록 요청을 보내야 합니다.
반면 GraphQL에서는 subscription 메소드를 활용하면, 특정 리소스가 업데이트될 때마다 자동으로 데이터를 받아올 수 있습니다. 이를 통해 프론트엔드는 반환된 데이터를 기반으로 화면을 실시간으로 업데이트할 수 있습니다.
이러한 장점을 가진 GraphQL에도 단점이 있습니다.
- GraphQL 메시지들은 요청들이 복잡하기 때문에 이를 기준으로 캐싱을 하기가 용이하지 않습니다.
- 복잡한 쿼리를 해석해서 작업들을 실행하기 때문에 REST API에 비해 서버에 부담을 줄 수 있습니다.
참고
https://news.hada.io/topic?id=12179