Sequelize, 관계 정의하기

2020. 12. 20. 23:52BACKEND/Node

반응형

안녕하세요❗️ 

오늘은 시퀄라이즈를 사용할 때 가장 어려움을 겪는 관계 정의에 대해 알아보겠습니다.

 

 

*****************  INDEX  *****************

 

1부

ORM ❓ 

 

2부

Sequelize Model

 

3부

Use Sequelize

 

******************************************** 

 


오늘 다룰 내용은 sequelize를 사용해서 모델의 관계에 대해 정의할텐데요.

그래서, 관계에 대한 내용의 이해가 없으면 내용을 이해하기 어렵습니다.

Contraint에 대한 포스팅ERD에 대한 소개글 을 참고하시는 것도 추천해드립니다.

 

 

🖍 One-to-One

가장 먼저 1:1 관계를 정의하는 방법에 대해 알아보도록 하겠습니다.

먼저 예시로 User과 Profile 모델을 들어 보겠습니다.

 

 

 

위의 관계를 만들어볼 예정입니다.

모델 정의는 생략하겠습니다.

 

User.hasOne(Profile)
Profile.belongsTo(User)

 

User은 Profile을 하나 가질 수 (hasOne) 있다를 정의하고, 

Profile은 User에 대해 속한다를 정의하고 있습니다.

 

여기서 하나 의문점은 어떤 모델에 hasOne을 붙이고 어떤 모델에 belongsTo를 붙이는 지입니다.

 

원본(Source - 부모 테이블)으로 사용할 것이 User이기 때문에 hasOne을 붙인 것이고,

타겟(Target - 자식 테이블)으로 사용할 것이 Profile이기 때문에 belongsTo를 붙인 것입니다. 

 

 

위의 코드를 입력하면 아래와 같은 코드가 실행됩니다.

 

CREATE TABLE IF NOT EXISTS "users" (
  /* ... */
);
CREATE TABLE IF NOT EXISTS "profiles" (
  /* ... */
  "users" INTEGER REFERENCES "profiles" ("id") ON DELETE SET NULL ON UPDATE CASCADE
  /* ... */
);

 

그럼 아래와 같이 source model의 이름을 딴 id가 생성됩니다.

(만약, foreign key가 있다면 생성되지 않습니다.) 

 

 

 

✔️ ON DELETE/ON UPDATE

만약,  ON DELETE와 ON UPDATE를 설정하고 싶다면 아래와 같이 설정할 수 있습니다. 

 

User.hasOne(Profile, {
  onDelete: 'CASCADE',
  onUpdate: 'CASCADE'
});
Profile.belongsTo(User);

 

✔️ Foreign Key

혹은, 외래키의 이름을 다르게 설정하고 싶을 수도 있겠죠❓ 

foreign key를 option으로 부모 혹은 자식 테이블에 정의하면 됩니다.

아래를 참조해봅시다.

 

// source에 option을 둔 경우
User.hasOne(Profile, {
  foreignKey: 'user_id'
});
Profile.belongsTo(User);

// target에 option을 둔 경우
User.hasOne(Profile, {
  foreignKey: 'user_id'
});
Profile.belongsTo(User);

/*
{
  foreignKey: 'user_id' 
}
은 
{ 
  foreignKey: {
	name : 'user_id' 
}
과 동일하며, 축약된 버전입니다.
*/

 

위와 같이 설정하면 아래와 같은 모습을 보입니다.

 

 

 

 

 

📌  One-to-Many

1:N 관계는 1:1과 다를게 없습니다.

다만, 조금 다른 점은 source와 target의 구별이 분명해야합니다.

 

 

위와 같은 관계를 정의하기 위해서는 아래와 같은 코드를 작성하면 됩니다.

 

Team.hasMany(Player)
Player.belongsTo(Team)

 

Team은 여러 Player를 가질 수 있고, 여러 Player는 한 Team에 속할 수 있습니다.

 

 

 

 

 

🥁  Many-To-Many

N:M 관계는 위의 방식과는 조금 다릅니다.

 

Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});

 

위와 같이 belongsToMany 메소드를 사용해서 연결을 시킵니다.

through를 사용해서 중간 테이블을 명시해줍니다.

만약, 이미 제작해둔 중간 테이블이 있다면 through에 medel 객체를 넣어줍니다.

 

 

 

 

만약, User 테이블과 Project 테이블을 연결 시킬 때의 몇가지 setting을 확인해볼게요.

 

데이터베이스 테이블에서 테이블을 조회할 때 객체 이름을 설정하고 싶다면, 

as 옵션으로 상대 테이블의 이름을 지정할 수 있습니다.

또, foreignKey옵션을 통해 외래키 이름을 지정할 수도 있습니다.

 

User.belongsToMany(Project, { as: 'Tasks', through: 'worker_tasks', foreignKey: 'userId' })
Project.belongsToMany(User, { as: 'Workers', through: 'worker_tasks', foreignKey: 'projectId' })

 

 

그럼 지금까지 간단하게 sequelize 관계 연결에 대해 알아보았습니다.

나중에 생각나면 더 보충해 나아갈 예정입니다 〰️ 

반응형