티스토리 뷰

web : back-end/node js

[node js] Express: 데이터베이스 연동 - Sequelize

무니웜테일패드풋프롱스 2020. 6. 26. 15:07

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

 

Model | Sequelize

An object of hook function that are called before and after certain lifecycle events. The possible hooks are: beforeValidate, afterValidate, validationFailed, beforeBulkCreate, beforeBulkDestroy, beforeBulkUpdate, beforeCreate, beforeDestroy, beforeUpdate,

sequelize.org

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함