피드로 돌아가기
Dev.toBackend
원문 읽기
GraphQL이 REST API의 과다 요청과 과소 요청 문제를 단일 엔드포인트와 클라이언트 주도 쿼리 구조로 해결하는 방식
A Beginner’s Guide to How GraphQL Requests Work
AI 요약
Context
REST API는 여러 엔드포인트를 노출하기 때문에 클라이언트가 필요한 것보다 많은 데이터를 받는 과다 요청 현상이 발생한다. 또한 관련된 데이터를 수집하기 위해 여러 API 호출을 순차적으로 수행해야 하는 과소 요청 문제가 발생한다.
Technical Solution
- HTTP를 전송 메커니즘으로 유지하면서 모든 작업을 단일 /graphql 엔드포인트로 라우팅: REST의 다중 엔드포인트 대신 POST와 GET 요청을 하나의 엔드포인트에서 처리
- 클라이언트가 응답 구조를 정의하도록 설계: query 필드에서 필요한 데이터만 명시적으로 요청하면 서버가 해당 형태로만 응답
- 쿼리 파싱 및 스키마 검증 프로세스 도입: 쿼리 문자열을 내부 트리 구조로 변환한 후 스키마와 비교하여 필드 존재 여부, 인수 타입, 쿼리 구조 유효성 검증
- Resolver 기반 데이터 페칭 구조: 각 필드마다 독립적인 Resolver 함수가 실행되어 데이터베이스, REST API, 마이크로서비스 호출을 처리
- 부분 성공 응답 메커니즘: 일부 필드는 데이터를 반환하고 일부는 오류를 반환하면서도 HTTP 200으로 응답하고 응답 본문에 오류 정보 포함
Key Takeaway
GraphQL 요청의 전체 생명주기를 HTTP 전송에서 Resolver 실행까지 이해하면 API 설계 효율성이 높아지고 디버깅이 용이해진다.
실천 포인트
GraphQL 기반 서비스를 개발할 때 쿼리 파싱 전 인증 미들웨어를 먼저 실행하고, 스키마 검증으로 잘못된 쿼리를 조기에 차단하며, 각 필드의 Resolver에서 데이터소스별로 병렬 처리를 구성하면 불필요한 데이터 전송을 줄이고 네트워크 레이턴시를 감소시킬 수 있다.