티스토리 뷰
Sequelize란 ?
node js에서 MySql을 자바스크립트로 다룰 수 있는 라이브러리이다. 곧, Sequelize는 ORM(Object - Relational Mapping) ( 객체와 관계형 데이터에비읏의 관계를 매팽해주는 도구)로 분류된다.
먼저 mysql라이브러리와 sequelize라이브러리를 설치한다.
npm install --save mysql2
npm install --save sequelize
1. 커넥션 풀 생성
데이터베이스 연동을 위해 커넥션 풀을 생성한다
const Sequelize = require('sequelize'); //라이브러리 import
const sequelize = new Sequelize('스키마이름','mysql루트이름', 'mysql비밀번호',
{dialect:'mysql', //연동할 데이터베이스
host:'localhost', // default- localhost
port: 3360}); //포트번호 default- 3306
module.exports=sequelize; //exports
2. 모델 정의 - 테이블 생성
const Sequelize = require('sequelize'); //sequelize 라이브러리
const sequelize = require('../util/database'); //커넥션풀
const User = sequelize.define('user',{ //커넥션풀에 등록된 스키마에 user 테이블 생성
id:{ // user table column 정의 id, name, email
type :Sequelize.INTEGER,
autoIncrement: true,
allowNull : false,
primaryKey: true
},
name:{
type: Sequelize.STRING,
allowNull : false
},
email:{
type:Sequelize.STRING,
allowNull: false
}
});
module.exports=User;
이렇게 sequelize define을 통해서 커넥션풀에 등록된 스키마(데이터베이스)에 테이블을 생성해준다.
type은 컬럼의 타입이고, allowNull은 null값 허용 여부, primaryKey는 유일키 여부이다.
3. Express와 연동하기
연동은 엔트리 파일에서 해주도록 한다. 커넥션풀을 import해서 sync() 메서드를 사용하면 정의된 모든 model이 데이터베이스에 생성된다. 이미 존재하는 모델은 생성되지 않는다.
const sequelize = require('./util/database.js'); //커넥션 풀
sequelize.sync().then(result =>{
app.listen(3000);
}).catch(err=>{
console.log(err);
}
여기에서는, 데이터베이스 연동이 되어야 서버를 구동하도록 app.listen을 then 안에다가 넣어주었다.
4. 데이터베이스로부터 테이블 가져오기
- 모든 레코드를 가져오고자 할 때
findAll() 메서드를 사용해준다.
// Controller
const Product = require('../models/product'); //가져오고자 하는 테이블 모델 import
exports.getIndex=(req,res,next)=>{
Product.findAll() // Product 테이블의 모든 레코드 가져오기
.then(products => { // 모든 레코드가 products에 담겨진다.
res.render('shop/index',{ // rendering
pageTitle:'Shop',
prods:products,
path:'/'
});
})
.catch( err => {console.log(err)});
}
- 특정 레코드를 가져오고자 할 때 ( 여러개의 특정 레코드 )
Product.findAll( {where: {Where: 조건 } } )
array 형태로 반환되니, 꼭 배열 위치를 통해서 접근해야한다.
exports.getProduct=(req,res,next)=>{
const prodId = req.params.productId;
Product.findAll({where: {id : prodId}}) //해당 조건을 만족하는 레코드 찾기
.then(products => {
res.render('shop/product-detail', {
product: products[0], // array 형태로 반환되므로
// 배열의 위치를 통해 접근해야함
path:'/products',
pageTitle:products[0].title
});
})
.catch(err => console.log(err));
}
- 특정 레코드를 가져오고자 할 때 (하나의 특정 레코드)
Product.findByPk(특정 값)
이미 single element로 반환되므로 배열 위치를 통해서 접근할 필요 없다.
exports.getProduct=(req,res,next)=>{
const prodId = req.params.productId;
Product.findByPk(prodId) // 파라미터로 받은 prodId에 해당하는 레코드 반환
.then( (products)=>{
res.render('shop/product-detail', {
product: products, //single element형태로 반환됨
path:'/products',
pageTitle:products.title
});
})
.catch(err =>
console.log(err));
}
5. 데이터베이스 테이블에 레코드 추가하기
create()메서드를 사용해주고, 인자로 {} 를 통해 컬럼 값들을 key - value로 넣어준다.
exports.postAddProduct=(req,res,next)=>{
const title=req.body.title;
const imageUrl=req.body.imageUrl;
const price=req.body.price;
const description=req.body.description; //추가될 레코드의 컬럼값들
Product.create({
title: title,
price: price,
imageUrl : imageUrl,
description : description
})
.then(result => {
console.log(result);
res.redirect('/');
})
.catch(err => console.log(err));
};
6. 데이터베이스 테이블 특정 레코드 삭제하기
delete()메서드를 사용해주고 인자로 where:{조건}을 넣어주어, 해당 조건의 레코드를 삭제한다.
exports.postDeleteProduct=(req,res,next)=>{
const id = req.body.productId;
Product.destroy({where:{id:id}})
.then( result => {
console.log(result);
res.redirect('/admin/products');
})
.catch(err=>{
console.log.err;
});
}
7. 데이터베이스 테이블 특정 레코드 수정하기
update() 메서드를 사용해주고, 첫번째 인자로는 { } 로 각각 수정될 key-value값들을 정의해준다. 두번째 인자로는 where 조건으로 해당 조건의 레코드를 수정해준다.
xports.postEditProduct=(req,res,next)=>{
// updated
const id = req.body.productId;
const title=req.body.title;
const imageUrl=req.body.imageUrl;
const price=req.body.price;
const description=req.body.description;
let changeValue ={
title:title,
price:price,
imageUrl:imageUrl,
description:description
}; //수정될 정보
Product.update(changeValue, {where: {id : id}} )
.then(result => {
console.log(result);
res.redirect('/');
})
.catch(err => console.log(err));
}
이렇게 Sequelize라이브러리를 통해 쿼리를 따로 작성하지 않고 자바스크립트 언어로 데이터베이스에 CRUD를 할 수 있다.
참조:https://sequelize.org/master/class/lib/model.js~Model.html
'web : back-end > node js' 카테고리의 다른 글
[ node js express ] 강의 노트 깃 리포지토리에 저장 중입니다 (0) | 2020.07.15 |
---|---|
[node js] Express: MongoDB 데이터베이스 연동 (0) | 2020.07.05 |
[node js] Express: 저장된 파일 내용 삭제하기 (0) | 2020.06.24 |
[node js] Express: 동적 페이지 처리하기 (0) | 2020.06.23 |
[node js] Express: Model 에서 file형태로 데이터 저장 및 읽어오기 (0) | 2020.06.21 |