노드 시퀄라이즈 모델 만들기
//models/user.js
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;
시퀄라이즈에서의 모델이 mysql에서는 테이블이다.
class User extends~ 색칠한 부분이 모델의 명이 되겠다. 그리고 mysql에서는 User라는 테이블이다.
init에다가 컬럼들을 정의해 놓을 수 있다. 실제로 테이블을 만들때 있었던 컬럼 이름들이 들어가 있다.
기본 모양이 이렇다는 것을 확인하면 된다.
id는 시퀄라이즈에서 자동으로 넣어주기 때문에 생략이 되었다.
그리고 type에 mysql에서는 varchar였던 것이 시퀄라이즈에서는 STRING, 또 mysql에서 int였던 것이 시퀄라이즈에서는 INTEGER이라는 점을 알고 넘어가자.
super init의 첫번째 인수가 컬럼을 정의하는 것이었다면 두번째 인수는 모델에 대한 설정이다.
- timestamps: true로 설정하면 시퀄라이즈에서 자동으로 createdAt, updatedAt 같은 컬럼들을 생성해 준다. 지금 이 예제에서는 직접 만들었기 때문에 false로 설정했다.
- underscored: 이 부분은 시퀄라이즈의 글자들을 snake_case로 할지 안 할지를 정하는 설정이다. 직접 작성한 경우는 적용되지 않는다.
- paranoid : 만약에 true로 설정했다면 deletedAt까지 만들어지게 된다. DB에서는 데이터를 실제로 지우지 않고 지정한 날짜만큼 영구히 저장을 한다. 지웠다고 하면 실제로 데이터가 지워지는 것이 아니고 deletedAt부분이 true로 바뀌고 다음부터는 해당 데이터가 지워졌다고 판단되는 것이다. 이것을 soft delete라고 한다. hard delete는 데이터를 진짜로 삭제하는 것을 말한다.
- modelName : 모델 명
- tableName : 시퀄라이즈에서는 모델명을 복수로 만들어서 테이블 명을 설정한다.
- charset 과 collate 는 테이블 만들때 설정한 옵션이다. 8mb4 하면 이모티콘까지 사용할 수 있다.
여기까지 설정을 했으면 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')[env];
const db = {};
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = User;
db.Comment = Comment;
User.initiate(sequelize);
Comment.initiate(sequelize);
module.exports = db;
단순히 require를 통해서 User 와 Comment를 불러왔다.
그리고 User.init Comment.init을 하는데 여기서 sequelize는 연결 객체이다.
models/user.js
즉, User.init 을 통해 테이블과 모델과 시퀄라이저를 연결한 것이다. model과 mysql을 연결한 것이다.
Comment.init도 마찬가지다.
일단 Comment.js를 생성하고 index.js에 모델과 연결을 한다. 그리고 associate로 관계를 설정해 놓자.
//models/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')[env];
const db = {}
const sequelize = new Sequelize(config.database, config.username, config.password, config);
db.sequelize = sequelize;
db.Sequelize = Sequelize;
db.User = User;
db.Comment = Comment;
User.initiate(sequelize);
Comment.initiate(sequelize);
User.associate(db);
Comment.associate(db);
module.exports = db;
associate는 여기서 확인
https://kmryu807.tistory.com/98
노드 테이블 관계 이해하기
관계 정의하기 users 모델과 comments 모델 간의 관계를 정의 1 : N 관계 (사용자 한 명이 댓글 여러 개 작성) 시퀄라이즈에서는 1 : N 관계를 hasMany로 표현(사용자.hasMany(댓글)) 반대의 입장에서는 belongs
kmryu807.tistory.com