...
Sequelize 여러 JOIN
시퀄라이즈 ORM의 조인 방법을 정리해본다.
왠만하면 성능을 위해서 하나이상 조인을 하는 것은 피해야 되는 것이 맞지만, 연관된 데이터가 여럿 필요한 경우 어쩔수 없이 다중 조인을 할 필요성이 생긴다. (이를 방지 하기 위해 역정규화를 잘해야 되지만..)
다음 사진은 예제 코드에 쓰인 erd 이다. 관계를 잘보고 조인 예제를 살펴보자.
시퀄라이즈 JOIN
- join 2 tables
const user = await User.findOne({
include: [{ // 시퀄라이즈 조인은 기본 inner join
model: Comment, // join할 모델
attributes: ['id'], // select해서 표시할 필드 지정
where: {
id: 1, // on Comment.id = 1
},
}]
});
// 또는 ─────────────────────────────────────────────────────────────────────
const user = await User.findOne({ ... }); // 먼저 user 쿼리를 얻고
const comments = await user.getComments({ // user와 comments를 관계맺어 get한다.
attributes: ['id'], // join해 가져올 comments를.id
where: {
id: 1, // comments를.id = 1
},
});
select users.*, comments.id
from users
inner join comments
on comments.id = users.id
where comments.id = 1
LIMIT 1;
시퀄라이즈 다중 JOIN
- join 3 tables
- 하나의 table이 다른 두 table과 관계를 맺었을때
- A - B - C 이렇게 연결된 테이블에서 B를 기준으로 가져올 때
const user = User.findOne({
where: { id : 123123 },
include: [
{
model: User,
attributes: ['id', 'nick'],
as: 'Followers',
},
{
model: User,
attributes: ['id', 'nick'],
as: 'Followings',
},
],
});
select users.*, Followers.id, Followers.nick, Followings.id, Followings.nick,
from users
inner join follow as Followers on users.id = Followers.followerId
inner join follow as Followings on users.id = Followings.followingId
where users.id = 123123
시퀄라이즈 다중 중첩 JOIN
- join 3 tables
- 각 table끼리 마다 관계를 맺었을때, table의 table이 중첩해서 조인
- A - B - C 이렇게 연결된 테이블에서 A를 기준으로 가져올 때
const posts = Hashtag.findOne({
where: { title: query },
include: [
{
model: Post,
attributes: [ ... ],
// include 안의 include
include: [
{
model: User,
attributes: ['id', 'nick'],
},
],
},
],
});
// 중첩 include가 보기 안좋다고 생각하면, 다음과 같이 get모델 문법을 이용해 한번 조인을 하고, include를 쓰면 보다 가독성이 늘어난다.
const hashtag = await Hashtag.findOne({ where: { title: query } });
let posts = [];
if (hashtag) {
posts = await hashtag.getPosts({ // hashtag.getPosts() => Hashtag 와 Post 조인
include: [
{
model: User, // Post 와 User 조인
attributes: ['id', 'nick'],
},
],
}); // hastags, posts, users 삼중 조인해서 가져온다.
}
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.