GRAPHQL TYPES

TypeScript GraphQL 계약 구조

GraphQL의 장점만 설명하면 실제 서버 구현에서 생기는 타입 불일치가 보이지 않는다. schema가 공개 계약을 만들고 resolver가 데이터를 채우며, context가 인증과 loader를 전달하고, codegen이 TypeScript 타입을 생성해 클라이언트와 서버의 오차를 줄인다.

01

Schema 설계

nullable 여부, input type, enum, pagination 형태를 클라이언트 계약으로 고정한다.

nullable 하나가 호출자 분기를 바꾼다
02

Resolver 구현

Query와 Mutation은 업무 로직으로 연결하고 field resolver는 관계 데이터를 채운다.

resolver가 DB 접근으로 흩어지지 않게 한다
03

Context 구성

사용자, 권한, DataLoader, request id를 요청 단위 context에 넣는다.

전역 loader는 권한 누출 위험이 있다
04

N+1 제어

목록의 field resolver가 반복 쿼리를 만들면 DataLoader로 batch 처리한다.

쿼리 수를 로그로 확인한다
05

타입 생성

schema와 operation에서 TypeScript 타입을 생성해 resolver와 클라이언트 사용을 검증한다.

수동 타입은 drift가 생기기 쉽다
Nullability
결과 분기 계약 필드가 null일 수 있는지 schema에 명확히 드러낸다.
클라이언트 렌더 분기를 바꾼다
Resolver
데이터 채우기 요청 인자 검증, 권한, 서비스 호출, 오류 변환을 맡는다.
과한 DB 로직은 service로 뺀다
DataLoader
N+1 완화 요청 단위 cache와 batch로 관계 조회를 묶는다.
권한별 key를 고려한다
Codegen
타입 동기화 schema 변경이 클라이언트와 resolver 타입 오류로 드러나게 한다.
CI에 포함한다

API 확인

N+1 로그 목록 쿼리 한 번에 DB 호출이 몇 번 발생하는지 확인한다.
타입 생성 schema 변경 후 codegen과 typecheck가 함께 도는지 본다.
오류 형태 검증 실패, 권한 실패, 내부 오류의 응답 shape이 정책과 맞는지 확인한다.