[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 쿼리 문제 해결 방법에 대해 알아보았습니다. 만약 이에 대한 질문이 있으시다면 언제든지 문의해 주세요.