NestJS · GraphQL

GraphQL 스키마, 리졸버, 필드 비용 기준

GraphQL 구현에서 중요한 것은 resolver를 많이 만드는 것이 아니라, 스키마 타입과 리졸버가 어떤 필드 비용과 권한을 갖는지 명확히 하는 것이다.

01

타입 모델링

도메인 타입, input 타입, 반환 타입을 화면 요구가 아니라 API 계약으로 정의한다.

02

리졸버 연결

Query와 Mutation resolver가 service를 호출해 결과를 반환한다.

03

필드 처리

관계 필드는 parent와 args, context를 이용해 필요한 데이터를 가져온다.

04

비용 통제

depth limit, complexity, DataLoader, cache로 과한 쿼리를 제한한다.

Code-first
TypeScript 기반 스키마 decorator로 type과 resolver를 정의하고 schema를 생성
Nest 친화적
Schema-first
SDL 기반 계약 schema 파일을 먼저 두고 resolver를 맞춤
계약 중심 팀에 유리
Context
요청 문맥 인증 사용자, tenant, loaders를 resolver에 제공
요청 범위 비용 확인
Resolver
필드 실행 각 필드가 언제 DB를 호출하는지 추적
N+1 리스크

권한 · N+1 · 오류 점검

권한 Query와 Mutation뿐 아니라 민감 필드에도 권한이 적용된다.
N+1 관계 필드가 항목 수만큼 DB 호출을 만들지 않는다.
오류 GraphQL error extensions가 클라이언트가 읽을 수 있게 정리돼 있다.
스키마 필드 제거와 nullable 변경이 클라이언트 영향으로 검토된다.