[TypeORM] N+1 문제

도도·2021년 8월 1일
0

기술Velog

목록 보기
14/28

N+1 문제

연관 관계에서 발생하는 이슈로
연관 관계가 설정된 엔티티를 조회할 경우에
조회된 데이터 갯수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다.
이를 N+1 문제라고 한다.

N+1 문제란?

  • User는 N개의 Post를 가지고 있다. ( 1:N 관계 ) 라고 가정해 보자.
  • 사용자를 조회 했더니 (SELECT 1개)
  • Post 조회를 N번 더 한다. (SELECT N개)
  • 총합 N+1 개의 조희 쿼리 발생
  • 조회 쿼리에 N개의 쿼리가 더 발생하는 문제이다.

해결 : Eager loading

  • 가능한 적은 query를 날리기 위해 JOIN을 사용 하도록 유도한다.

  • (1) TypeORM 에서는 relation 데코레이터에 eager 옵션이 주어진다.

  • 예를들어, User조회시 관련된 N개의 Post도 엮어서 조회해주고 싶을때 사용한다.

  • (2) find 함수 사용 시 relation필드에 조인할 테이블을 명시 해준다.

  • (3) find 함수 사용 시 join으로 join시킬 대상의 컬럼까지 명시해준다.

Lazyloading

  • JOIN을 하게되면(eager loading) 데이터양이 많아지고, 속도 이슈가 발생할 수 있다.

  • 게시글에 달린 댓글을 모두보기를 눌러야 로딩이 되는 경우가 있지 않는가?

  • N+1 번 쿼리를 날리는 케이스를 지연로딩(lazyloading) 이라 한다.

  • 초기 로딩 시간을 줄일 수 있고, 자원 소비를 줄일 수 있다는 장점

ref

https://yangeok.github.io/orm/2020/11/23/typeorm-theoritical.html#n1-%EB%AC%B8%EC%A0%9C

profile
프론트 주력의 JS 개발자 입니다.! Node.js, React, NestJS 에 관심이 많습니다.

0개의 댓글