# DataLoader
DataLoader allows you to decouple unrelated parts of your application without sacrificing the performance of batch data-loading. While the loader presents an API that loads individual values, all concurrent requests will be coalesced and presented to your batch loading function. This allows your application to safely distribute data fetching requirements throughout your application and maintain minimal outgoing data requests
import strawberry
import asyncio
from strawberry.dataloader import DataLoader
async def fetch(product_id):
url = f"https://[URL]/product/v1/products/{product_id}"
resp = requests.get(url)
data = json.loads(resp.text)
product = Product.from_json(data)
return product
async def load_product(product_id_list: List[int]) -> Product:
futures = [
asyncio.ensure_future(fetch(url)) for url in product_id_list
] # 태스크(퓨처) 객체를 리스트로 만듦
result = await asyncio.gather(*futures)
return result
loader = DataLoader(load_fn=load_product)
async def product_resolver(root, info) -> Product:
product_id = root.id
return await loader.load(product_id)
@strawberry.type
class ProductInfo(FromJson):
id: int
name: str
product: Product = strawberry.field(resolver=product_resolver)