엘리스 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'});