A Developing Developer

TypeORM 에서 'n + 1 problem' 은 어떻게 해결할까? 본문

개발 상식

TypeORM 에서 'n + 1 problem' 은 어떻게 해결할까?

H-JJOO 2023. 2. 21. 00:41

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