Node.js/MyTodoList

[Node.js] 05. Sequelize

hyun_ji 2021. 7. 9. 08:49
반응형
SMALL

시퀄라이즈를 쓰는 이유는 자바스크립트 구문을 알아서 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); // 파일명 추출후 출력

Path 모듈의 관한 설명

이제 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);
  }
});

자세한 쿼리 관련 내용은 이 링크에서 확인.

서버와 프론트를 실행시켜서 확인해보겠습니다.

제대로 성공한 것을 확인할 수 있네요!

이로써 시퀄라이즈까지 프로젝트가 끝났습니다.

따라오신 여러분 수고하셨습니다~!

더 많은 프로젝트와 지식들로 찾아오겠습니다. 감사합니다 😊

반응형
LIST