2021. 3. 13. 11:11ㆍDev/Node
[클립명]
1. DB접속
2. 모델 작성
3. DB입력
DB접속
우선 DB에 접속하기 위해서 DBMS인 MySql을 설치한다. (구글링해서 각자 설치)
그리고 node.js 프로젝트에 DB접속을 하기 위한 패키지 2개를 설치한다.
1. DB접속을 위한 패키지 설치
//mysql 접속용 패키지
$ npm install mysql2
//node.js ORM 라이브러리 패키지
$ npm install sequelize@4.42.0
2. DB접속 소스 코딩
/** ~~/models/index.js */
var Sequelize = require('sequelize');
var path = require('path');
var fs = require('fs');
var dotenv = require('dotenv');
//개발환경에 맞는 .env 파일 설정
let envFilePath = '';
let filePath = path.join( __dirname, '..', 'app.js' )
switch(process.env.NODE_ENV){
case 'local':
envFilePath = path.join( __dirname, '..', '.env.local' )
break;
case 'development':
envFilePath = path.join( __dirname, '..', '.env.dev' )
break;
case 'production':
envFilePath = path.join( __dirname, '..', '.env.prod' )
break;
default:
envFilePath = '';
}
dotenv.config({path : envFilePath}); //LOAD CONFIG
const sequelize = new Sequelize( process.env.DATABASE,
process.env.DB_USER, process.env.DB_PASS,{
host: process.env.DB_HOST,
dialect: 'mysql',
timezone: '+09:00', //한국 시간 셋팅
operatorsAliases: Sequelize.Op,
pool: {
max: 5,
min: 0,
idle: 10000
}
});
let db = [];
fs.readdirSync(__dirname)
.filter(file => {
return file.indexOf('.js')&& file !== 'index.js'
})
.forEach(file => {
var model = sequelize.import(path.join(__dirname,
file));
db[model.name] = model;
});
Object.keys(db).forEach(modelName => {
if("associate" in db[modelName]){
db[modelName].associate(db);
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
const express = require('express');
const nunjucks = require('nunjucks');
const logger = require('morgan');
const bodyParser = require('body-parser');
// db 관련
const db = require('./models');
let envFilePath = '';
switch(process.env.NODE_ENV){
case 'local':
envFilePath = `${__dirname}/.env.local`;
break;
case 'development':
envFilePath = `${__dirname}/.env.dev`;
break;
case 'production':
envFilePath = `${__dirname}/.env.prod`;
break;
default:
envFilePath = '';
}
require('dotenv').config({path : envFilePath});
class App {
constructor () {
this.app = express();
// db 접속 ★★★★★★★★★★★★★★★★★
this.dbConnection();
// 뷰엔진 셋팅
this.setViewEngine();
// 미들웨어 셋팅
this.setMiddleWare();
// 정적 디렉토리 추가
this.setStatic();
// 로컬 변수
this.setLocals();
// 라우팅
this.getRouting();
// 404 페이지를 찾을수가 없음
this.status404();
// 에러처리
this.errorHandler();
}
//DB접속 ★★★★★★★★★★★★
dbConnection(){
// DB authentication
db.sequelize.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.then(() => {
console.log('DB Sync complete.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
}
setMiddleWare (){
// 미들웨어 셋팅
this.app.use(logger('dev'));
this.app.use(bodyParser.json());
this.app.use(bodyParser.urlencoded({ extended: false }));
}
setViewEngine (){
nunjucks.configure('template', {
autoescape: true,
express: this.app
});
}
setStatic (){
this.app.use('/uploads', express.static('uploads'));
}
setLocals(){
// 템플릿 변수
this.app.use( (req, res, next) => {
this.app.locals.isLogin = true;
this.app.locals.req_path = req.path;
next();
});
}
getRouting (){
this.app.use(require('./controllers'))
}
status404() {
this.app.use( ( req , res, _ ) => {
res.status(404).render('common/404.html')
});
}
errorHandler() {
this.app.use( (err, req, res, _ ) => {
res.status(500).render('common/500.html')
});
}
}
module.exports = new App().app;
모델 작성
node.js의 ORM 패키지 모듈인 sequelize를 이용하여 테이블을 생성하는 방법에 대해 알아보자.
sequelize를 이용하면 'CREATE TABLE ~~' 같은 쿼리문을 실행하여 테이블을 생성하지 않고 자바스크립트 파일에 생성하려는 테이블에 대해 정의해놓으면, 서버 실행시 DBMS와 Sync 과정을 통해 테이블이 없으면 자동으로 생성해준다.
프로젝트의 root/models/ 경로에 생성하고자 하는 테이블명으로 .js 파일을 생성한다.
(테이블명과 파일명을 일치시키면 관리가 편하다.)
//Products.js 파일
module.exports = (sequelize, DataTypes) => {
const Products = sequelize.define('Products',
{
id: { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true },
name : { type: DataTypes.STRING },
price : { type: DataTypes.INTEGER },
description : { type: DataTypes.TEXT }
}
);
return Products;
}
app.js 에서 DB접속하는 부분에 db.sequelize.sync(); 코드를 작성한 후, 서버를 실행하면 아래와 같이 products 테이블이 생성되는 로그가 출력되면서 테이블이 생성된다.
테이블이 생성된 후, mysql workbench로 접속하여 확인해보면, Products.js 파일에 정의하지 않은 칼럼인 CreateAt, UpdateAt 칼럼이 자동으로 생성돼 있는 것을 볼 수 있다. 이는 sequelize 옵션으로 제어가 가능하다.
dataType
- VARCHAR: STRING
- INT: INTEGER
- UNSIGNED 옵션이 적용된 INT: INTEGER.UNSIGNED
- ZEROFILL옵션: INTEGER.UNSIGNED.ZEROFILL
- TINYINT: BOOLEAN
- DATETIME: DATE
- NOT NULL: allowNull
- UNIQUE: UNIQUE
- 기본값: defaultValue
options
- timestamps: true 일 경우 createdAt, updatedAt 컬럼이 자동 추가되고 row 생성, 수정 시 시간이 자동으로 입력
- paranoid: timestamps 가 true 경우에만 사용 가능. deletedAt 이라는 컬럼이 추가되며 row 삭제하는 sequelize 명령 내릴 경우 deletedAt에 제거 날짜를 입력
- underscored: sequelize가 자동 생성해주는 컬럼명을 카멜케이스 형식에서 스네이크케이스 형식으로 변경 createdAt, updatedAt, deletedAt 컬럼을 각각 created_at, updated_at, deleted_at으로 변경
- freezeTableName: sequelize는 자동으로 define 메소드의 첫번째 매개변수를 복수형으로 만들어 테이블명으로 사용한다. 자신이 지정한 테이블명 그대로 사용하고 싶다면 true로 지정
DB입력
생성한 테이블에 간단한 데이터를 입력해보자. req.body에 데이터를 담아서 아래 코드를 실행해보면, Products 테이블에 데이터가 실제로 insert된다. 아래의 INSERT INTO 쿼리문을 날리지 않아도 데이터가 insert 처리되는 것이다.
( INSERT INTO Products (id, name, age) VALUES ('11', '꼬부기', 100); )
// controller/admin/admin.ctrl.js
const models = require('../../models');
exports.post_products_write = ( req , res ) => {
//INSERT 실행
models.Products.create(req.body)
.then(() =>{
res.redirect('/admin/products');
});
}
'Dev > Node' 카테고리의 다른 글
[NODE 강의] 데이터베이스 수정, 삭제 (0) | 2021.03.19 |
---|---|
[NODE 강의] 데이터베이스 조회 및 상세페이지 (0) | 2021.03.17 |
[NODE 강의] dotenv & Sequelize? (0) | 2021.03.09 |
[NODE 강의] [Express] 정적파일 서비스 (0) | 2021.03.04 |
[NODE 강의] body-parser? (0) | 2021.03.03 |