우선 사용할 DB를 정해준다. 나같은 경우는 mySQL을 사용하였다.
이후에 sequeilze 모듈을 설치하고 초기 설정을 해준다.
npm i sequelize sequelize-cli // 모듈 설치
npm i mysql // mysql 모듈도 설치해야 함
npx sequeilze init // DB의 초기 설정을 해줌. config, models, migartion, seeders 폴더가 자동생성됨
npx를 하면 여러 폴더들이 생성될 것이다. 우리는 초기 설정을 위해 config와 models를 살펴볼 것이다.
{ // config 파일
"development": {
"username": "root",
"password": "root", // 비밀번호를 꼭 바꿔주어야 한다.
"database": "nodetest", // 다룰 DB의 이름을 적어준다.
"host": "127.0.0.1",
"dialect": "mysql" // 사용하는 DB를 적어준다.
},
"test": {
"username": "root",
"password": null,
"database": "database_test",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": null,
"database": "database_production",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
config에서는 development만 수정해주면 된다. 각각의 환경에서 사용할 db를 나누어 놓은 것 같은데, 우선 맨 위에만 수정해주자.
// models의 index파일
"use strict";
const Sequelize = require("sequelize");
const User = require("./user");
const Post = require("./post");
const env = process.env.NODE_ENV || "development";
const config = require(__dirname + "/../config/config.json")[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
}
db.sequelize = sequelize;
db.User = User;
db.Post = Post;
User.init(sequelize);
Post.init(sequelize); // 각 DB마다 설정해주자.
User.associate(db);
Post.associate(db); // 각 DB들의 관계가 설정되면 꼭 써주어야 한다.
module.exports = db;
models 디렉토리는 DB들의 초기 모델링이다. (SQL문의 CREATE와 유사)
그 중에서도 index.js는 그 DB들을 묶어주는 역할을 하는 것 같다.
const Sequelize = require("sequelize");
module.exports = class Post extends Sequelize.Model {
static init(sequelize) {
return super.init(
{
message: {
type: Sequelize.STRING(100),
allowNull: false,
},
uploadDate: {
type: Sequelize.DATEONLY,
allowNull: false,
},
},
{
sequelize,
timestamps: true,
modelName: "Post",
tableName: "Posts",
paranoid: false,
charset: "utf8mb4",
collate: "utf8mb4_general_ci",
}
);
}
static associate(db) {
db.Post.belongsTo(db.User, { foreignKey: "userId", targetKey: "id" });
} // 관계 설정. belongsTo는 외래키를 받는 입장, hasMany는 기본키를 주는 입장, hasOne은 1대1 관계를 뜻함.
// 1대1관계는 비교적 부모 테이블일 것 같은 테이블에게 sourceKey를 부여해준다.
};
이후에 app.js(메인 스크립트)에 다음을 추가해준다.
const { sequelize } = require("./models");
// model들을 받아옴
sequelize
.sync({ force: false })
.then(() => {
console.log("데이터베이스 연결 성공");
})
.catch((err) => {
console.error(err);
});
// DB가 연동되면 성공했다는 문구를 띄움
다음은 자주 사용하는 코드들이다. SQL문을 간단하게 사용할 수 있도록 하였다.(ORM)
// Insert문이며, Where절을 사용하여 조건을 부여한다.
await User.create({
name: input.name,
userId: input.id,
password: hash,
isRoot: false,
});
// Delete문이며, Where절로 조건을 부여한다.
await Post.destroy({
where: { id },
});
// SELECT문이며, findOne과 findAll이 있다.
// include와 model은 테이블 join을 위해 사용한다.
const message = await Post.findAll({
include: [
{
model: User,
},
],
});
각 코드들은 await async로 꼭 처리 해주어야 하며, try catch문으로 예외처리 해주자.