Loader 서비스
Scope.REQUEST로 요청마다 새 인스턴스를 준비합니다.
요청 스코프, 배치 함수, GraphQL context, resolver 호출, 로그 확인이 한 줄로 이어져야 N+1 해결이 확실해집니다.
Scope.REQUEST로 요청마다 새 인스턴스를 준비합니다.
findByIds로 key 목록을 한 번에 조회합니다.
GraphQL 요청 context에 loader를 넣어 resolver가 공유합니다.
author에서 batchUsers.load(authorId)만
호출합니다.
여러 ID가 한 로그에 모이는지 확인합니다.
관계 필드에서는 컨텍스트에 있는 loader로 key만 넘겨 배치 계층에 결정을 맡깁니다.
@ResolveField(() => User)
author(@Parent() post, @Context() ctx)
return ctx.usersLoader.batchUsers.load(post.authorId)
GraphQL Playground에서 게시물과 작성자를 함께 조회한 뒤 서버 로그를 봅니다.
[DataLoader] Fetching users with IDs: 101, 102
posts: 3개, author resolver: 3회
사용자 조회: 1회 배치 호출
반환 배열은 요청 key 순서와 같아야 합니다.
같은 authorId는 요청 캐시로 재사용됩니다.
캐시는 요청이 끝나면 버려져 다음 사용자 요청과 섞이지 않습니다.