시퀄라이즈를 쓰는 이유는 자바스크립트 구문을 알아서 SQL로 바꿔주기 때문입니다. 따라서 SQL 언어를 직접 사용하지 않아도 자바스크립트만으로 MySQL을 조작할 수 있습니다.
시퀄라이즈를 사용해봅시다.
시퀄라이즈를 이용하면 js로 테이블을 만들 수 있습니다.
프로젝트와 함께 테이블 정보를 저장할 수 있어서 유용하겠죠.
그리고 시퀄라이즈 구문이 sql구문보다 사용하기가 간단해서 편리합니다.
시퀄라이즈를 사용하려면 설치해야겠죠.
서버에 시퀄라이즈를 설치합니다.
$ npm i sequelize
설치가 완료되었으면, MyTodoList에 model 폴더를 생성합니다.
1. index.js 작성
시퀄라이즈를 사용하기 위해 index.js 파일을 만들어서 import 시킵니다.
const fs = require("fs"); // node.js가 내장하고 있는 여러 모듈 중 하나이다. fs는 File system의 약자로서, fs모듈은 파일을 읽고, 저장하는등 파일과 관련된 모듈들을 내장하고 있다.
const {
Sequelize, // 시퀄라이즈 사용
DataTypes, // 데이터타입 입력용
Op, // 연산자 사용
QueryTypes // 이미 준비된 SQL 쿼리를 실행하는 것이 더 쉬운 사용 경우 사용
} = require("sequelize");
const path = require("path");
const basename = path.basename(__filename); // 파일명 추출후 출력
이제 MySQL 을 연결합시다.
.env에서 정보를 가져옵시다.
const fs = require("fs");
const path = require("path");
const { Sequelize, DataTypes, Op, QueryTypes } = require("sequelize");
const basename = path.basename(__filename);
const dotenv = require('dotenv');
dotenv.config();
const {
DB_DATABASE,
DB_USER,
DB_PASSWORD,
DB_HOST
} = process.env;
const sequelize = new Sequelize(DB_DATABASE, DB_USER, DB_PASSWORD,{
host : DB_HOST,
dialect : 'mysql',
operatorsAliases : 0,
pool : {
max : 5,
min : 0,
idle : 10000,
}
}); // 시퀄라이즈에 DB정보 등록, pool설정
배열에 담기 위한 db선언
// 외래키 쓸때 key와value로 구분시켜줄 때,
// db.sequelize = sequelize;
// db.Op = Op;
// db.QueryTypes = QueryTypes; 사용할 때 필요하다.
// 이 안에 담아뒀다가 꺼내서 사용
let db = [];
모듈로 만들어서 내보내기
// fs.readdirSync () 메소드는 동기 주어진 디렉토리의 내용을 판독하기 위해 사용된다.
// 이 메서드는 디렉터리에있는 모든 파일 이름 또는 개체가있는 배열을 반환합니다.
// options 인수는 메서드에서 파일이 반환되는 형식을 변경하는 데 사용할 수 있습니다.
fs
.readdirSync(__dirname)
.filter(file => {
// 파일이름 추출
return (
file.indexOf(".") !== 0 &&
file !== basename &&
file.slice(-3) === ".js"
);
})
// 추출한 값을 하나하나하나 db[]안에 담음
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, DataTypes);
db[model.name] = model;
});
//외래키 있으면 외래키끼리 연결시켜줌
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db);
}
});
// sequelize, Op, QueryTypes 사용을 위한 선언
db.sequelize = sequelize;
db.Op = Op;
db.QueryTypes = QueryTypes;
// 내보내기
module.exports = db;
이렇게 index.js의 작성이 완료되었습니다.
2. todotable.js 만들기
model 디렉토리 안에 index를 생성했으면 테이블도 만들어야 합니다.
todotable.js파일을 생성하고 아래와 같이 작성합니다.
module.exports = (sequelize, DataTypes) => {
// 투두테이블 생성
const todotable = sequelize.define(
// 이름 투두데이블
"todotable",
{
// idx칼럼 생성
idx: {
type:DataTypes.INTEGER, // 숫자
primaryKey: true, // 기본지
allowNull: false, // Null 없음
autoIncrement : true // 자동 증가
},
// content 칼럼 생성
content: {
type:DataTypes.STRING(200), // 문자 200 바이트
unique: false, // 내용 중복 가능
allowNull: false, // Null 없음
}
});
// 투두테이블로 반환
return todotable;
};
시퀄라이즈 테이블 생성 양식은 위와 같은 형식으로 작성됩니다.
테이블까지 생성을 완료했으니 작성했던 restAPI를 수정해봅시다.
3. app.js 파일에서 호출하기
다시 app.js 파일로 돌아옵니다.
작성했던 db를 import 시킵니다.
const { todotable } = require('./model') // 작성한 테이블
const db = require('./models') // mysql 시퀄라이저 모델
// 시퀄라이즈 실행
db.sequelize
.authenticate()
.then(async () => {
console.log('db connect ok');
await db.sequelize.sync({force : false});
})
.catch(err => {
console.log('db' + err);
});
이렇게 나오면 성공입니다.
4. RestAPI 시퀄라이즈 문법으로 변형하기
create
기존의 코드를
app.post('/create', async (req, res) => {
try{
let {content} = req.body; // body에서 할일 내용을 입력받아옴
console.log(content);
const conn = await pool.getConnection(); // pool에서 커넥션을 가져오기
let sql = 'insert into todotable (content) values(?)'; // db에 content를 넣는 쿼리문 작성;
let data = [content]; // data에 content 담기
console.log(data);
const [rows] = await pool.query(sql,data); //쿼리문 실행 및 rows에 담기
res.status(200).json({ result : rows }); // rows 전달
conn.release(); // 커넥션을 다시 pool로 반환
} catch (error){
console.log(error); // 에러잡기
}
});
이렇게 바꿉니다.
app.post('/create', async (req, res) => {
try{
let {content} = req.body;
// body에서 값을 받아오고 쿼리문을 시퀄라이즈 문법으로 변형합니다. insert>create
const rows = await todotable.create({
content : content
});
if (rows) return res.status(200).json({result : rows});
else throw console.log(error);
} catch(err){
console.log(err);
}
});
list
app.get('/list', async (req, res) => {
try{
const conn = await pool.getConnection();
const sql = 'select * from todotable';
const [rows] = await pool.query(sql);
res.status(200).json({ result : rows });
conn.release();
} catch (error){
console.log(error);
}
});
app.get('/list', async (req, res) => {
try{
// select>findAll
const rows = await todotable.findAll();
if (rows) return res.status(200).json({result : rows});
else throw console.log(error);
} catch(err){
console.log(err);
}
});
update
app.post('/update', async (req, res) => {
try{
const {idx, content} = req.body;
console.log(idx,content);
const conn = await pool.getConnection();
const sql = 'update todotable set content=? where idx=?';
const data = [content,idx];
const [rows] = await pool.query(sql,data);
res.status(200).json({ result : rows });
conn.release();
} catch (error){
console.log(error);
}
});
app.post('/update', async (req, res) => {
try{
let {idx, content} = req.body;
// update>update
const rows = await todotable.update(
{content: content},
{
where : {idx : idx}
}
);
if (rows) return res.status(200).json({result : rows});
else throw console.log(error);
} catch(err){
console.log(err);
}
});
delete
app.post('/delete', async (req, res) => {
try{
const {idx} = req.body;
console.log(idx);
const conn = await pool.getConnection();
const sql = 'delete from todotable where idx=?';
const data = [idx];
const [rows] = await pool.query(sql,data);
res.status(200).send(rows);
conn.release();
} catch (error){
console.log(error);
}
});
app.post('/delete', async (req, res) => {
try{
let {idx} = req.body;
// delete>destroy
const rows = await todotable.destroy({ where : {idx : idx} });
if (rows) return res.status(200).json({result : rows});
else throw console.log(error);
} catch(err){
console.log(err);
}
});
자세한 쿼리 관련 내용은 이 링크에서 확인.
서버와 프론트를 실행시켜서 확인해보겠습니다.
제대로 성공한 것을 확인할 수 있네요!
이로써 시퀄라이즈까지 프로젝트가 끝났습니다.
따라오신 여러분 수고하셨습니다~!
더 많은 프로젝트와 지식들로 찾아오겠습니다. 감사합니다 😊
'Node.js > MyTodoList' 카테고리의 다른 글
[Node.js] 04. CSS와 SCSS (0) | 2021.07.09 |
---|---|
[Node.js] 03. React (2) | 2021.07.09 |
[Node.js] 02. REST API (0) | 2021.07.08 |
[Node.js] 01. 시작하기(express) (0) | 2021.07.08 |