매일 배운 것을 정리하며 기록합니다. Sequelize associate 공부를 했습니다.
작년 12월, 첫 번째 프로젝트에서 시퀄라이즈를 처음 사용하면서 associate를 도전했지만 실패하여 SQL문과 워크벤치를 통해 작업했던 기억이 있습니다.
이번에 새로운 프로젝트를 진행하면서 다시 한 번 도전하여 성공했습니다.
기쁜 마음으로 배운 내용과 사용법을 기록해 두려 합니다.
MySQL에서는 JOIN 기능을 통해 여러 테이블 간의 관계를 파악해 결과를 도출합니다.
시퀄라이즈는 테이블 간에 어떤 관계가 있는지 알려주면 JOIN 기능을 알아서 구현합니다.
시퀄라이즈의 1:N 관계는 hasMany, belongsTo 메서드로 표현합니다.
저는 예로 User테이블과 Post테이블로 들겠습니다.
User 테이블의 로우 하나를 불러올 때 연결된 Post 테이블의 로우들도 같이 불러올 수 있
습니다.
User 테이블이 1이고 Post 테이블이 N의 관계라면, 다음과 같은 모양을 가집니다.
User.hasMany(Post, { foreignKey: 'Post 테이블의 fk', sourceKey: 'User 테이블의 pk'})
Post.belongsTo(User, {foreignKey: 'Post 테이블의 fk', targetKey: 'User 테이블의 pk'})
1:1 관계에서는 hasMany 메서드 대신 hasOne입니다.
1:1 관계에서도 belongsTo의 위치는 중요합니다.
belongsTo를 사용하는 모델에 fk 컬럼이 추가되기 때문입니다.
Post 테이블이 belongsTo 관계라면, 다음과 같은 모양을 가집니다.
User.hasOne(Post, { foreignKey: 'Post 테이블의 fk', sourceKey: 'User 테이블의 pk'})
Post.belongsTo(User, {foreignKey: 'Post 테이블의 fk', targetKey: 'User 테이블의 pk'})
시쿼라이즈 관계 쿼리는 MySQL의 JOIN 기능입니다.
관계가 맺어져 있다면 쿼리문에 include 속성을 사용하면 됩니다.
const writer = await Post.findAll({
include: [{
model: User,
required: false,
attributes: ['name']
}]
})
어떤 모델과 관계가 있는지를 include 배열에 넣어주면 됩니다.
배열인 이유는 다양한 모델과 관계가 있을 수 있기 때문입니다.
include나 관계 쿼리 메서드에도 where, required, attributes 같은 옵션을 사용할 수 있습니다.
현재 관계 쿼리문은 Post모델의 모든 데이터를 찾을 때 User 모델과 join을 합니다.
이 때, required 옵션을 통해 left join을 하였습니다.
기본 값은 true이며 inner join입니다.
attributes를 통해 가져올 컬럼을 표시했습니다.
해당 쿼리문의 결과로는 Post모델의 데이터와 Post모델의 fk로 연결된 User모델의 name 컬럼을 가져옵니다.
Reference : 조현영, 『Node.js 교과서 』, 길벗 (2020), p324-333.