node.js MySQL #6

학미새🐥·2022년 2월 20일
0
post-custom-banner

DB 설정정보를 별도의 파일로 분리하기

지금까지 대부분의 코드를 main.js 파일에 작성해왔다.
여기서 DB 설정과 관련된 다음과 같은 코드를 db.js라는 별도의 파일로 분리시킬 수 있다.

//lib/db.js
var mysql = require('mysql');
var db = mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'******',
    database:'opentutorials'
});
db.connect();

lib directory 내부의 db.js 파일을 main.js에서 불러올 수 있도록 하기 위해,
exports 설정도 해줘야 한다.

module.exports = db;

기존 코드인 main.js에서는 이 모듈을 불러오는 코드를 추가한다.

var db = require('./lib/db');

깃 등을 쓸 때 파일 내부에 DB 정보를 저장하는 것은 위험하다
ID와 PW와 같은 기밀정보가 소스코드 공유와 동시에 공유되면 보안상의 문제가 발생한다.
따라서 이럴 경우,
기밀정보가 제외된, template(틀)만 갖춘 파일을 별도로 생성하여, 소스코드를 공유하고 버전관리를 할 때엔 해당 파일만을 공유한다.
실제로 개발할 때엔 해당 파일을 복사하여 사용자데이터를 입력하는 식으로 진행하면 된다.

<db.template.js>

var mysql = require('mysql');
var db = mysql.createConnection({
    host:'',
    user:'',
    password:'',
    database:''
});
db.connect();
module.exports = db;

<db.js>

var mysql = require('mysql');
var db = mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'******',
    database:'opentutorials'
});
db.connect();
module.exports = db;

웹애플리케이션 코드 정리정돈

정리정돈의 목표는 main.js를 깔끔하게 만드는 것이다!

  1. lib directory에 topic.js 모듈 추가
  2. 홈 화면 UI를 구성하는 부분을 topic.js로 이동
  3. 내보내기를 위해 topic.jsexports.home = function(request, response){~}
  4. 불러오기를 위해 main.js에 `var topic = require('./lib/topic');
  5. 이동한 코드가 기존에 사용됐던 위치에 topic.home(request, response); 대체
  6. 새로운 모듈로 이동한 코드에서 필요하기 때문에 불러와야 하는 모듈 설정
var db = require('./db');
var template = require('./template.js');

주의 : main.js와 다르게, topic.js와는 같은 directory(lib)에 위치해있기 때문에, main.js에서의 경로를 그대로 복사붙여넣기하면 안된다! (/lib 삭제)
주의 : 하나의 모듈에 하나의 함수를 구현했을 때엔, module.exports = ~를 사용했었지만, 하나의 모듈에 여러 함수를 구현할 때엔 exports = ~를 사용한다.

//topic.js
var db = require('./db');
var template = require('./template.js');

exports.home = function(request, response){
  db.query(`SELECT * FROM topic`, function(error,topics){
    var title = 'Welcome';
    var description = 'Hello, Node.js';
    var list = template.list(topics);
    var html = template.HTML(title, list,
                             `<h2>${title}</h2>${description}`,
                             `<a href="/create">create</a>`
                            );
    response.writeHead(200);
    response.end(html);
  });
}

//main.js
//...
if(queryData.id === undefined){
  topic.home(request, response);
}
//...

상세보기를 구현하는 코드도 위의 방법과 동일하게 분리시킨다.

  1. lib directory에 topic.js 모듈 계속 이용
  2. 상세화면 UI를 구성하는 부분을 topic.js로 이동
  3. 내보내기를 위해 topic.jsexports.page = function(request, response){~}
  4. 불러오기를 위해 main.js에 `var topic = require('./lib/topic');
  5. 이동한 코드가 기존에 사용됐던 위치에 topic.page(request, response); 대체
  6. 새로운 모듈로 이동한 코드에서 필요하기 때문에 불러와야 하는 모듈 설정
//topic.js
var url = require('url');
//...
exports.page = function(request, response) {
  var _url = request.url;
  var queryData = url.parse(_url, true).query;
  //상세화면 UI 구현 코드
  
//main.js
//...
else {
  topic.page(request, response);
}
//...

위의 방법과 같이
create, create_process, update, update_process, delete_process 코드를 모두 topic.js 모듈로 이동하여 동일한 방법을 적용하면, 최종 코드는 훨씬 간결해진 것을 볼 수 있다.

<main.js>

var http = require('http');
var url = require('url');
var topic = require('./lib/topic');
 
var app = http.createServer(function(request,response){
    var _url = request.url;
    var queryData = url.parse(_url, true).query;
    var pathname = url.parse(_url, true).pathname;
    if(pathname === '/'){
      if(queryData.id === undefined){
        topic.home(request, response);
      } else {
        topic.page(request, response);
      }
    } else if(pathname === '/create'){
      topic.create(request, response);
    } else if(pathname === '/create_process'){
      topic.create_process(request, response);
    } else if(pathname === '/update'){
      topic.update(request, response);
    } else if(pathname === '/update_process'){
      topic.update_process(request, response);
    } else if(pathname === '/delete_process'){
      topic.delete_process(request, response);
    } else {
      response.writeHead(404);
      response.end('Not found');
    }
});
app.listen(3000);
profile
뭐든 다해보려는 공대생입니다
post-custom-banner

0개의 댓글