GRAPHQL RESOLVER

Nest GraphQL 품질 경계

GraphQL API는 Query와 Mutation 이름을 정하는 것만으로 끝나지 않는다. 입력 검증, 인증 위치, resolver에서 서비스로 넘기는 책임, DataLoader로 관계 조회를 묶는 방식, 오류 포맷이 모두 클라이언트 계약이 된다.

01

스키마 계약

ObjectType과 InputType으로 클라이언트가 볼 필드와 입력 모양을 고정한다.

nullable 여부가 호환성 계약이다
02

입력 검증

DTO class-validator, custom scalar, pipe로 잘못된 값이 서비스에 들어가지 않게 한다.

GraphQL 타입과 업무 검증은 다르다
03

Resolver 분리

Resolver는 인증 컨텍스트와 인자를 정리하고 실제 업무 로직은 service로 넘긴다.

Resolver가 DB 쿼리로 가득 차면 테스트가 어려워진다
04

관계 조회 제어

Field Resolver에서 반복 조회가 생기면 DataLoader로 batch와 cache 범위를 관리한다.

목록 100개가 쿼리 101개로 번지지 않게 한다
05

오류 포맷

내부 예외를 그대로 노출하지 않고 code, message, path를 정책대로 정리한다.

디버깅 정보와 사용자 메시지를 분리한다
Query
읽기 계약 필터, 페이지네이션, 정렬 인자를 명시하고 권한 범위를 적용한다.
무제한 목록은 비용 폭발을 만든다
Mutation
상태 변경 입력 검증, 중복 요청, 트랜잭션, 반환 타입을 함께 설계한다.
부분 성공 정책을 정한다
Subscription
실시간 전달 인증 컨텍스트와 이벤트 필터링을 연결마다 확인한다.
연결 유지 비용을 본다
DataLoader
N+1 완화 요청 단위 loader로 id 목록을 모아 한 번에 조회한다.
전역 캐시는 권한 누출 위험이 있다

API 확인

N+1 측정 목록 조회 뒤 field resolver가 DB를 몇 번 호출하는지 로그로 확인한다.
권한 필드 같은 쿼리를 다른 사용자로 호출해 볼 수 없는 필드가 빠지는지 본다.
오류 응답 검증 실패, 권한 실패, 내부 오류의 GraphQL error shape을 비교한다.