Sequelize 사용하기

sese·2022년 8월 10일

새싹

목록 보기
13/39

데이터베이스 작업을 쉽게 할 수 있도록 도와주는 ORM(Object-Relational Mapping) 라이브러리이다. Sequelize를 사용하면 자바스크립트 구문을 알아서 SQL로 변환 해준다.

1. 필요한 모듈을 설치해준다.

$ npm i sequelize sequelize-cli mysql2

2. config 폴더에 config.json 파일을 생성해준다.

config.json 파일에 데이터베이스의 정보를 저장해주면, model 에서 데이터베이스 세팅을 할 때 정보를 일일이 써주지 않아도 된다.

{
    "development" : {
        "host" : "localhost",
        "database" : "sesac",
        "username" : "user",
        "password" : "1234",
        "dialect" : "mysql"
    },
    "production" : {

    },
    "test" :{

    }
}

4. model 폴더에 데이터베이스를 세팅하는 index.js파일을 생성해준다.

파일명은 꼭 index.js 일 필요는 없다.

// sequelize 모듈 불러오기
const Sequelize = require("sequelize");

// config.json파일의 "development"의 값을 config 변수에 저장해준다
const config = require("../config/config.json")["development"];

// db 객체 생성. 나중에 정보를 넣어줄 것이다.
const db = {};
const sequelize = new Sequelize(
    // 원래 이 부분에 일일이 데이터베이스 정보를 적어줘야 하는데, config에 정보를 저장해주었기 때문에 이렇게 작성할 수 있다.
    config.database,
    config.username,
    config.password,
    config
);

// dictionary.key = value -> 이렇게 새로운 키와 값을 넣어준 것이다.
db.sequelize = sequelize;
db.Sequelize = Sequelize;
// 결국 const db = {"sequelize" : sequelize, "Sequelize" : Sequelize}; 이런 형태

// ./Visitor.js에서 module.exports에 있는 Visitor 함수를 불러오는데 바로 실행시켜서 return된 model이 db.Visitor에 담긴다.
db.Visitor = require("./Visitor")(sequelize, Sequelize);

// db를 내보내준다.
module.exports = db;

5. 모델 (테이블) 정의해주기 - Visitor.js

// Sequelize는 model/index.js에서의 sequelize
// DataTypes는 model/index.js에서의 Sequelize
const Visitor = (Sequelize, DataTypes) => {
    
    // sequelize객체.define(테이블 이름, 컬럼 정의, 옵션 정의)
    const model = Sequelize.define(
        'visitor',
        {
            id : {
                // int
                type: DataTypes.INTEGER,
                // not null
                allowNull: false,
                // primary key
                primaryKey: true,
                // auto_increment
                autoIncrement: true
            },
            name: {
                type: DataTypes.STRING(10),
                allowNull: false
            },
            comment: {
                type: DataTypes.TEXT('medium')
            }
        },
        {
            // true로 지정하게 되면 등록된 시간과 수정된 시간을 갖는 컬럼이 만들어진다
            timestamps: false,
            tableName: 'visitor',
            // sequelize에서 자동으로 table이름 뒤에 s를 붙이는데 freezeTableName 속성을 true로 주면 테이블 이름을 바꾸지 않는다.
            freezeTableName: true
        }
    );
    return model;
}

// Visitor를 내보내는데 이는 곧 Visitor함수에서 return된 model.
module.exports = Visitor;

6. 컨트롤러에서 db객체 가져오기

// models는 model/index.js에서 exports된 db
// db.Visitor에 Visitor.js에서 exports된 Visitor함수의 리턴 값인 모델이 들어가 있다.
// 그래서 models.Visitor 이렇게 사용하면 된다
const models = require("../model");

exports.get_visitors = (req,res) => {
    // sequelize 문법. Select * FROM visitor;와 같다
    models.Visitor.findAll()
    // sequelize는 프로미스 방식을 사용할 수 있다.
    .then((result) => {
  		// findAll을 했을 때는 mysql에서 select한 결과와 같이 배열안에 객체가 담긴 형태로 값이 리턴된다.
        // 그 중 dataValues라는 딕셔너리에 데이터가 담기는데 result.column으로 값을 가져올 수 있다
        console.log("result[0] : ", result[0]);
        // 객체안의 dataValues에서 id를 자동으로 찾아주는 것
        console.log("id : ", result[0].id);
        res.render("index", {data: result});
    });
}

그럼 다음과 같이 콘솔에 결과가 나오는 것을 볼 수 있다.

sequelize 문법

SELECT * FROM table

모델.findAll(조건)
.then((result) => {
    console.log( result );
})
  
// result = [{}, {}]
// 결과가 하나만 있어도 배열에 담긴다

SELECT * FROM table WHERE id = req.body.id AND name = req.body.name LIMIT 1

모델.findOne({where: {id: req.body.id, name: req.body.name}})
.then((result) => {
    console.log( result );
})

// result = {}
// 객체로 리턴된다.

INSERT INTO table ('name', 'comment') VALUES (req.body.id, req.body.comment)

let object = {
  name : req.body.name,
  comment : req.body.comment
}
모델.create(object)
.then((result) => {
    console.log( result );
})

// result = {}
// findOne과 마찬가지로 객체로 데이터가 들어온다.
// mysql을 사용해서 insert를 하면 데이터가 리턴되지 않지만 sequelize를 사용하면 데이터가 리턴되어서 더 편하다.

UPDATE table SET name = req.body.name, comment = req.body.comment WHERE id = req.body.id

let newObj = {
    name : req.body.name,
    comment : req.body.comment
};
모델.update(newObj, {where: {id: req.body.id}})
.then((result) => {
    console.log( result );
})
  
// result = [바뀐 데이터의 개수]

DELETE FROM table WHERE id = req.body.id

모델.destroy({where: {id: req.body.id}})
.then((result) => {
    console.log( result );
})
  
// result = 바뀐 데이터의 개수
profile
예전 글은 다크모드로 봐야 잘 보일 수도 있습니다.

0개의 댓글