Node.js & MySQL Study 3

main.js refactoring

이제 어느정도 기본적인 기능을 구현해놓으니 main.js 가 제법 길어지고 복잡해졌습니다.

main.js 가 좀더 단순해지고 가독성이 높아졌으면 좋겠어서 코드 리팩토링을 한번 하고 가겠습니다.

리팩토링을 통해 가독성을 높일 수 있고, 나중에 있을 유지/보수에도 기여할 수 있을겁니다.





목표

main.js 가 도맡아 하던 일들을 몇개의 모듈로 나눠 관리하려합니다.

  • db.js : 데이터베이스 연결에 필요한 정보를 main.js 에서 따로 빼내 관리하는 모듈
  • topic.js : 글 상세보기, 생성, 수정 등의 여러 기능들을 구현해 둔 모듈



db.js

db.js

1
2
3
4
5
6
7
8
9
10
var mysql = require('mysql');

var db = mysql.createConnection({
host: 'localhost',
user: 'joyoon',
password: '1234',
database: 'opentutorials'
});

module.exports = db;

main.js 에 데이터베이스 연결에 필요한 로그인 정보들이 노출되면 안되기 때문에 db.js 모듈에 따로 관리합니다.

그렇기 때문에 버전 관리시에도 이 모듈은 포함시켜선 안됩니다.

하나의 property? 만 모듈에 존재할 경우, module.exports = db 와 같이 module.exports 를 이용해 export 합니다.





topic.js

topic.js 에는 여러개의 기능별 함수들을 모두 포함하고 있기 때문에 아래와 같이 사용합니다.

/lib/topic.js

1
2
3
4
5
6
exports.aa = function(){
/* TO DO */
}
exports.bb = function(int1, int2){
/* TO DO */
}

`main.js`
1
2
3
4
var topic = require('/lib/topic.js');

topic.aa();
topic.bb(1, 2);


'Home' 페이지를 구현하는 부분만 예를 들어보겠습니다.
`./lib/topic.js`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var db = require('./db.js');
var template = require('./template.js');
exports.index = function(request, response){
db.query(`SELECT * FROM topic`, function(error, topics){
if(error){
console.log("index error");
throw error;
}
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`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var http = require('http');
var url = require('url');
var db = require('./lib/db.js');
var topic = require('./lib/topic.js');

db.connect();

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.index(request, response); // 'home' 페이지 구현
else /* TO DO */
}
else if(pathname === '/create') /* TO DO */
else if(pathname === '/create_process') /* TO DO */
else if(pathname === '/update') /* TO DO */
else if(pathname === '/update_process') /* TO DO */
else if(pathname === '/delete_process') /* TO DO */
else {
response.writeHead(404);
response.end('Not found');
}
});
이런식으로 하면 되겠습니다.
단순히 코드를 `topic.js` 로 옮기고, 필요한 의존성들을 찾아서 추가해주는 식입니다.



전체 소스코드

main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var http = require('http');
var url = require('url');
var db = require('./lib/db.js');
var topic = require('./lib/topic.js');

db.connect();

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.index(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(request, response);
else {
response.writeHead(404);
response.end('Not found');
}
});
app.listen(3000);

db.js

1
2
3
4
5
6
7
8
9
10
var mysql = require('mysql');

var db = mysql.createConnection({
host: 'localhost',
user: 'joyoon',
password: '1234',
database: 'opentutorials'
});

module.exports = db;

topic.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
var url = require('url');
var qs = require('querystring');
var db = require('./db.js');
var template = require('./template.js');

exports.index = function(request, response){
db.query(`SELECT * FROM topic`, function(error, topics){
if(error){
console.log("index error");
throw error;
}
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);
});
}

exports.page = function(request, response){
var _url = request.url;
var queryData = url.parse(_url, true).query;
db.query(`SELECT * FROM topic`, function(error, topics){
if(error){
console.log("page error");
throw error;
}
db.query(`SELECT * FROM topic LEFT JOIN author ON topic.author_id=author.id WHERE topic.id=?`, [queryData.id], function(error, topic){

var title = topic[0].title;
var list = template.list(topics);
var description = topic[0].description;
var html = template.HTML(title, list,
`<h2>${title}</h2>${description}
<p>by ${topic[0].name}</p>`,
` <a href="/create">create</a>
<a href="/update?id=${queryData.id}">update</a>
<form action="delete_process" method="post">
<input type="hidden" name="id" value="${queryData.id}">
<input type="submit" value="delete">
</form>`);
response.writeHead(200);
response.end(html);
});
});
}

exports.create = function(request, response){
db.query(`SELECT * FROM topic`, function(error, topics){
db.query(`SELECT * FROM author`, function(error, authors){
var title = 'WEB - create';
var list = template.list(topics);
var html = template.HTML(title, list,
`<form action="/create_process" method="post">
<p><input type="text" name="title" placeholder="title"></p>
<p>
<textarea name="description" placeholder="description"></textarea>
</p>
<p>
${template.selectAuthor(authors)}
</p>
<p>
<input type="submit">
</p>
</form>`,
'');
response.writeHead(200);
response.end(html);
});
});
}

exports.create_process = function(request, response){
var body = '';
request.on('data', function(data){
body = body + data;
});
request.on('end', function(){
var post = qs.parse(body);
var title = post.title;
var description = post.description;
var author = post.author_id

db.query(`INSERT INTO topic (title, description, created, author_id) VALUES(?, ?, NOW(), ?)`, [title, description, author], function(error, result){
if(error) throw error;
response.writeHead(302, {Location: `/?id=${result.insertId}`});
response.end();
});
});
}

exports.update = function(request, response){
var _url = request.url;
var queryData = url.parse(_url, true).query;
db.query(`SELECT * FROM topic`, function(error, topics){
db.query(`SELECT * FROM topic WHERE id=?`, [queryData.id], function(error, topic){
db.query(`SELECT * FROM author`, function(error, authors){
var id = topic[0].id;
var title = topic[0].title;
var list = template.list(topics);
var description = topic[0].description;
var html = template.HTML(title, list,
`<form action="/update_process" method="post">
<input type="hidden" name="id" value="${id}">
<p><input type="text" name="title" placeholder="title" value="${title}"></p>
<p>
<textarea name="description" placeholder="description">${description}</textarea>
</p>
<p>
${template.selectAuthor(authors, topic[0].author_id)}
</p>
<p>
<input type="submit">
</p>
</form>`,
`<a href="/create">create</a> <a href="/update?id=${id}">update</a>`);
response.writeHead(200);
response.end(html);
});
});
});
}

exports.update_process = function(request, response){
var body = '';
request.on('data', function(data){
body = body + data;
});
request.on('end', function(){
var post = qs.parse(body);
var id = post.id;
var title = post.title;
var description = post.description;
var author = post.author_id;
db.query(`UPDATE topic SET title=?, description=?, author_id=? WHERE id=?`, [title, description, author, id], function(error, result){
response.writeHead(302, {Location: `/?id=${id}`});
response.end();
});
});
}

exports.delete = function(request, response){
var body = '';
request.on('data', function(data){
body = body + data;
});
request.on('end', function(){
var post = qs.parse(body);
var id = post.id;
db.query(`DELETE FROM topic WHERE id=?`, [id], function(error, result){
response.writeHead(302, {Location: `/`});
response.end();
});
});
}