Eager-loading & Lazy-loading

HAN·2021년 6월 13일
0

sequelize

목록 보기
2/2

프론트와 데이터를 주고받는 api와 컨트롤러를 설계할 때, 한번에 모델 인스턴스 객체와 그 관계있는 모델의 인스턴스까지 전부 붙여서 보낼지, 아니면 해당 모델 인스턴스 객체만 보낼지가 고민이었다.

요청을 분할할지 말지를 결정하는 문제.
공식용어로는 전자가 Eager-loading이고, 후자가 Lazy-loading이다.

Eager loading

처음부터 해당 모델에 관계있는 모든 객체를 include 조건을 통해 불러오는 것
=> 한개의 쿼리

Lazy loading

조회한 모델의 객체만 불러오고, 관계가 있는 모델의 객체는 나중에 스페셜 메소드로 불러오는 것
=> 여러 개의 쿼리

1. through 테이블을 조건으로 Eager loading 하기

모델 간의 관계 정의

모델 간의 관계1
모델 간의 관계2

불러오고자 하는 through 테이블 지정 예시

  • User와 Post(as :“Bookmarked” )는 다대다 관계에 있다.
  • 서버에서는 사진 1처럼 db 조회 include 조건으로 모든 관계된 모델의 id만 가져오기로 했다.

그러나 결과는, 다대다 관계의 모델만 Bookmark 테이블의 객체가 id와 별도로 붙어 있다.(의도치 않았는데) 즉, 오직 다대다 관계에서 through 테이블이 생성된 모델을 join할때는, through 테이블의 해당 행도 같이 불려오는 걸 확인할 수 있었다.

일대다 관계의 테이블을 eager-loading 할 때 불러온 객체

{ id : 25 }

다대다 관계의 테이블을 eager-loading 할 때 불러온 객체

{ id : 22, Bookmark { createdAt: “...”, updatedAt: “...”, BookmarkerId: “...”, BookmarkedId: “...” } }

왜지?? 빼고싶은데

  • 도큐먼트를 보니 다대다 관계로 조인된 다른 모델의 인스턴스를 불러올 때, 해당 객체 속성 안에 중앙 테이블의 인스턴스를 자동으로 갖는다.
  • 즉, Post 인스턴스에 attr을 id로 하여 불려져왔지만, 자동으로 Bookmark 인스턴스까지 같이 딸려오는 것이다.
  • 딸려오는 중앙테이블은 전체 속성을 다 같이 불러오는데, through : { attributes: [] } 조건을 통해 불러오는 속성을 지정할 수 있다.
  • 만약 중앙 테이블 인스턴스가 붙어오는 걸 원하지 않는 경우 attributes: [] 속성을 주면 된다.

그래서 아래와 같이 해결했다.


이제 through 테이블이 붙지 않는 걸 확인할 수 있다.

Sequelize 다대다 관계에서의 eager-loading 도큐먼트의 요약

https://sequelize.org/master/manual/eager-loading.html#eager-loading-with-many-to-many-relationships

아래 사진처럼, 다대다 관계로 붙은 인스턴스를 include로 불러오면 중앙테이블이 자동으로 달려오는 걸 확인할 수 있다.

따라서, 이 중앙테이블 인스턴스의 속성값을 미리 지정하고 싶다면, 아래처럼 불러올 속성을 지정하면 된다.

또한 아예 불러오고 싶지 않다면 [] 빈 배열로 넣어주면 된다.

불러오게되는 중앙테이블에 조건을 줄 수 도 있다고 한다. 아래는 completed 속성이 true 인 것만 불러오라는 의미.

profile
즐거운 배움이 되길

0개의 댓글