Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon DataLoader 패턴이 GraphQL에서 WhenLoaded ()의 문제를 완화하는 데 어떻게 도움이됩니까?


DataLoader 패턴이 GraphQL에서 WhenLoaded ()의 문제를 완화하는 데 어떻게 도움이됩니까?


Dataloader 패턴은 일반적인 N+1 쿼리 문제를 해결하고 배치 및 캐싱 메커니즘을 통해 데이터 가져 오기를 최적화하여``whenloaded ()```의 문제를 완화하는 데 도움이됩니다.

###`whenloaded ()`에 대한 문제가 GraphQL에서 문제입니다

GraphQL에서는 Resolvers가 종종 여러 엔티티의 관련 데이터를 가져와야합니다. 최적화가 없으면 N+1 문제로 이어질 수 있습니다. 여기서 N 항목에 대한 쿼리는 N 추가 데이터베이스 요청 (초기 초기)을 초래하여 성능 저하가 상당한 성능 저하를 초래할 수 있습니다. 관련 데이터를로드 할 때까지 기다리는``WhenLoaded ()`메소드는 각 항목에 대해 여러 개의 별도 데이터 페치를 트리거하여 비효율적이고 반복적 인 데이터베이스 쿼리를 초래하여이를 악화시킬 수 있습니다.

데이터 로더 패턴이 어떻게 도움이되는지

1. 배치 요청
데이터 로더 패턴은 여러 개별 데이터 요청을 단일 쿼리로 배치합니다. Dataloader는`whenloaded ()`가 할 수있는 것처럼 관련 데이터를 하나씩 가져 오는 대신 이벤트 루프의 단일 진드기 중에 요청 된 모든 키를 수집하고 하나의 배치 요청을 데이터베이스에 보냅니다. 이로 인해 쿼리 수가 크게 줄어들어 성능이 향상됩니다. 예를 들어, 16 개의 개별 쿼리 대신 DataLoader는 이것을 4 개의 배치 쿼리로 줄일 수 있으며, 각각 여러 키에 대한 데이터를 한 번에 가져옵니다 [2] [6] [8].

2. 캐싱 결과
Dataloader는 단일 요청 범위 내에서 가져온 데이터 결과를 캐시합니다. GraphQL 쿼리를 해결하는 동안 동일한 데이터가 여러 번 요청되면 Dataloader는 데이터베이스를 다시 쿼리하는 대신 캐시 된 결과를 반환합니다. 이 중복 제거는`whenloaded ()`가 그렇지 않으면 [1] [3] [6]를 유발할 수있는 중복 요청을 방지합니다.

3. 요청 당 데이터 로더 인스턴스
데이터 누출을 피하고 사용자/요청 컨텍스트 당 올바른 캐싱을 보장하려면 각 GraphQL 요청에 대해 새 데이터 로더 인스턴스가 생성됩니다. 이 접근법은 해당 요청 내에서 배치 및 캐싱의 혜택을받는 동시에 격리와 보안을 유지합니다 [3].

4. GraphQL Resolvers와의 통합
DataLoader를 GraphQL Resolvers에 통합함으로써 각 Resolver는 데이터베이스를 직접 쿼리하거나`Wherloaded ()`에 의존하는 대신 Dataloader에서 'load'를 호출합니다. 이것은 효율적인 데이터 가져 오기의 책임을 데이터 로더로 이동시켜 투기 및 캐싱을 투명하게 관리합니다 [1] [3] [6].

요약

데이터 로더 패턴은`whenloaded ()`의 graphql에서 다음을 효과적으로 완화시킵니다.

- 여러 데이터 가져 오기 요청을 단일 배치 쿼리로 수집하여 데이터베이스 왕복 트립 수를 줄입니다.
- 캐싱 된 데이터가 동일한 요청 내에서 중복 쿼리를 방지하기 위해 데이터를 가져옵니다.
- 보안 및 정확성을 유지하기 위해 요청 당 고립 된 데이터 로더 인스턴스 생성.
- 데이터가 최적화를 데이터 로더로 추상화하여 리졸버 코드를 단순화합니다.

이로 인해 GraphQL 애플리케이션에서 성능, 확장 성 및 자원 활용이 크게 향상되었습니다 [2] [6] [7].

인용 :
[1] https://www.apollographql.com/tutorials/dataloaders-typescript/04-using-a-dataloader
[2] https://wundergraph.com/blog/dataloader_3_0_breadth_first_data_loading
[3] https://github.com/graphql/dataloader
[4] https://www.parabol.co/blog/graphql-dataloader-cookbook/
[5] https://swatinem.de/blog/graphql-dataloader-part2/
[6] https://moldstud.com/articles/p-solving-dataloader-pattern-in-graphql-development
[7] https://ariadnegraphql.org/docs/dataloaders
[8] https://www.apollographql.com/tutorials/dataloaders-dgs/03-data-loaders-und-the-hood