모델 정의하기
이제 MySQL에서 정의한 테이블을 시퀄라이즈에서도 정의해야 합니다. MySQL의 테이블을 시퀄라이즈의 모델과 대응합니다. 시퀄라이즈는 모델과 MySQL의 테이블을 연결해주는 역할을 합니다. User와 Comment 모델을 만들어 users 테이블과 comments 테이블에 연결해봅시다. 시퀄라이즈는 기본적으로 모델 이름은 단수형으로, 테이블 이름은 복수형으로 사용합니다.
models/user.js
const Sequelize = require("sequelize");
module.exports = class User extends Sequelize.Model {
static init(sequelize) {
return super.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) {}
};
module.exports = User;
User 모델을 만들고 모듈로 exports했습니다. User 모델은 Sequelize.Model을 확장한 클래스로 선언합니다. 클래스 문법을 사용하지만 클래스에 대한 지식이 없어도 사용할 수 있습니다. 패턴만 숙지하면 됩니다. 모델은 크게 static initiate 메서드와 static associate 메서드로 나뉘어집니다.
static initiate 메서드에는 테이블에 대한 설정을 하고, static associate 메서드에는 다른 모델과의 관계를 적습니다. static initiate 메서드부터 살펴봅시다. 모델.init 메서드의 첫 번째 인수가 테이블 컬럼에 대한 설정이고, 두 번째 인수가 테이블 자체에 대한 설정입니다.
시퀄라이즈는 알아서 id를 기본 키로 연결하므로 id 컬럼은 적어줄 필요가 없습니다. 나머지 컬럼의 스펙을 입력합니다. MySQL 테이블과 컬럼 내용이 일치해야 정확하게 대응됩니다.
단, 시퀄라이즈의 자료형은 MySQL의 자료형과는 조금 다릅니다. 시퀄라이즈는 MySQL 외의 다른 데이터베이스도 처리할 수 있어야 하므로 MySQL의 자료형과는 다를 수밖에 없습니다. VARCHAR는 STRING으로, INT는 INTEGER로, TINYINT는 BOOLEAN으로, DATETIME은 DATE로 적습니다. INTEGER.UNSIGNED는 UNSIGNED 옵션이 적용된 INT를 의미합니다. 여기에 ZEROFILL 옵션도 사용하고 싶다면 INTEGER.UNSIGNED.ZEROFILL을 적습니다.
allowNull은 NOT NULL 옵션과 동일합니다. unique는 UNIQUE 옵션입니다. defaultValue는 기본값(DEFAULT)을 의미합니다. Sequelize.NOW로 현재 시간을 기본값으로 사용할 수 있습니다. SQL의 now()와 같습니다.
MySQL과 시퀄라이즈의 비교
| MySQL | 시퀄라이즈 |
| VARCHAR(100) | STRING |
| INT | INTEGER |
| TINYINT | BOOLEAN |
| DATETIME | DATE |
| INT UNSIGNED | INTEGER.UNSIGED |
| NOT NULL | allowNull: false |
| UNIQUE | unique: true |
| DEFAULT now() | defaultValue: Sequlize.NOW |
모델.init 메서드의 두 번째 인수는 테이블 옵션입니다.
- sequelize: static initiate 메서드의 매개변수와 연결되는 옵션으로 db.sequelize 객체를 넣어야 합니다. 나중에 model/index.js에서 연결합니다.
- timestamps: 현재 값이 false로 되어 있습니다. timestamps 속성이 true이면 시퀄라이즈는 createdAt과 updatedAt 컬럼을 추가합니다. 각각 로우가 생성될 때와 수정될 때의 시간이 자동으로 입력됩니다. 하지만 예제에서는 직접 created_at 컬럼을 만들었으므로 timestamps 속성이 필요하지 않습니다. 따라서 속성값을 false로 해서 자동으로 날짜 컬럼을 추가하는 기능을 해제했습니다.
- underscored: 시퀄라이즈는 기본적으로 테이블명과 컬럼명을 캐멀 케이스(camel case)(예시: createdAt)로 만듭니다. 이를 스네이크 케이스(snake case)(예시: created_at)로 바꾸는 옵션입니다.
- modelName: 모델 이름을 설정할 수 있습니다. 노드 프로젝트에서 사용합니다.
- tableName: 실제 데이터베이스의 테이블 이름이 됩니다. 기본적으로는 모델 이름을 소문자 및 복수형으로 만듭니다. 모델 이름이 User라면 테이블 이름은 users가 됩니다.
- paranoid: true로 설정하면 deletedAt이라는 컬럼이 생깁니다. 로우를 삭제할 때 완전히 지워지지 않고 deletedAt에 지운 시각이 기록됩니다. 로우를 조회하는 명령을 내렸을 때는 deletedAt의 값이 null인 로우(삭제되지 않았다는 뜻)를 조회합니다. 이렇게 하는 이유는 나중에 로우를 복원하기 위해서입니다. 로우를 복원해야 하는 상황이 생길 것 같다면 미리 true로 설정해두세요.
- charset과 collate: 각각 utf8과 utf8_general_ci로 설정해야 한글이 입력됩니다. 이모티콘까지 입력할 수 있게 하고 싶다면 utf8mb4와 utf8mb4_general_ci를 입력합니다.
Comment 모델도 만들어봅시다.
const Sequlize = require("sequelize");
module.exports = class Comment extends Sequlize.Model {
static int(sequelize) {
return super.init(
{
comment: {
type: Sequlize.STRING(100),
allowNull: false,
},
created_at: {
type: Sequlize.DATE,
allowNull: true,
defaultValue: Sequlize.NOW,
},
},
{
sequelize,
timestamps: false,
modelName: "Comment",
tableName: "comments",
paranoid: false,
charset: "utf8mb4",
collate: "utf8mb4_general_ci",
}
);
}
static associate(db) {}
};
module.exports = Comment;
이미 눈치챘을지도 모르지만, Comment 모델이 조금 이상합니다. users 테이블과 연결된 commenter 컬럼이 없습니다. 이 부분은 모델을 정의할 때 넣어도 되지만, 시퀄라이즈 자체에서 관계를 따로 정의할 수 있습니다. 이에 대해서는 조금 뒤에 알아봅니다. 모델을 생성했다면 models/index.js와 연결합니다.
modules/index.js
const Sequelize = require("sequelize");
const User = require("./user");
const Comment = require("./comment");
const env = process.env.NODE_ENV || "development";
const config = require("../config/config.json")[env];
const db = {};
const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
db.sequelize = sequelize;
db.User = User;
db.Comment = Comment;
User.init(sequelize);
Comment.init(sequelize);
User.associate(db);
Comment.associate(db);
module.exports = db;
db라는 객체에 User와 Comment 모델을 담아뒀습니다. 앞으로 db 객체를 require해서 User와 Comment 모델에 접근할 수 있습니다. User.initiate와 Comment.initiate는 각각의 모델의 static initiate 메서드를 호출하는 것입니다. 모델.init이 실행되어야 테이블이 모델로 연결됩니다. 다른 테이블과의 관계를 연결하는 static associate 메서드도 미리 실행해둡니다.
'프로그래밍 언어 > NODE JS' 카테고리의 다른 글
| 쿼리 알아보기 (0) | 2025.09.05 |
|---|---|
| 관계 정의하기 (1) | 2025.08.30 |
| MySQL 연결하기 (0) | 2025.08.24 |
| 시퀄라이즈 사용하기 (0) | 2025.08.21 |
| CRUD 작업하기 (1) | 2025.08.18 |