[github]
Express 프로젝트에 sequelize를 이용하여 로컬에 있는 mysql에 접속하고, 이를 활용해 API를 만드는 것이 목표🧤
mysql DB는 간단하게 하나의 테이블로 구성했다.
workbench를 통해 데이더 삽입도 완료한 상태이다.
npm init
npm -g install express
npm -g install express-generator
express backend --view=pug
cd backend
npm i sequelize mysql2
npm i -g sequelize-cli
sequelize init
시퀄라이저가 내 로컬 DB에 접속 가능하게 하기 위해 다음과 같이 수정해주었다.
{
"development": {
"username": "root",
"password": ,
"database": "veganV",
"host": "127.0.0.1",
"dialect": "mysql",
"operatorsAliases": false,
"define": {
"timestamps": false,
"underscored" : true
}
},
시퀄라이즈를 통해 직접 엔티티를 생성하는 방법도 있지만, 나는 반대로 내가 미리 만들어둔 엔티티를 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
를 수정한다.
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;
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
테이블 전체를 가져오는 코드이다.
성공!
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_name
과 is_vegan
을 return 한다. 이때 데베에 없는 데이터는 일단 논비건으로 처리한다! (is_vegan
: 0)
성공적으로 작동한다✨
[references]
안녕하세요. 좋은 글 잘 읽었습니다 😀
혹시 비건 여부 파악은 어떤 논리로 진행하셨는지 공유해주실 수 있으신가요?
좋은 하루 되세요.