프론트와 데이터를 주고받는 api와 컨트롤러를 설계할 때, 한번에 모델 인스턴스 객체와 그 관계있는 모델의 인스턴스까지 전부 붙여서 보낼지, 아니면 해당 모델 인스턴스 객체만 보낼지가 고민이었다.
요청을 분할할지 말지를 결정하는 문제.
공식용어로는 전자가 Eager-loading이고, 후자가 Lazy-loading이다.
처음부터 해당 모델에 관계있는 모든 객체를 include 조건을 통해 불러오는 것
=> 한개의 쿼리
조회한 모델의 객체만 불러오고, 관계가 있는 모델의 객체는 나중에 스페셜 메소드로 불러오는 것
=> 여러 개의 쿼리
그러나 결과는, 다대다 관계의 모델만 Bookmark 테이블의 객체가 id와 별도로 붙어 있다.(의도치 않았는데) 즉, 오직 다대다 관계에서 through 테이블이 생성된 모델을 join할때는, through 테이블의 해당 행도 같이 불려오는 걸 확인할 수 있었다.
{ id : 25 }
{ id : 22, Bookmark { createdAt: “...”, updatedAt: “...”, BookmarkerId: “...”, BookmarkedId: “...” } }
그래서 아래와 같이 해결했다.
이제 through 테이블이 붙지 않는 걸 확인할 수 있다.
https://sequelize.org/master/manual/eager-loading.html#eager-loading-with-many-to-many-relationships
아래 사진처럼, 다대다 관계로 붙은 인스턴스를 include로 불러오면 중앙테이블이 자동으로 달려오는 걸 확인할 수 있다.
따라서, 이 중앙테이블 인스턴스의 속성값을 미리 지정하고 싶다면, 아래처럼 불러올 속성을 지정하면 된다.
또한 아예 불러오고 싶지 않다면 [] 빈 배열로 넣어주면 된다.
불러오게되는 중앙테이블에 조건을 줄 수 도 있다고 한다. 아래는 completed 속성이 true 인 것만 불러오라는 의미.