A Developing Developer
TypeORM 에서 'n + 1 problem' 은 어떻게 해결할까? 본문
TypeORM에서 'n + 1 problem'은 대개 관련 엔티티의 쿼리를 로드할 때 발생하는 문제이다.
예를 들어, 게시물(Post)과 게시물 작성자(User) 엔티티가 있다고 가정하면, 모든 게시물과 각 게시물 작성자를 로드하려고 할 때 여러 개의 SQL 쿼리를 실행하여 데이터를 가져올 수 있다.
이러한 방식은 쿼리 성능을 저하시키고 데이터베이스 부하를 높일 수 있으므로, TypeORM에서는 'n + 1 problem'을 해결하기 위한 몇 가지 방법을 제공한다.
1. eager 옵션 사용 :
TypeORM에서는 관련된 엔티티를 즉시 로드하기 위해 eager 옵션을 사용할 수 있다. 이를 통해 관련된 모든 엔티티를 한 번에 가져올 수 있다.
예를 들어, 게시물(Post) 엔티티와 게시물 작성자(User) 엔티티를 함께 로드하려면 다음과 같이 eager 옵션을 사용할 수 있다.
const posts = await postRepository.find({ relations: ['user'] });
2. leftJoinAndSelect 사용 :
TypeORM에서는 leftJoinAndSelect 함수를 사용하여 왼쪽 조인 및 엔티티를 로드할 수 있다. 이를 통해 연관된 엔티티를 로드하는 데 필요한 SQL 쿼리를 최소화할 수 있다.
예를 들어, 다음과 같이 leftJoinAndSelect 함수를 사용하여 게시물(Post) 엔티티와 게시물 작성자(User) 엔티티를 함께 로드할 수 있다.
const posts = await postRepository.createQueryBuilder('post')
.leftJoinAndSelect('post.user', 'user')
.getMany();
3. batch 함수 사용 :
TypeORM에서는 batch 함수를 사용하여 여러 엔티티를 한 번에 가져올 수 있다. 이를 통해 다수의 SQL 쿼리를 줄이고 성능을 향상시킬 수 있다.
예를 들어, 다음과 같이 batch 함수를 사용하여 게시물 작성자(User) 엔티티를 한 번에 가져올 수 있다.
const postAuthors = await userRepository.findByIds(posts.map(post => post.userId));
이러한 방법을 사용하여 'n + 1 problem'을 해결할 수 있으며, 성능을 향상시킬 수 있습니다.
'개발 상식' 카테고리의 다른 글
Redis (0) | 2023.02.27 |
---|---|
Scope & Closure (0) | 2023.02.23 |
eager 과 lazy loading (0) | 2023.02.21 |
IoC 와 DI (0) | 2023.02.20 |
JavaScript 에서 this 키워드 (0) | 2023.02.20 |