본문 바로가기
NODE.JS

[ NODEJS ] 0. express 게시판 준비 (app.js)

by 정윤재 2021. 9. 20.

구성 - 프레임워크 : express

         Database : mariadb

         View : ejs

 

1. mariadb 를 아래와 같이 database 와 table 을 구성 합니다.

   Database 명 : test

   사용자 명 : root

   비밀 번호 : 12345

   테이블명 : test_tbl

   컬럼 : TEST_ID : int

           TEST_NAME : varchar(10)

 

2. cmd 또는 shell 에서 필요한 라이브러리를 설치 합니다.

 

npm install --save express-session 
(나중에 로그인 구현 위함)
npm install --save fs
npm install --save winston
npm install --save moment
npm install --save mariadb
npm install --save winston-daily-rotate-file

 

3. 처음의 시작점인 app.js 를 아래와 같이 구성 합니다.

(app.js 가 시작점이라는게 이해가 안되시는 분들을  https://shonm.tistory.com/655 링크로 구조를 확인 해 주세요)

 

var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var session = require('express-session');
var path = require('path');
var fs = require('fs');

main();
//global setting


var mariadbConn = require(__dirname+'/dataaccess/mariadbConn');
//database connection
app.use('/',express.static(__dirname+'/public'));
//html,css,js file read
app.set('views', __dirname + '/views');
//view page

app.set('view engine','ejs');
app.engine('html',require('ejs').renderFile);
//ejs setting

var server = app.listen(3000, function(){
    console.log('web server started 3000 port');
})


app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(session({
 secret: '@#@$MYSIGN#@$#$',
 resave: false,
 saveUninitialized: true
}));


// main 함수
async function main() {
	// global 변수 셋팅
	set_app_global_var();
}

// 글로벌 변수 셋팅
function set_app_global_var() {
	global.__BASE = __dirname + "/";
	global.__LOGGER = require(__BASE + "config/logger");
}

var testRouter = require('./routes/testRouter')(app, fs);

 

 

4. Database 연결에 필요한 설정을 해줍니다.

 

   4-1. project 의 root 폴더 하위에 config 폴더를 만들어서 

         dbconfig.js 파일(database 연결 정보 파일)을 만들어 줍니다.

 

   dbconfig.js

var dbconfig = {
    "mariadb" : {
        "host" : "localhost",
        "port" : 3306,
        "user" : "root",
        "password" : "gksghk12!",
        "database" : "test",
        "connectionLimit" : 10,
        "queueLimit" : 0
    }
}
module.exports = dbconfig;

 

   4-2. 프로젝트의 root 폴더 하위에 dataaccess 폴더를 만들어서 mariadbConn.js (database query 수행 모듈)

         을 만들어 줍니다.

 

mariadbConn.js

 

var mariadb = require('mariadb');
var dbconfig = require(__BASE +'config/dbconfig');

const pool = mariadb.createPool({
  'host' : dbconfig.mariadb.host,
  'port' : dbconfig.mariadb.port,
  'user' : dbconfig.mariadb.user,
  'password' : dbconfig.mariadb.password,
  'database' : dbconfig.mariadb.database,
  'connectionLimit' : 10,
  'queueLimit' : 0
});

console.log('Connection pool created.');

var mariadbModule = {};

mariadbModule.select = async function(query,params){

  let conn;
  let result = null;

    try{

      console.log('Connection select');
      
      conn  = await pool.getConnection(async conn => conn);
     
      rows = await conn.query(query,params);

      console.log(' ################# rows : ', rows);

      console.log('Connection select end');

      result = rows;

    }catch(err){
      console.log(err);
      throw err;
    }finally{
      if(conn){
       await conn.release();
      }
    }

  console.log('callback prev')  
  
  return result;

}

mariadbModule.insert = async function(query,params){

  let conn;
  let result;

    try{

      console.log('Connection insert');
      
      conn  = await pool.getConnection();
      
      result = await conn.query(query,params);

      console.log('Connection insert end');

    }catch(err){
      console.log(err);
      throw err;
    }finally{
      if(conn){
        await conn.release();
      }
    }

  console.log('return insert prev')  

  return result;

}


mariadbModule.delete = async function(query,params){

  let conn;
  let result;

    try{

      console.log('Connection delete');
      
      conn  = await pool.getConnection();
      
      result = await conn.query(query,params);

      console.log('Connection delete end');

    }catch(err){
      console.log(err);
      throw err;
    }finally{
      if(conn){
        await conn.release();
      }
    }

  console.log('return delete prev')  

  return result;

}

mariadbModule.update = async function(query,params){

  let conn;
  let result;

    try{

      console.log('Connection update');
      
      conn  = await pool.getConnection();
      
      result = await conn.query(query,params);

      console.log('Connection update end');

    }catch(err){
      console.log(err);
      throw err;
    }finally{
      if(conn){
        await conn.release();
      }
    }

  console.log('return update prev')  

  return result;

}

module.exports = mariadbModule;

 

5. log 를 위한 모듈을 만들어 줍니다.

 

root 폴더 하위의 config 폴더에 logger.js 를 만들어 줍니다.

 

logger.js

const winston = require('winston');
var moment = require('moment');
const fs = require('fs');
const path = require('path');

const logDir = 'logs';
if (!fs.existsSync(logDir)) {
  fs.mkdirSync(logDir);
}
const logFilaName = path.join(__dirname, '/../', logDir, 'node.log');

const makeMessage = function(info) {

  if (info.stack) {
    return info.stack;
  } else {
    if (info.message == '')
      return '';
    else
      return `${moment().format("YYYY-MM-DD HH:mm:ss.SSS")} [${info.level.toUpperCase()}] - ${info.message}`;
  }
}

var logger =  winston.createLogger({
  levels: {
    debug: 4,
    info: 3,
    warn: 2,
    error: 1,
    message: 0
  },
  transports: [
    new (winston.transports.Console)({
      colorize: true,
      level: 'debug',
      json: false,
      handleExceptions: true,
      format: winston.format.combine(
        winston.format.printf(makeMessage)
      )
   }),
    new (require('winston-daily-rotate-file'))({
      level: 'debug',
      filename: logFilaName,
      datePattern: 'YYYYMMDD',
      prepend: true,
      maxsize: '20m',
      maxFiles: '30d',
      json: false,
      handleExceptions: true,
      format: winston.format.combine(
        winston.format.printf(makeMessage)
      )
    })
  ]
});

module.exports = logger;

 

6. 테스트를 위한 router (controller 역활) 를 추가 합니다.

    root 폴더의 routes 폴더 하위에 testRouter.js 파일을 만들어 줍니다.

 

testRouter.js

let mime = require('Mime');
let path = require('path');
let mariadbModule = require(__BASE + 'dataaccess/mariadbConn');
module.exports = function(app, fs)
{
   //app.use 로 받으면 method 에 관계 없이 호출 받음, app.get 은 get 메소드, app.post 는 post 메소드
   app.get('/', async function(req,res){

            res.render('index', {
				title: "index"
            })

        });
}

 

 

7. 테스트 첫 페이지인 index.ejs 를 만들어 줍니다.

    root 폴더 하위의 view 폴더에 index.ejs 를 만들어 줍니다.

   (데이터가 router 에서 넘어오는지 title 값으로 확인 할 수 있습니다.)

 

index.ejs

 

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>
  </body>
</html>

 

 

8. 프로젝트를 실행 시킵니다.

 

프로젝트 root 폴더에서 shell 또는 cmd 에서 node app.js 구문을 실행 시킵니다.

 

 

9. 브라우저에서 호출 하여 정상 호출을 확인 해봅니다.

    (testRouter.js 에서 / 로 호출하면 index.ejs 를 실행하게 되어 있으므로

     http://localhost:3000 호출하면 아래 이미지와 같이 표현 됩니다.)

 


댓글