[Node.js + Mysql + Sequelize] Vegan V | 백엔드 구축하기

Inryu·2021년 3월 5일
0

Vegan V

목록 보기
2/3
post-thumbnail

[github]

Express 프로젝트에 sequelize를 이용하여 로컬에 있는 mysql에 접속하고, 이를 활용해 API를 만드는 것이 목표🧤

sequelize란?

  • https://sequelize.org/master/
    Node.js 에서 자바스크립트 객체로 DB의 릴레이션을 조작 가능하게 하는 ORM(Object–relational mapping) 이다.

mysql DB는 간단하게 하나의 테이블로 구성했다.


workbench를 통해 데이더 삽입도 완료한 상태이다.

express 프로젝트 생성

npm init
npm -g install express
npm -g install express-generator

express backend --view=pug

sequelize 기본 셋팅

cd backend

npm i sequelize mysql2
npm i -g sequelize-cli
sequelize init

config/config.json

시퀄라이저가 내 로컬 DB에 접속 가능하게 하기 위해 다음과 같이 수정해주었다.

{
  "development": {
    "username": "root",
    "password": ,
    "database": "veganV",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "operatorsAliases": false,
		"define": {
        "timestamps": false,
        "underscored" : true
    }
  },

sequelize-auto

시퀄라이즈를 통해 직접 엔티티를 생성하는 방법도 있지만, 나는 반대로 내가 미리 만들어둔 엔티티를 DB에서 읽어 자동으로 models 폴더에 테이블.js 파일이 생성되도록 할 것이다.

먼저 sequelize-auto를 설치한다.

npm install -g sequelize-auto
npm install -g mysql

이후 로컬 DB의 테이블을 이용하여 시퀄라이저 models 폴더에 테이블.js 파일을 자동으로 생성한다.

sequelize-auto -o "./models" -d veganV -h localhost -u root -p 3306 -x sir104401 -e mysql

이후 models/index.js를 수정한다.

models/index.js

var fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');

const env = process.env.NODE_ENV || 'development';
const config = require(path.join(__dirname, '..', 'config', 'config.json'))[env];
const db = {};

const sequelize = new Sequelize(config.database, config.username, config.password, config);

fs
    .readdirSync(__dirname)
    .filter(function(file) {
      return (file.indexOf(".") !== 0) && (file !== "index.js");
    })
    .forEach((file) => {
      const model = require(path.join(__dirname, file))(
          sequelize,
          Sequelize.DataTypes
      )
      db[model.name] = model
    })

Object.keys(db).forEach(function(modelName) {
  if ("associate" in db[modelName]) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

sequelize 문법 사용해보기

routes/index.js

router.get('/', function(req, res, next) {
  // res.render('index', { title: 'Express' });
  models.raw_material.findAll()
      .then(result =>{
        res.json(result);
      })
      .catch(function(err){
        console.log(err);
      });
});

raw_material 테이블 전체를 가져오는 코드이다.


성공!

API 작성


var express = require('express');
var router = express.Router();

const models=require('./../models');

router.get('/isvegan', async function(req, res, next) {

    const rmt_name = req.query.rmt_name;

    let result = await models.raw_material.findOne({
        where: {
            rmt_name: rmt_name
        }
    });


    //데베에 있으면
    if(result){
        const retrievedData={
            rmt_name:rmt_name,
            is_vegan:result.dataValues.is_vegan
        }
        res.send({
            status:'success',
            data:{
                retrievedData
            }
        });
    }

    //없으면 일단 논비건으로 처리할 것임
    else{
        const retrievedData={
            rmt_name:rmt_name,
            is_vegan:0
        }

        res.send({
            status:"null",
            data:{
                retrievedData
            }
        })
    }
});
  • const models=require('./../models'); 을 통해 시퀄라이즈 모델을 가져오고,models.raw_material 으로 raw_material 테이블을 사용한다.

  • rmt_name을 query로 받아서 raw_material 테이블에 해당 rmt_name의 데이터가 있는지 조회한다. 이후 rmt_nameis_vegan을 return 한다. 이때 데베에 없는 데이터는 일단 논비건으로 처리한다! (is_vegan : 0)

postman을 통해 API 테스트


성공적으로 작동한다✨


[references]

profile
👩🏻‍💻

1개의 댓글

comment-user-thumbnail
2024년 1월 23일

안녕하세요. 좋은 글 잘 읽었습니다 😀
혹시 비건 여부 파악은 어떤 논리로 진행하셨는지 공유해주실 수 있으신가요?
좋은 하루 되세요.

답글 달기