February 02, 2021
GraphQL에 대해서 어느정도 알고있지만 정리가 필요할 것 같아 잘 정리된 영문으로된 글을 읽으면서 간단하게 정리해보려고 합니다. (읽으면서 알게된 내용을 적어서 순서가 뒤죽박죽입니다 😅)
최근에도 많이 사용되는 REST(Representational State Transfer) API design은 클라이언트에게 CRUD API를 제공하기 간단했습니다. 하지만 최근부터 복잡한 데이터를 요구하는 클라이언트, 다양한 종류의 클라이언트(mobile, desktop, TV 등등..)가 증가하면서 한 API로 모든 클라이언트를 만족시키는 건 어려운 일이었습니다. 또 성장하고 있는 사업 분야에서 다양한 비즈니스적인 요구들을 반양하기에 REST API design은 클라이언트/서버 모두 업데이트해야 하기 때문에 기능 제공이 느려질 수 밖에 없었습니다.
GraphQL은 클라이언트에서 어떤 데이터를 조회할지 명시할 수 있게 해주는 언어라고 할 수 있습니다. 2012년에 Facebook에서 만들어졌는데, 명확한 data-fetching을 통해서 네트워크 사용량을 줄이고자 하는 목적으로 만들어졌습니다. 처음에는 자바스크립트에서만 구현되었지만 최근에는 여러 메이저한 언어(Python, Java 등)에서도 구현되어 널리 사용되고 있습니다.
GrapghQL 서버에서는 SDL(Schema Definition Language)로 Schema를 작성하고 클라이언트에서는 해당 Schema에서 얻고자 하는 데이터를 quering합니다. 서버에서는 Schema에 작성된 resolver로 데이터를 가져와 결과를 내려줍니다. 클라이언트에서도 데이터 구조를 명시하여 query를 날리기 때문에 응답 데이터의 구조를 클라이언트 코드상에서 쉽게 파악할 수 있고, 서버로부터 원하는 데이터만 가져올 수 있기 때문에 자원에 대한 over-fetching(클라이언트에서 필요하지 않은 데이터들도 함께 내려주는 문제, REST는 서버에서 정의한 데이터들을 응답해주기 때문에 발생하는 문제)이 발생하지 않습니다. 또 원하는 데이터를 한 번에 다 가져올 수 있어 네트워크 요청수를 줄일 수 있습니다.
GraphQL에는 Query(데이터 읽기), Mutation(데이터 쓰기), Subscription(실시간 데이터 불러오기) 이렇게 3가지의 작업(operation)이 있습니다.
요즘 대세인 마이크로서비스에서 사용하기 좋습니다.
한 번의 요청으로 필요한 데이터를 모두 가져올 수 있습니다. (네트워크 비용 절감)
유효한 Query인지 자동으로 검증해줍니다.
API 스펙 문서화 기능을 제공합니다.
여러 Query에서 반복되어 사용되는 필드들을 공유하여 사용할 수 있습니다.
Pub/Sub 구조를 지원합니다.
빠른 프로토타이핑이 가능합니다.
한번에 너무 깊은 데이터를 요청하면 성능 문제가 발생합니다.
캐싱 구현을 위한 별도의 로직들을 필요로 합니다.
파일 업로드 기능을 기본으로 제공하지는 않습니다.
러닝 커브가 높습니다.