관련글 1 : [Typescript Express] Sequelize로 MySQL 연결하기
관련글 2 : [TypeScript Express] Sequelize로 MySQL 기본 모델 생성하기
[01 Association이란? ]
- Sequelize의 Association은 관계형 데이터베이스의 JOIN과 같이 관계성을 갖는 데이터 사이의 처리를 위해 사용된다.
- 단순하게 말하면 다른 모델의 컬럼을 외래키로 설정하고 싶을 때 사용하는 설정이다.
- 관계의 종류로는 1:1, 1:N, N:M이 있는데 보통 1:N을 가장 많이 사용한다고 한다.
(1) 설정 방법
- 구글링하며 공부한 결과 Association을 설정하는 방법은 크게 두 가지로 나뉘는 듯 했다.
- 첫째, 모델을 생성한 뒤 객체에 associate 속성을 함수로 정의하기
module.exports = (sequelize, DataTypes) => {
var post = sequelize.define('post', {
title: {
type: DataTypes.STRING,
allowNull: false,
},
writer: {
type: DataTypes.STRING,
allowNull: false,
}
});
post.associate = function (models) {
post.hasMany(models.reply);
};
return post;
};
- 둘째, 모델을 생성한 뒤 두 모델의 association 관계를 각각 정의해주기
- 나는 아래 방법이 더 편해보여서 이 방법을 채택했다. 공식문서에도 이 방법이 잘 나와있었다.
const User = sequelize.define('user', {
username: DataTypes.STRING,
points: DataTypes.INTEGER
}, { timestamps: false });
const Profile = sequelize.define('profile', {
name: DataTypes.STRING
}, { timestamps: false });
User.belongsToMany(Profile, { through: 'User_Profiles' });
Profile.belongsToMany(User, { through: 'User_Profiles' });
[02 Sequelize Association ]
- 먼저 시작하기에 앞서 아래 3가지 관계의 차이와 어떤 상황에서 사용하는지를 확실하게 알고 있어야 한다. (참고)
- 나와 팀원은 마음이 급해 그냥 ERD 설계부터 들어갔는데 역시나 코드를 짜면서 계속 "모델간의 관계를 잘못 생각" + "Sequelize로 Association 구현 문제"로 모델을 잘못 생성해놔서 고생했다😅
(1) 1:1 관계
- 1:1 관계란 어느 엔티티 쪽에서 상대 엔티티와 반드시 단 하나의 관계를 가지는 것을 말한다.
- hasOne과 belongsTo를 사용해서 설정한다.
User.hasOne(Profile)
Profile.belongsTo(User)
(2) 1:N 관계
- 1:N 관계는 한 쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것을 의미한다.
- 1:N 관계는 N:M 관계처럼 새로운 테이블을 만들지 않는다.
- hasMany와 belongsTo를 사용해서 설정한다.
Team.hasMany(Player)
Player.belongsTo(Team)
(3) N:M 관계
- N:M 관계는 관계를 가진 양쪽 엔티티 모두에서 1:N 관계를 가지는 것을 말한다. 즉, 서로가 서로를 1:N 관계로 보고 있는 것이다.
- N:M 관계는 서로가 서로를 1:N 관계, 1:M 관계로 갖고 있기 때문에, 서로의 PK를 자신의 외래키 컬럼으로 갖고 있으면 된다.
- 일반적으로 N:M 관계는 두 테이블의 대표키를 컬럼으로 갖는 또 다른 테이블을 생성해서 관리한다.
- belongsToMany를 사용해서 설정한다.
Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});
'엘리스 AI트랙 4기 > 프로젝트' 카테고리의 다른 글
Sequelize에서 where문에 연산자(Operator) 사용하기 (0) | 2022.06.17 |
---|---|
[TypeScript Express] Sequelize 외래키로 참조 테이블 데이터 검색하기 (0) | 2022.06.16 |
[TypeScript Express] Sequelize로 MySQL 기본 모델 생성하기 (0) | 2022.06.14 |
[TypeScript Express] 라우터, 컨트롤러, 미들웨어 분리 (0) | 2022.06.10 |
[Typescript Express] 로그인 로직에 JWT Token Middleware 적용하기 (0) | 2022.06.09 |