시퀄라이즈는 프로미스 기반의 node.js
ORM
이다. Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server를 지원한다.
ℹ️ ORM: Object-relation mapping : 객체와 관계형DB의 데이터를 매핑해주는것
mysql과 매핑하는 것을 예로 함.
# mysql2 : mysql과 연결을 위해 필요한 패키지
# sequelize-cli: commandline for sequelize
# sequelize: RDB와 매핑되도록 해주는 ORM 패키지
npm i sequelize sequelize-cli mysql2
# sequelize 명령어 확인
npx sequelize -h
# initialize for project
npx sequelize init
처음 npx sequelize init
을 하면 config폴더와 config.json
이 생성되는데, config.js
로 변경후 dotenv
와 함께 연결스트링에 필요한 정보를 구현한다.
아래는 예시
//config.js 예
require('dotenv').config()
module.exports = {
development: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: 'mysql'
},
test: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: 'mysql'
},
production: {
username: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB,
host: process.env.DB_HOST,
port: process.env.DB_PORT,
dialect: 'mysql',
logging: false //터미널을 통해 쿼리가 로깅되는 것을 막는다.
}
}
// index.js
const env = process.env.NODE_ENV || 'development'
const Sequelize = require('sequelize')
const post = require('./post')
const image = require('./image')
const user = require('./user')
const userdetails = require('./userdetails')
const series = require('./series')
const config = require('../config/config')[env]
const db = {}
const sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
)
db.Post = post
db.User = user
db.Image = image
db.Series = series
db.UserDetail = userdetails
Object.keys(db).forEach((modelName) => {
db[modelName].init(sequelize)
})
Object.keys(db).forEach((modelName) => {
if (db[modelName].associate) {
db[modelName].associate(db)
}
})
db.sequelize = sequelize
db.Sequelize = Sequelize
module.exports = db
const DataTypes = require('sequelize')
const { Model } = DataTypes
module.exports = class Post extends Model {
static init(sequelize) {
return super.init(
{
title: {
type: DataTypes.STRING(100),
allowNull: true
},
content: {
type: DataTypes.TEXT,
allowNull: true
},
postKey: {
type: DataTypes.STRING(100),
allowNull: false,
unique: true
},
markdown: {
type: DataTypes.TEXT,
allowNull: true
},
isTemp: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
},
tempTitle: {
type: DataTypes.STRING(100),
allowNull: true
},
tempContent: {
type: DataTypes.TEXT,
allowNull: true
},
tempMarkdown: {
type: DataTypes.TEXT,
allowNull: true
},
isUse: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: true
},
isDeleted: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false
},
scope: {
type: DataTypes.STRING(1),
allowNull: false,
defaultValue: 'A'
},
summary: {
type: DataTypes.STRING(150),
allowNull: true
},
series: {
type: DataTypes.STRING(20),
allowNull: true
},
thumbnail: {
type: DataTypes.STRING(200),
allowNull: true
}
},
{
modelName: 'Post',
tableName: 'posts',
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci',
sequelize
}
)
}
static associate(db) {
db.Post.belongsTo(db.User, {
onUpdate: 'CASCADE',
onDelete: 'CASCADE',
foreignKey: 'userId',
targetKey: 'id'
})
db.Post.hasMany(db.Image, {
foreignKey: 'postId',
sourceKey: 'id'
})
db.Post.belongsToMany(db.User, {
as: 'Liker',
through: 'likes'
})
}
}
// app.js
...
const db = require('./models')
db.sequelize
.sync()
.then(() => {
console.log('✅ db connected')
})
.catch((e) => {
console.error(e)
})