지금까지 대부분의 코드를 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
를 깔끔하게 만드는 것이다!
topic.js
모듈 추가topic.js
에 exports.home = function(request, response){~}
main.js
에 `var topic = require('./lib/topic');topic.home(request, response);
대체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);
}
//...
상세보기를 구현하는 코드도 위의 방법과 동일하게 분리시킨다.
topic.js
모듈 계속 이용topic.js
에 exports.page = function(request, response){~}
main.js
에 `var topic = require('./lib/topic');topic.page(request, response);
대체//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);