구성 - 프레임워크 : 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 호출하면 아래 이미지와 같이 표현 됩니다.)
'NODE.JS' 카테고리의 다른 글
[ NODEJS ] 2. express 게시판 ( insert 로 데이터 삽입 ) (0) | 2021.09.20 |
---|---|
[ NODEJS ] 1. express 게시판 ( list 로 테이블 보여주기 ) (0) | 2021.09.20 |
[ NODEJS ] express 구조 설명 (ejs view 사용) (0) | 2021.09.20 |
[ NODEJS ] 'express'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다 (0) | 2021.09.19 |
[ NODEJS ] express project 생성 (0) | 2019.04.14 |
댓글