const Sequelize = require('sequelize');
class User extends Sequelize.Model {
static initiate(sequelize) {
User.init({
name: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true,
},
age: {
type: Sequelize.INTEGER.UNSIGNED,
allowNull: false,
},
married: {
type: Sequelize.BOOLEAN,
allowNull: false,
},
comment: {
type: Sequelize.TEXT,
allowNull: true,
},
created_at: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
},
}, {
sequelize,
timestamps: false,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: false,
charset: 'utf8',
collate: 'utf8_general_ci',
});
}
static associate(db) {
db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
}
};
module.exports = User;
1. Sequelize 모델 정의
- Sequelize.Model을 확장한 클래스로 Sequelize.Model을 상속받아 모델을 정의
- 모델은 static init 메서드와 static associate 메서드로 구성
- init 메서드: 테이블 컬럼 및 테이블 설정을 정의
- associate 메서드: 다른 모델과의 관계를 설정
해당 내용은 위의 코드에서 static initiate 내의 모델.init() 와 static associate(db) 에 해당한다.
- init 메서드는 두 가지 매개변수를 받는다.
- 첫 번째 매개변수: 테이블 컬럼에 대한 설정
- 각 컬럼은 Sequelize의 자료형을 사용하여 정의
- 예: STRING(100), INTEGER, BOOLEAN, DATE, INTEGER.UNSIGNED 등.
name: {
type: Sequelize.STRING(20),
allowNull: false,
unique: true,
},
age: {
type: Sequelize.INTEGER.UNSIGNED,
allowNull: false,
},
married: {
type: Sequelize.BOOLEAN,
allowNull: false,
},
comment: {
type: Sequelize.TEXT,
allowNull: true,
},
created_at: {
type: Sequelize.DATE,
allowNull: false,
defaultValue: Sequelize.NOW,
}
위의 코드에서 User.Init 내의 해당 부분이다.
- 두 번째 매개변수: 테이블 자체에 대한 설정
- sequelize: DB 연결 객체를 지정
- timestamps: true로 설정 시 자동으로 createdAt과 updatedAt 컬럼을 추가. (예제에서는 false로 설정할 수 있음)
- underscored: 컬럼명과 테이블명을 스네이크 케이스로 설정.
- modelName: 모델의 이름을 지정
- tableName: 실제 테이블 이름을 지정. 기본적으로는 모델 이름을 소문자 복수형으로 사용
- paranoid: true로 설정 시 deletedAt 컬럼을 추가하여, 삭제된 데이터도 복구 가능.
- charset과 collate: 데이터베이스의 문자셋과 정렬 설정. 한글을 포함하려면 utf8 또는 utf8mb4 설정이 필요함.
{
sequelize,
timestamps: false,
underscored: false,
modelName: 'User',
tableName: 'users',
paranoid: false,
charset: 'utf8',
collate: 'utf8_general_ci',
}
위의 코드에서 User.init() 의 두 번째 부분이다.
3. 정의된 모델 실행하기
const Sequelize = require('sequelize');
const User = require('./user');
const Comment = require('./comment');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config')[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.User = User;
db.Comment = Comment;
User.initiate(sequelize);
Comment.initiate(sequelize);
User.associate(db);
Comment.associate(db);
module.exports = db;
위의 코드는 index.js 에 작성되었다.
모델에 정의된 user.js와 comment.js 를 require 해서 가져온 뒤,
db.User = user;
db.Comment = Comment;
로 명시적 할당을 하여 속성을 구성한다.
User.initiate(sequelize);
Comment.initiate(sequelize);
이후 각 모델 파일에서 작성된 initiate(sequelize)를 호출하여 각 테이블 컬럼과 테이블 속성을 정의한다.
User.associate(db);
Comment.associate(db);
마지막으로 각 모델 파일에서 작성된 static associate(db) 를 호출하여 테이블간 관계를 설정한다.
4. Sequelize 자료형과 MySQL 자료형의 차이 비교
MySQL 자료형 | Sequelize 자료형 | 옵션 / 설명 |
VARCHAR(100) | STRING(100) | 문자열, 길이 제한 |
TEXT | TEXT | 문자열, 길이 제한 없음 |
INT | INTEGER | 정수형 |
TINYINT | BOOLEAN | 불리언 값 (0 또는 1) |
DATETIME | DATE | 날짜 (시간 포함) |
DATE | DATEONLY | 날짜 (시간 X) |
INT UNSIGNED | INTEGER.UNSIGNED | 부호없는 정수형 |
NOT NULL | allowNull: false | NULL 허용하지 않음 (필수 조건) |
UNIQUE | unique: true | 유일한 값만 허용 |
DEFAULT NOW() | defaultValue: Sequelize.NOW | 기본값으로 현재 시간 설정 |
'Node.js' 카테고리의 다른 글
데이터베이스 - Sequelize 쿼리 정리 (0) | 2025.01.17 |
---|---|
데이터베이스 - 테이블 관계 (0) | 2025.01.17 |
데이터베이스 - 시퀄라이즈 ORM 설정 (1) | 2025.01.17 |
데이터베이스 - MySQL CRUD 작업하기 (0) | 2025.01.16 |
데이터베이스 - MySQL 테이블 생성 (0) | 2025.01.16 |