NestJS · DataLoader

DataLoader로 GraphQL N+1 줄이기

DataLoader는 쿼리를 빠르게 만드는 캐시가 아니라, 한 요청 안에서 같은 종류의 관계 조회를 모아 batch 처리하고 중복 key를 줄이는 도구다.

01

관계 비용 찾기

목록 항목마다 author, team, stats를 따로 조회하는 resolver를 찾는다.

02

배치 함수

key 배열을 받아 한 번의 DB 조회로 결과 map을 만든다.

03

요청 주입

GraphQL context에 request-scoped loader를 넣어 resolver들이 공유하게 한다.

04

순서 보장

batch 결과를 입력 key 순서에 맞춰 재배열하고 없는 값은 null 또는 오류로 처리한다.

Batch
쿼리 묶기 WHERE id IN (...) 형태로 관계 데이터를 한 번에 가져옴
DB 제한 크기 확인
요청 범위
캐시 범위 사용자와 권한이 다른 요청 사이에 데이터가 섞이지 않음
전역 singleton 금지
Ordering
결과 정렬 DataLoader는 key 순서와 같은 배열을 기대
Map으로 재정렬
Prime
사전 캐시 이미 조회한 entity를 loader cache에 넣음
일관성 리스크

요청 범위 · 권한 · 순서 점검

요청 범위 loader가 사용자 요청마다 새로 만들어진다.
권한 batch 조회가 tenant와 ownership 조건을 잃지 않는다.
순서 결과 배열이 입력 key 순서를 정확히 따른다.
측정 적용 전후 DB query 수가 줄었는지 확인한다.