LumoMate
LumoMate/용어집/SurfaceWeb

GraphQL

GraphQL은 클라이언트가 필요한 데이터의 모양을 직접 명시해 요청하는 API 방식입니다. REST가 '주소별로 정해진 데이터를 받는다'면 GraphQL은 '원하는 필드만 골라서 받는다'입니다.
GraphQL의 개념을 표현한 편집형 일러스트.

쉬운 설명

전통적인 REST API에서는 사용자 정보를 받으려면 /users/123에 요청하고, 그 사용자의 글 목록을 보려면 또 /users/123/posts에 요청해야 합니다. 화면 하나 그리려고 서버에 네다섯 번씩 다녀와야 하는 일이 흔합니다. 모바일 환경에서는 네트워크 비용이 그대로 사용자 체감 속도가 됩니다.

GraphQL은 이걸 한 번에 끝낼 수 있게 해 줍니다. 클라이언트가 '나는 사용자의 이름과 그 사용자의 최신 글 3개의 제목만 필요해'라고 쿼리를 보내면, 서버가 정확히 그 모양의 응답을 돌려줍니다. 불필요한 필드는 빠지고, 여러 리소스를 한 번에 조합해서 받습니다.

동작 흐름은 세 단계입니다. ① 서버는 '이 시스템엔 이런 타입(User·Post·Comment)이 있고, 각 타입엔 이런 필드가 있다'는 스키마를 정의. ② 클라이언트는 그 스키마 안에서 자기 화면에 필요한 데이터의 모양을 적어 쿼리로 보냄. ③ 서버는 쿼리를 분석해 필요한 리소스를 조합한 응답을 돌려줌. 스키마가 강력한 타입 시스템 역할을 해서 도구·자동완성이 풍부합니다.

강점은 분명합니다. ① 한 번 요청으로 필요한 모든 정보 — 화면 한 장을 그리기 좋음. ② 응답이 화면에 딱 맞아 데이터 낭비가 적음. ③ 스키마 덕분에 IDE 자동완성·문서 자동 생성 등 개발자 경험이 좋음. 페이스북에서 시작해 깃허브·쇼피파이·인스타카트 같은 곳에서 표준이 됐습니다.

단점도 무시할 수 없습니다. 서버 구현이 REST보다 까다롭고, 캐싱이 (각 쿼리가 고유한 형태라서) 단순하지 않습니다. 또 잘못 짜면 한 쿼리가 DB를 과도하게 두드리는 'N+1' 문제가 생깁니다. 그래서 작은 서비스에 GraphQL을 도입하는 건 과한 선택일 수 있습니다 — '화면이 많고 클라이언트가 여러 가지(웹·iOS·안드로이드)다'일 때 가장 효용이 큽니다.

GraphQL의 개념을 본문 안에서 다른 각도로 비춰 보는 편집형 일러스트.
FIG. 1GraphQL을 다른 각도에서 다시 봅니다.

비유로 보면

REST는 정해진 세트 메뉴를 시키는 식당, GraphQL은 뷔페에서 원하는 것만 골라 담는 식당과 비슷합니다. 세트 메뉴는 단순하지만 안 먹는 반찬도 함께 받습니다. 뷔페는 정확히 먹을 만큼만 가져오지만, 주방이 어떻게 그 모든 조합을 동시에 준비할 수 있게 설계하는지가 더 복잡한 일입니다.

어디에서 만나나

모바일·태블릿·웹 등 여러 클라이언트를 동시에 운영하는 서비스, 화면이 자주 바뀌고 각각 다른 데이터가 필요한 SaaS, 외부 개발자에게 풍부한 API를 공개하고 싶은 플랫폼(깃허브·쇼피파이)에서 진가가 큽니다. 작은 단일 백엔드+단일 프런트엔드 조합에서는 REST가 여전히 더 가볍습니다.

작은 예시

쇼핑 앱 메인 화면이 추천 상품·진행 중인 주문·새 알림을 한 번에 보여 줘야 한다고 해 봅시다. REST라면 세 번 요청해야 하지만, GraphQL이라면 세 가지를 한 쿼리에 적어서 한 번에 받아 화면을 빠르게 그릴 수 있습니다.

자주 하는 오해

오해
흔한 오해 둘. ① 'GraphQL이면 항상 빠르다' — 잘못 설계하면 한 쿼리가 DB를 수십 번 두드려 오히려 느려집니다. ② 'GraphQL이 REST를 대체한다' — 둘은 다른 도구이고, 같은 회사 안에서도 영역에 따라 섞어 쓰는 경우가 많습니다.

한 줄 정리

GraphQL의 매력은 '클라이언트가 원하는 모양을 선언한다'는 데 있습니다. 클라이언트가 많고 화면이 자주 바뀌는 회사라면 충분히 검토해 볼 만한 도구입니다.
매주 월요일 오전 8시

한 주에 한 통,
오래 남는 이해를 보냅니다.

흘려보내지 않는 글만 골라 보내드립니다. 광고와 추적, 외부로 빠지는 미끼 링크 없이 메일 안에서 끝나는 한 통입니다.

언제든 한 번의 클릭으로 해지할 수 있습니다. 스팸은 보내지 않습니다.