์๋ ํ์ธ์ Foma ์ ๋๋ค!
์ค๋์ ์ ๋ฒ Sequelize ์ด๋ก ๊ธ์ ์ด์ด์ C.R.U.D๋ฅผ ์ง์ ๊ตฌํํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
(ํน์ ์ ๋ฒ ๊ธ์ ์๋ณด์ ๋ถ๋ค์ ์ฌ๊ธฐ ์์ ํ์ธํด ์ฃผ์ธ์)
๋ฐ๋ก ์์ํ ๊ฒ์~
Install
express
npm install --save express
cors
npm install --save cors
sequelize
npm install --save sequelize
mysql2
npm install --save mysql2
Sequelize init
sequelize init
Sequelize๋ฅผ init ํด์ฃผ๋ฉด ์๋์ผ๋ก config, migrations, models, seeders ์ด๋ ๊ฒ 4๊ฐ์ ํด๋๊ฐ ์๊ธธ๊ฑฐ์์.
์ด๋ฒ ๊ธ์์๋ seeders๋ ์ด์ฉ๋์ง ์์ผ๋ ์ญ์ ํด ์ค๋๋ค.
config.json
config.json์ผ๋ก ๊ฐ๋ฉด ์๋์ ๊ฐ์ด ๋์ด ์์๊ฑฐ์์.
์ฌ๊ธฐ๋ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ๋ณด๋ฅผ ์ ๋ ฅํ๋ ๊ณณ์ ๋๋ค.
์ด๋ฒ ๊ธ์์ test์ production์ ์ฌ์ฉ๋์ง ์์ผ๋ ์ญ์ ํด์ฃผ๊ณ , ์๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ณด๋ฅผ ์ ๋ ฅํด ์ค๋๋ค.
{
"development": {
"username": "์ ์ ์ด๋ฆ",
"password": "ํจ์ค์๋",
"database": "๋ฐ์ดํฐ๋ฒ ์ด์ค์ด๋ฆ",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
models/index.js
์๋์ ๊ฐ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฐ๊ฒฐํด ์ฃผ์ธ์.
const { Sequelize, DataTypes } = require("sequelize");
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.sequelize = sequelize;
sequelize
.sync({ force: false })
.then(() => {
console.log("๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ๋จ.");
})
.catch((err) => {
console.error(err);
});
module.exports = db;
app.js
app.js ํ์ผ์ ์์ฑํ๊ณ ์ ๋๋ก ๋ฐ์ดํฐ ๋ฒ ์ด์ค๊ฐ ์ฐ๊ฒฐ๋์๋์ง ํ ์คํธ ํด๋ด ๋๋ค.
const express = require("express");
const cors = require("cors");
const app = express();
var corOptions = {
origin: "https://localhost:3000",
};
app.set("port", process.env.PORT || 3000);
app.use(cors(corOptions));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
require("./models/index");
app.get("/", (req, res) => {
res.json({ message: "hello world" });
});
app.listen(app.get("port"), () => {
console.log(app.get("port"), "๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค");
});
app.js๋ฅผ ์คํ ์์ผ๋ณด๋ฉด
node app.js
์๋์ ๊ฐ์ด ์ ์์ ์ผ๋ก ๋ฐ์ดํฐ ๋ฒ ์ด์ค๊ฐ ์ฐ๊ฒฐ๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Create a table
//npx sequelize migration:create --name ํ
์ด๋ธ์ด๋ฆ
npx sequelize migration:create --name Users
์๋์ ๊ฐ์ด migrations ํด๋์ ํ์ฌ ๋ ์ง์ ์ง์ ํด์ค ํ ์ด๋ธ ์ด๋ฆ์ ๊ฐ์ง ํ์ผ์ด ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ํด๋น ํ์ผ์ ์๋์ ๊ฐ์ด ์์ฑ๋์ด ์๋๋ฐ์.
up
logic for transforming into the new state
์๋ก์ด ์ด๋ค ์ํ๋ก ๋ณํ์ํฌ ๋ก์ง์ ์์ฑ
down
logic for reverting the changes
๋ณํ๋ฅผ ๋ค์ ๋๋๋ฆด ๋์ ๋ก์ง์ ์์ฑ
์ด๋ผ๊ณ ๊ณต์ ๋ฌธ์์ ๋ํ๋ ์์ต๋๋ค.
module.exports = {
async up (queryInterface, Sequelize) {
},
async down (queryInterface, Sequelize) {
}
};
์๋์ ๊ฐ์ด up์ Users ํ ์ด๋ธ์ ์์ฑํด ์ฃผ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
์ปฌ๋ผ์ผ๋ก id,username,password๋ฅผ ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
down์ ์์ฑํ Users ํ ์ด๋ธ์ ์ญ์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ์ต๋๋ค.
module.exports = {
async up(queryInterface, Sequelize) {
queryInterface.createTable("Users", {
id: {
type: Sequelize.INTEGER(11),
allowNull: false,
autoIncrement: true,
primaryKey: true,
},
username: Sequelize.STRING(35),
password: {
type: Sequelize.STRING(20),
allowNull: false,
},
});
},
async down(queryInterface, Sequelize) {
queryInterface.dropTable("Users");
},
};
Migrate
์๋ ๋ช ๋ น์ด๋ฅผ ์ณ์ ์์์ ํ ์ด๋ธ์ ์์ฑํ๋ ์ฝ๋๋ฅผ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ง์ ๋ง์ด๊ทธ๋ ์ดํธ ํด์ค๋๋ค.
up ๋ก์ง์ ์คํํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
(๋ง์ด๊ทธ๋ ์ดํธ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฉํ๋ ๊ฒ์ด๋ผ๊ณ ์ดํดํ์๋ฉด ๋ฉ๋๋ค.)
sequelize db:migrate
์๋์ ๊ฐ์ด config.json ํ์ผ์ loaded ํด migrate๋ฅผ ์งํํฉ๋๋ค.
๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ก ์ด๋ํ์๋ฉด config.json์ ์ค์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ users ํ ์ด๋ธ๊ณผ id,username,password ์ปฌ๋ผ๋ค์ด ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ง์ฝ migrate๋ฅผ ๋ค์ ๋๋๋ฆฌ๊ณ ์ถ๋ค๋ฉด undo ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด ์ค๋๋ค.
undo๋ฅผ ์ ๋ ฅํ๋ฉด down ๋ก์ง์ด ์คํ๋์ด ํ ์ด๋ธ์ด ์ญ์ ๋ฉ๋๋ค.
sequelize db:migrate:undo
ํ ์ด๋ธ์ด ์ญ์ ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ undo ๋ช ๋ น์ด๋ ๋ฐ๋ก ์ด์ ์ ์คํ๋ migrate๋ฅผ ๋๋๋ฆฌ๋ ๊ฒ์ธ๋ฐ์.
์ง๊ธ๊น์ง ํ ๋ชจ๋ ๋ช ๋ น์ ๋๋๋ฆฌ๊ณ ์ถ๋ค๋ฉด undo:all์ ์ ๋ ฅํด ์ฃผ์๋ฉด ๋ฉ๋๋ค.
sequelize db:migrate:undo:all
Create a model
models ํด๋์ User.js ํ์ผ์ ๋ง๋ค์ด ์ค๋๋ค.
ํ ์ด๋ธ์ ์์ฑํ ๋์ ๊ฐ์ด ์์ฑํด ์ค๋๋ค.
๋ค๋ง ์๋์ผ๋ก createdAt, updatedAt ์์ฑ์ ํ์ง ์๋๋ก timestamp: false๋ก ์ค์ ํด ์ค๋๋ค.
module.exports = (sequelize, DataTypes) => {
const User = sequelize.define(
"User",
{
id: {
type: DataTypes.INTEGER(11),
allowNull: false,
autoIncrement: true,
primaryKey: true,
},
username: DataTypes.STRING(35),
password: {
type: DataTypes.STRING(20),
allowNull: false,
},
},
{
timestamps: false,
}
);
return User;
};
Create a controller
์ด์ User ํ ์ด๋ธ์ ์์ฑ, ์ฝ์ , ์์ , ์ญ์ ๋ฅผ ์งํํ Controller๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
models ํด๋์ index.js์ ๊ฐ์ db์ users๋ฅผ ์ถ๊ฐํด ์ค๋๋ค.
db.users = require("./User.js")(sequelize, DataTypes);
๋ค์ UserController๋ก ๋์์์ User๋ฅผ ์ ์ํด ์ค๋๋ค.
const db = require("../models");
const User = db.users;
Create
const addUser = async (req, res) => {
let info = {
username: req.body.username,
password: req.body.password,
};
const user = await User.create(info).catch((err) => console.log(err));
res.status(200).send(user);
};
Read
const getAllUsers = async (req, res) => {
let users = await User.findAll({}).catch((err) => console.log(err));
res.status(200).send(users);
};
const getUser = async (req, res) => {
let id = req.params.id;
let user = await User.findOne({ where: { id: id } }).catch((err) =>
console.log(err)
);
res.status(200).send(user);
};
Update
const updateUser = async (req, res) => {
let id = req.params.id;
const user = await User.update(req.body, { where: { id: id } }).catch((err) =>
console.log(err)
);
res.status(200).send(user);
};
Delete
const deleteUser = async (req, res) => {
let id = req.params.id;
await User.destroy({ where: { id: id } }).catch((err) => console.log(err));
res.status(200).send("User is deleted");
};
์ ํจ์๋ค์ exports ํด์ค๋๋ค.
module.exports = {
addUser,
getAllUsers,
getUser,
updateUser,
deleteUser,
};
Create a router
UserRouter.js ํ์ผ์ ๋ง๋ค๊ณ
๊ฐ ๊ธฐ๋ฅ๋ณ๋ก ๋ผ์ฐํฐ๋ฅผ ๋ง๋ค์ด ์ค๋๋ค.
const userController = require("../controllers/userController.js");
const router = require("express").Router();
router.post("/addUser", userController.addUser);
router.get("/allUsers", userController.getAllUsers);
router.get("/:id", userController.getUser);
router.put("/:id", userController.updateUser);
router.delete("/:id", userController.deleteUser);
module.exports = router;
Set a UserRouter
๋ค์ app.js๋ก ๋์๊ฐ์ ์๋ ๋ถ๋ถ์
require("./models/index.js");
๋ผ์ฐํฐ๋ก ๋์ฒดํด ์ค๋๋ค.
const router = require("./routers/UserRouter.js");
app.use("/api", router);
๊ทธ ๋ค์ ๋ค์ ์๋ฒ๋ฅผ ์คํ์์ผ ์ค๋๋ค.
node app.js
Test
Postman์ ์ด์ฉํ์ฌ api๋ฅผ ํ ์คํธ ํด๋ณด๊ฒ ์ต๋๋ค.
POST(Create)
addUser์ username๊ณผ password๋ฅผ json ํ์์ผ๋ก ์์ฑํด post ์์ฒญ์ ๋ณด๋ด ์ ์ ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
//POST
http://localhost:3000/api/addUser
GET(Read)
์์์ ์์ฑํ ์ ์ ๊ฐ ์ ๋๋ก ๋ค์ด๊ฐ๋์ง allUsers๋ก get ์์ฒญ์ ๋ณด๋ด ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ฐ์์ ๋ณด๊ฒ ์ต๋๋ค.
//GET
http://localhost:3000/api/allUsers
์๋์ ๊ฐ์ด ์ ์์ ์ผ๋ก ์ถ๊ฐํ ์ ์ ๊ฐ ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
PUT(Update)
id๊ฐ 1์ธ ์ ์ ์ username์ kalid๋ก ๋ณ๊ฒฝํด PUT์ผ๋ก ์ ๋ฐ์ดํธ ํด๋ณด๊ฒ ์ต๋๋ค.
//PUT
http://localhost:3000/api/1
GET
id๊ฐ 1์ธ ์ ์ ์ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ฉด username์ด kalid๋ก ๋ฐ๋์ด ์๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
//GET
http://localhost:3000/api/1
DELETE
id๊ฐ 1์ธ ์ ์ ๋ฅผ Delete ํด์ค๋๋ค.
//DELETE
http://localhost:3000/api/1
๋ง์ง๋ง์ผ๋ก ๋ชจ๋ ์ ์ ๋ฅผ ๋ณด๋ฉด ์ญ์ ๊ฐ ์ ์์ ์ผ๋ก ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Reference
๋๊ธ