[nodejs] Dataloader를 사용한 N+1 질의 문제 해결 방법

N+1 쿼리 문제는 많은 데이터베이스 질의가 필요한 상황에서 발생하는 성능 이슈입니다. 예를 들어, 게시글 목록을 가져올 때 각 게시글의 작성자 정보를 가져오기 위해 많은 추가적인 질의가 발생할 수 있습니다. 이를 해결하기 위해 Dataloader를 사용하여 N+1 쿼리 문제를 효과적으로 처리할 수 있습니다.

Dataloader란?

Dataloader는 데이터를 효율적으로 가져오기 위한 유틸리티 모듈입니다. 주로 GraphQL 서버에서 사용되지만 어떤 데이터 로딩 문제에도 적용할 수 있습니다. Dataloader는 데이터 로딩의 요청을 받아 한 번의 요청으로 여러 데이터를 로딩하여 캐싱하고, 중복된 요청에 대한 최적화를 수행하여 성능을 향상시킵니다.

N+1 쿼리 문제의 해결

다음은 Node.js에서 Dataloader를 사용하여 N+1 쿼리 문제를 해결하는 간단한 예제입니다.

const { DataLoader } = require('dataloader');

// 가짜 데이터베이스
const fakeDb = {
  users: {
    1: { id: 1, name: 'User 1' },
    2: { id: 2, name: 'User 2' },
  },
  posts: [
    { id: 1, title: 'Post 1', userId: 1 },
    { id: 2, title: 'Post 2', userId: 2 },
  ],
};

// 유저 로딩 함수
const batchUsers = async (ids) => {
  return ids.map(id => fakeDb.users[id]);
};

// Dataloader 인스턴스 생성
const userLoader = new DataLoader(keys => batchUsers(keys));

// 게시글 조회 함수
const getPosts = async () => {
  const posts = fakeDb.posts;
  for (const post of posts) {
    post.user = await userLoader.load(post.userId);
  }
  return posts;
};

// 게시글 가져오기
getPosts().then(posts => {
  console.log(posts);
});

위 예제에서는 Dataloader를 사용하여 게시글 정보를 가져오면서, 각 게시글의 작성자 정보를 중복된 요청 없이 효율적으로 가져오고 있습니다.

결론

Dataloader를 사용하면 N+1 쿼리 문제를 간단하고 효과적으로 해결할 수 있습니다. 데이터 로딩의 성능을 향상시키고 중복된 요청을 줄여서 애플리케이션의 성능을 향상시킬 수 있습니다.

참고 자료: Dataloader GitHub

이상으로 Dataloader를 사용한 N+1 쿼리 문제 해결 방법에 대해 알아보았습니다. 만약 이에 대한 질문이 있으시다면 언제든지 문의해 주세요.