GraphQL 심화란?
GraphQL은 REST의 Over-fetching·Under-fetching 문제를 해결하는 쿼리 언어입니다. 정보처리기사에서는 GraphQL의 핵심 개념과 마이크로서비스 환경에서의 Federation 아키텍처를 중점적으로 출제합니다.
GraphQL 핵심 개념
타입 시스템
- SDL(Schema Definition Language): type Query·Mutation·Subscription 루트 타입. scalar·enum·interface·union·input 타입
- Resolver: 각 필드의 데이터 반환 함수. 부모 객체(parent), 인수(args), 컨텍스트(context), 정보(info) 4인자
- Introspection: __schema·__type 쿼리로 스키마 자기 기술. GraphiQL·Apollo Sandbox 활용
- Directive: @deprecated·@include·@skip. 커스텀 디렉티브로 권한·캐싱 구현
N+1 문제와 DataLoader
- N+1 문제: 목록 조회 후 각 항목의 관계 데이터를 개별 쿼리. 100개 게시글 = 101번 DB 쿼리
- DataLoader: 요청 배치(Batching)와 캐싱으로 해결. batch 함수로 한 번에 여러 ID 조회
- 쿼리 복잡도 제한: depth limit·complexity score로 악의적 복잡 쿼리 방어
- Persisted Queries: 쿼리 문자열 대신 해시 ID 전송. 대역폭 절약 + 화이트리스팅
Apollo Federation
Federation 개념
- Supergraph: 여러 subgraph를 하나의 통합 스키마로 노출. Apollo Router가 라우팅
- Subgraph: 독립적인 GraphQL 서비스. @key 디렉티브로 엔티티 정의
- Entity: @key로 식별되는 타입. 여러 subgraph에 걸쳐 확장 가능
- @external·@requires·@provides: Subgraph 간 필드 의존성 표현 디렉티브
Federation 동작 방식
- Query Planning: Router가 쿼리를 분석해 여러 subgraph에 분산 실행 계획 수립
- Entity Resolution: _entities 쿼리로 다른 subgraph의 엔티티 데이터 요청
- Schema Composition: Rover CLI로 subgraph 스키마 합성. 충돌 감지
GraphQL 보안
- 인증·권한: Directive 기반 @auth. context에서 JWT 검증 후 resolver에서 확인
- Query Depth Limit: 중첩 깊이 제한으로 DoS 방어
- Rate Limiting: complexity 기반 토큰 버킷. 단순 요청 수 제한보다 정교함
- Introspection 비활성화: 프로덕션에서 스키마 노출 방지
시험 핵심 포인트
- GraphQL vs REST: 단일 엔드포인트, 클라이언트가 필요한 필드 명시, Over/Under-fetching 없음
- N+1 해결: DataLoader의 배치 + 캐싱
- Federation @key: 엔티티를 여러 subgraph에서 공유하는 기준 필드
- Subscription: WebSocket 기반 실시간 데이터 스트림
마무리
GraphQL Federation은 마이크로서비스 환경에서 일관된 API 게이트웨이를 구현하는 현대적 방법입니다. 각 팀이 독립적으로 subgraph를 개발·배포하면서 통합 스키마를 유지할 수 있습니다.