Migration이란?
Migration은 DB 테이블 생성, 삭제, 수정을 수행한다.
Migration 파일은 테이블의 구조와 필드 등을 정의하고 이를 통해 Sequelize가 DB를 관리할 수 있다.
Sequelize에서 Migration 파일은 up, down 함수를 가지고 있다.
up 함수는 새로운 변경을 적용하고 down 함수는 변경을 취소한다.
Migration 파일은 버전 관리가 가능하며 변경 이력을 추적할 수 있다.
예시 코드
'use strict';
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.createTable('users', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
name: {
type: Sequelize.STRING
},
age: {
type: Sequelize.INTEGER
},
email: {
type: Sequelize.STRING
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
}
});
},
down: async (queryInterface, Sequelize) => {
await queryInterface.dropTable('users');
}
};
users 테이블을 생성하는 Migration 파일이다.
up 함수에서 queryInterface.createTable() 메소드를 사용하여 users 테이블을 생성하고,
down 함수에서는 queryInterface.dropTable() 메소드를 사용하여 users 테이블을 삭제한다.
Model이란?
Sequelize에서 사용하는 DB 테이블과 1:1 매핑되는 JavaScript 클래스이다.
Model은 DB 테이블과 상호작용하며 데이터를 읽고 쓰는데 사용된다.
Model은 Migration 파일과 함께 사용되며,
Migration 파일에서 테이블 구조를 변경할 때 Model에도 동일하게 적용해야 한다.
예시 코드
'use strict';
const { Model } = require('sequelize');
module.exports = (sequelize, DataTypes) => {
class User extends Model {
static associate(models) {
// User 모델과 Post 모델 사이의 1:N 관계 설정
User.hasMany(models.Post, {
foreignKey: 'userId',
as: 'posts',
});
}
};
User.init({
name: DataTypes.STRING,
age: DataTypes.INTEGER,
email: DataTypes.STRING
}, {
sequelize,
modelName: 'User',
});
return User;
};
Migration 예시 코드의 users 테이블과 매핑되는 User 모델이다.
User 모델은 sequelize.define() 메소드를 사용하여 정의되며, 모델의 필드는 init 함수 내에서 정의된다.
또한 User 모델은 static associate 메소드를 사용하여 다른 모델과의 관계를 설정할 수 있다.
위의 예시에서는 User 모델과 Post 모델 사이의 1:N 관계를 설정했다.
Model의 관계 설정
static associate() 메소드를 이용한다.
예시 코드
// User 모델 클래스
class User extends Model {
static associate(models) {
// User 모델과 Post 모델 사이의 1:N 관계 설정
User.hasMany(models.Post, {
foreignKey: 'userId',
as: 'posts',
});
}
};
// Post 모델 클래스
class Post extends Model {
static associate(models) {
// Post 모델과 User 모델 사이의 N:1 관계 설정
Post.belongsTo(models.User, {
foreignKey: 'userId',
as: 'user',
});
}
};
- User 모델과 Post 모델의 1:N 관계 설정
hasMany() 메소드를 사용하고 foreignKey 옵션은 Post 모델의 userId 필드가 User 모델의 id 필드를 참조하도록하고 as 옵션은 관계 이름을 설정한다. 1:1 관계를 설정할 때는 hasOne() 메소드를 사용한다. - Post 모델과 User 모델의 N:1 관계 설정
belongsTo() 메소드를 사용하고 foreignKey 옵션은 Post 모델의 userId 필드가 User 모델의 id 필드를 참조하도록하고 as 옵션은 관계 이름을 설정한다.
그렇다면 DB의 구조가 변경 되었을 때는 어떤 과정을 거쳐야할까?
- Migration 파일을 수정하고 Sequelize CLI를 통해 변경된 내용을 DB에 적용한다.
- 변경된 내용을 Model 파일에도 반영한다.
- 변경된 내용이 잘 수정되었는지 코드를 테스트한다.
간단 정리
migration 파일 생성 > migration 파일 수정(변경 내용 반영) > migration 파일 실행(변경내용 DB 적용) > Model 파일 수정
> 테스트
'Development > TIL' 카테고리의 다른 글
Thunder Client (0) | 2023.04.28 |
---|---|
MongoDB와 MySQL (0) | 2023.04.27 |
Sequelize (0) | 2023.04.25 |
JsonWebToken (0) | 2023.04.23 |
내가 만든 Cookie (0) | 2023.04.21 |