[TS express] eager loading과 lazy loading

🪐 C:on·2022년 1월 5일
0

TS-Express

목록 보기
3/4
post-custom-banner

n+1문제

연관관계에서 자식 엔티티를 조회할 경우 부모 엔티티를 알아내기 위해 n번의 쿼리를 추가로 날리게 되는 문제를 말한다.

  • 즉시로딩으로 데이터를 가져오는 경우
  • 지연로딩으로 데이터를 가져온 이후에 하위엔티티를 다시 조회하는 경우

위 두가지 경우에서 주로 발생하는데, 성능저하를 일으킬 수 있다.

성능저하를 해결하기 위해선 eager loading을 사용해줌으로써 해결할 수 있다. eager loading은 연관데이터를 JOIN해서 불러오는 것이다.

애초에 sql을 공부하면서 join을 알고 있었고 그래서인지 연관테이블을 함께 조회하는 경우 반복문을 만들어서 한번씩 조회하는 것보다 eager loading을 사용하는 것이 당연하다고 생각했다.

eager loading의 문제점

문제점에 대해 생각하게 된 것은 게시물의 태그를 불러오면서이다.

불러온 게시물이 20개 일 때 각 게시물이 태그를 최소 10개씩 가지고 있다고 가정하면 200개의 태그 데이터를 한번에 불러와야 하는 것이다.

하지만 애플리케이션의 태그 조회 기능은 태그 버튼을 클릭했을 때에 조회를 진행하는 방식이었다.

따라서 태그와 게시물데이터가 JOIN되어 전달될 필요가 없다고 생각했고, 이처럼 당장의 조회가 필요하지 않는 연관테이블 데이터는 eager loading을 하지않는 것이 더 효율적인 방법이 맞는지에 대한 확인이 필요했다.

JOIN을 하지 않는, 즉 eager loading의 반대 조회방식을 lazy loading이라고 하며 typeORM을 사용할 때는 스키마 선언단계에서 eager:true 를 작성해주지 않는 방식이다.

lazy loading을 사용할 때의 이점은

  • 초기 로딩시간 절약
  • 순간적인 자원 소비를 줄임
  • 사용하지 않는 데이터를 결과 객체에 포함시키지 않아서 cpu타임 절약

sns에서 댓글 더보기 기능같은 곳에 사용된다고 한다.

태그 조회 기능역시 초기에 게시물을 조회할 때에는 필요치 않은 데이터이므로 위의 lazy loading 이점을 갖게 됨을 확인했고, 프로그램에 적용하기로 결정하게 되었다.

post-custom-banner

0개의 댓글