GraphQL 계약 모델

GraphQL 필드 계약

GraphQL은 하나의 endpoint로 모든 문제를 해결하는 방식이 아니라 schema를 중심으로 클라이언트가 필요한 필드를 선언하고, 서버 resolver가 그 필드를 채우는 API 방식입니다. 강점은 선택적 조회와 타입 계약이고, 위험은 resolver 비용과 캐시 복잡도입니다.

01

Schema 먼저 읽기

Query, Mutation, 타입, nullable 여부가 API의 가능한 요청과 응답 모양을 정의합니다.

계약
02

Query로 필요한 필드 선언

클라이언트는 같은 리소스라도 화면별로 필요한 필드만 요청해 overfetching을 줄일 수 있습니다.

selection
03

Resolver 비용 관리

필드마다 DB를 따로 조회하면 N+1 문제가 생기므로 batching, caching, dataloader를 검토합니다.

performance
04

Mutation과 권한

변경 작업은 입력 타입, 검증, 권한 검사, 오류 형식을 schema와 resolver 양쪽에서 일관되게 다룹니다.

write
REST
리소스별 endpoint와 HTTP 의미가 선명 캐시와 관찰성이 단순하지만 화면별 필드 조합은 endpoint가 늘 수 있습니다.
resource
GraphQL
타입 schema와 선택 필드 중심 클라이언트 유연성이 크지만 resolver 성능과 권한 누락을 세밀히 봐야 합니다.
schema
Subscription
실시간 변경을 stream으로 전달 일반 조회와 다른 연결 수명, 인증, 재연결 정책이 필요합니다.
realtime

권한 위치 · 쿼리 제한 · 캐시 키 점검

권한 위치 필드 resolver 단위에서도 민감 데이터 접근 권한을 확인합니다.
쿼리 제한 depth, complexity, rate limit 없이는 비싼 쿼리가 서버를 압박할 수 있습니다.
캐시 키 클라이언트 캐시는 id와 typename 같은 정규화 기준을 안정적으로 받아야 합니다.

쿼리의 의미

query UserCard($id: ID!) {
  user(id: $id) {
    id
    name
    avatarUrl
  }
}