DataLoader

같은 요청의 N+1 조회를 모아 한 번에 읽는다

Resolver마다 DB를 바로 조회하면 같은 요청 안에서 쿼리가 폭증한다. DataLoader는 key를 모아 배치 조회하고, 같은 key는 요청 동안 캐시한다.

Before: resolver마다 조회

post 1

SELECT author WHERE id=1

post 2

SELECT author WHERE id=2

post 3

SELECT author WHERE id=1 반복

게시글 수가 늘수록 author 조회가 함께 늘어난다.

After: key를 모아 배치 조회

collect

[1, 2, 1]에서 unique key [1, 2]

batch

SELECT * FROM users WHERE id IN (1,2)

map

결과를 key 순서에 맞춰 resolver로 되돌린다.

조회 횟수는 resolver 수가 아니라 배치 종류 수를 따른다.

1요청 시작

request scope에서 loader 인스턴스를 새로 만든다.

2key 수집

resolver들이 load(id)를 호출해 같은 tick에 key를 모은다.

3batch 함수

DB를 한 번 조회하고 key 순서대로 결과 배열을 만든다.

4요청 종료

요청 단위 캐시가 사라져 사용자 간 데이터가 섞이지 않는다.

좋은 신호

같은 요청에서 같은 id를 반복 조회한다.

주의 신호

loader를 singleton으로 두어 사용자별 권한 결과가 섞인다.

검증 기준

쿼리 수가 N개에서 1개 또는 소수 배치로 줄어드는지 확인한다.