엘리스 AI트랙 4기/프로젝트
[TypeScript Express] Sequelize로 MySQL 모델 Association 관계 설정하기
남쪽마을밤송이
2022. 6. 15. 03:10
관련글 1 : [Typescript Express] Sequelize로 MySQL 연결하기
[Typescript Express] Sequelize로 MySQL 연결하기
[01 Typescript란? ] TypeScript는 JavaScript 기반의 언어이다. JavaScript는 클라이언트 측 스크립팅 언어지만 TypeScript는 객체 지향 컴파일 언어이다. TypeScript는 JavaScript의 상위 집합으로 JavaScrip..
s0n9h2.tistory.com
관련글 2 : [TypeScript Express] Sequelize로 MySQL 기본 모델 생성하기
[TypeScript Express] Sequelize로 MySQL 기본 모델 생성하기
관련글 : [Typescript Express] Sequelize로 MySQL 연결하기 [01 model 생성하기 ] MongoDB와의 차이점은 일단 schema 폴더를 사용하지 않고 model을 정의하는 파일에서 생성도 같이하는게 더 편하다는 것이..
s0n9h2.tistory.com
[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'});