TIL : 210729_목_(association)

beablessing·2021년 7월 29일
0

TIL

목록 보기
29/33
post-thumbnail

오늘 배운 내용

  • sequalize사용해서 Association 해보기

association과정

  • 시퀄라이즈로 테이블 생성하기 (명령어)
    -> 이때 마이그레이션 파일도 함께 생성됨
    -> 마이그레이션 실행하기 (명령어)
    -> 이 과정까지 마쳐야 테이블 생성이 완료.
    -> 이때 생성된 테이블은 FK가 존재하지 않음
  • 모델에서 각각의 관계를 설정해줌 (1:1, 1:N, N:N)

모델1과 모델2가 1:N의 관계를 가진다면?
hasMany / belongsTo

모델1
const {
  Model
} = require('sequelize');

module.exports = (sequelize, DataTypes) => {
  class 모델1 extends Model {
    static associate(models) {
      // define association here
       models.모델1.hasMany(models.모델2);
    }
  };
모델2
 
'use strict';
const {
  Model
} = require('sequelize');

module.exports = (sequelize, DataTypes) => {
	class 모델2 extends Model {
		 static associate(models){
         //define association here 
           models.모델2.belongsTo(models.모델1); 
         
         };
}
또는 각 모델의 파일에 나눠서 지정하지않고, 한번에 관계를 지정해줄 수 있다
const { 모델1, 모델2 } = sequelize.models ;
//여기서 models는 모델들이 모여있는 폴더를 말함 . 구조분해
모델2.belongsTo(모델1);
모델1.hasMany(모델2); 

1:N에서 1에 해당하는 모델에hasMany를 붙여준다.

  • 모델과 해당 스키마(마이그레이션 폴더에 있음)가 일치하는지 확인
    대부분 일치함.

  • 빈 스켈레톤 파일을 생성
    npx sequelize-cli migration:generate --name migration-skeleton
    예시)
    npx sequelize-cli migration:generate --name add-column-postId
    "migration-skeleton"부분에 이름을 만들어주면 되는데,
    일반적으로 새롭게 생성할 컬럼명을 써주는것 같다. ex) postId

  • 해당 마이그레이션 스켈레톤 파일에서 컬럼추가 및 FK를 설정한다.

스켈레톤 파일 예시
module.exports = {
  up: (queryInterface, Sequelize) => {
    // logic for transforming into the new state
    //여기서 이전에 관계를 설정해준 모델 관련 fk설정을 진행 
    //1.칼럼추가 
    //2. fk설정 
  },
  down: (queryInterface, Sequelize) => {
    // logic for reverting the changes
    // migration undo를 했을때, 일어나는 일들 진행
    //1. fk설정 삭제 
    //2. 컬럼삭제 
  }
}
모델1,2에 대한 fk설정예시 (비동기코드로 진행)

addColumn/addConstraint
removeConstraint/removeColumn

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    // field 추가
    await queryInterface.addColumn('모델2테이블명', '새로생성할컬럼', Sequelize.INTEGER);

    // foreign key 연결
    await queryInterface.addConstraint('모델2테이블명', {
      fields: ['새로생성할컬럼명'],
      type: 'foreign key',//fk설정
      name: 'FK_any_name_you_want',
      references: {
        table: '모델1테이블명',
        field: 'id'
      },  //모델1테이블의 id값을 참조하겠다. (모델1이 1:N중 1)
      onDelete: 'cascade',
      onUpdate: 'cascade'
    });

  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeConstraint('모델2테이블명', 'FK_any_name_you_want');
    await queryInterface.removeColumn('모델2테이블명', '새로생성한컬럼명');
  }
};

포인트

  • 시퀄라이즈는 프로미스기반
  • association을 해줄때, 다양한 방법이 존재하지만
    각각 모델들에 관계를 지정한후(fk를 여기서 손대지 않음),
    마이그레이션파일에가서 칼럼을 생성하고 fk를 지정해주는것이 가장 깔끔

profile
프론트엔드 개발자

0개의 댓글