https://github.com/azat-co/practicalnode
GitHub - azat-co/practicalnode: Practical Node.js, 1st and 2nd Editions [Apress] ๐
Practical Node.js, 1st and 2nd Editions [Apress] ๐ - GitHub - azat-co/practicalnode: Practical Node.js, 1st and 2nd Editions [Apress] ๐
github.com
Express.js๋?
Express.js๋ Node.js ํต์ฌ ๋ชจ๋์ธ http์ Connect ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์น ํ๋ ์์ํฌ๋ค.
์ปดํฌ๋ํธ๋ค์ ๋ฏธ๋ค์จ์ด๋ผ๊ณ ํ๋ฉฐ, "๊ท์ฝ๋ณด๋ค๋ ์ค์ "์ด๋ผ๋ ์ฒ ํ์ ๊ฐ์ง๋ค.
(REST) API ์๋ฒ == ์๋ ํฌ์ธํธ(end point) == ๋ผ์ฐํฐ(route)
์๋ฌดํผ ๊ฐ์, ๊ทธ๋ฅ ์์ผ๋ก Node.js๋ฅผ ์ฐ๋ฉด ์ง์ ๊ตฌํํด์ผ ํ๋ ์ฝ๋๊ฐ ๋ง๊ณ ... ์ค๋ณต๋ ๋๊ธฐ ๋๋ฌธ์
์ด๋ฅผ ํ๋ ์์ํฌ๋ก ํด๊ฒฐํ๋ค๋ ๊ฒ!...
๊ทธ๋ฐ Node.js ํ๋ ์์ํฌ ์ค ํ๋๊ฐ Express.js์ด๋ค.
๊ทธ์ธ์ ๋ค์ํ๊ฒ ์๋ค.
์ฑ ์์๋ ํ๋ ์์ํฌ๋ฅผ ์ ๊ณ ๋ฅด๋ ๋ฐฉ๋ฒ๋ ์๊ฐํ๊ณ ์๋ค...
Express.js ๋์ ๋ฐฉ์
Express.js ์ main ํ์ผ์ ์ง์ ์ ์์๋,
1. ์ปจํธ๋กค๋ฌ, ์ ํธ๋ฆฌํฐ, ํฌํผ, ๋ชจ๋ธ ๊ฐ์ ์์ฒด ๋ชจ๋ + ์๋ํํฐ ์์กด ๋ชจ๋ ํฌํจ
2. ํ ํ๋ฆฟ ์์ง๊ณผ ํ์ผ ํ์ฅ๋ช ๊ณผ ๊ฐ์ Express.js ์ ํ๋ฆฌ์ผ์ด์ ์ค์
3. DB ์ฐ๊ฒฐ
4. ์๋ฌ ํธ๋ค๋ฌ, ์ ์ ํ์ผ ํด๋, ์ฟ ํค ๊ฐ์ ๋ฏธ๋ค์จ์ด ์ ์ (์ ํ)
5. ๋ผ์ฐํธ ์ ์
6. ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ๋ ์์
7. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋๋ก ๋ด๋ณด๋. (์ ํ)
Express.js ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ณ ์์ ๋, ์์ฒญ์ ๊ธฐ๋ค๋ฆฐ๋ค.
์์ ๋ ๊ฐ ์์ฒญ๋ค์ ๋ฏธ๋ค์จ์ด์ ๋ผ์ฐํธ๋ค์ด ์ ์๋ ์์๋๋ก ์ฒ๋ฆฌ๋๋ค.
(ํ์ผ์์ ์์ชฝ์ ์์นํ ๋ผ์ฐํธ๋ ๋ฏธ๋ค์จ์ด๋ ์๋์ชฝ์ ์์นํ ๋ผ์ฐํธ๋ ๋ฏธ๋ค์จ์ด๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค.)
๋ฏธ๋ค์จ์ด๋ HTTP ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ, ์ค๊ฐ์ ์์นํ๊ธฐ ๋๋ฌธ์ ๋ฏธ๋ค์จ์ด...๋ผ๊ณ ํ๋ค.
๋ญ ํ๋๋ฉด...
1. ์ฟ ํค ์ ๋ณด๋ฅผ ํ์ฑํด์ req ๊ฐ์ฒด์ ์ ์ฅํจ.
2. URL๋ก๋ถํฐ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ฑํด์ req ๊ฐ์ฒด์ ์ ์ฅํจ.
3. ์ฌ์ฉ์๊ฐ ์ธ์ฆ๋๋ฉด(์ฟ ํค ๋๋ ์ธ์ ) ํ๋ผ๋ฏธํฐ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก DB์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ req ๊ฐ์ฒด์ ์ ์ฅํจ.
4. ์ฌ์ฉ์ ๋๋ ์์ฒญ์ ์ธ์ฆํ๋ค.
5. ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ณ ์๋ต์ ๋ง์น๋ค.
Express.js ์ค์น
์ค์น ๊ณผ์ ์ ์๋ต...
๋๋ 4.18.2 ๋ฒ์ ์ธ๋ฐ ์ฑ ์์๋ 4.1.2 ๋ฒ์ ์ด๋ผ๊ณ ํ๋ค.
Express.js์ ๋ผ์ฐํธ
app.use('/', routes);
app.use('/users', users);
URL์ ์ฒ๋ฆฌํ ๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ผ๋ฉฐ, ๋งจ ๋์ ์์นํ ์ฌ๋์(/)๊ฐ ์กด์ฌํ๋ค๊ณ ์ฌ๊ธด๋ค.
Express.js๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ํฌํจํ ๋ผ์ฐํ ์ ๊ฐ๋ฐ์๋ค์ด ํ์ฉํ์ง ์๋๋ค.
ํ์ง๋ง ์์ฒด ๋ฏธ๋ค์จ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ ํ์๋ผ๊ณ ํ๋ค.
app.use(function(req, res, next){
if(req.query.id && req.query.ref)
{
// id && ref querystring
next();
}
else if(req.query.author)
{
// author querystring
next();
}
else if(req.query.id)
{
// id querystring
next();
}
})
HTTP ์์ฒญ์ ๋ชจ๋ ๋ด์ฉ์ req์ ์๊ณ , ์๋ต ๊ฒฐ๊ณผ๋ฅผ res์ ์์ฑํ๋ค.
Express.js์ ์ค์ถ์ธ ๋ฏธ๋ค์จ์ด
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
//...
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
๋ฏธ๋ค์จ์ด์๋ ์ ์ฉํ ๋์์ ํ๊ฑฐ๋ ์์ฒญ์ด ์คํ๋๋ ๋ฐ ๋์์ด ๋๋ ๋ฌด์ธ๊ฐ๋ฅผ ์ถ๊ฐํ๋ ํจ์ค์ค๋ฃจ(pass-through) ํจ์๊ฐ ์๋ค.
์๋ฅผ ๋ค๋ฉด, bodyParser()์ cookieParser()๋ ๊ฐ๊ฐ HTTP ์์ฒญ ํ์ด๋ก๋(req.body)์ ํ์ฑ๋ ์ฟ ํค ๋ฐ์ดํฐ(req.cookie)๋ฅผ ์ถ๊ฐํ๋ค.
Express.js ์ ํ๋ฆฌ์ผ์ด์ ์ค์
app.js
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
bin/www
app.set('port', process.env.PORT || 3000);
๋ธ๋ก๊ทธ ํ๋ก์ ํธ ๊ฐ์
์ ์ ๊ด์
- ๊ธ ๋ชฉ๋ก์ด ์๋ ํํ์ด์ง
- ๊ธ ์ ๋ฌธ์ด ์๋ ๊ฐ๋ณ ํ์ด์ง
- ๋ด์ฉ์ ์ฃ๊ณ ์ญ์ ํ๋ ๊ด๋ฆฌ์ ํ์ด์ง
- ์์ ์ธ๊ธํ ๊ด๋ฆฌ์ ํ์ด์ง์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ก๊ทธ์ธ ํ์ด์ง
- ์๋ก์ด ๋ด์ฉ์ ์ถ๊ฐํ ์ ์๋ ๊ธ ํ์ด์ง
๊ฐ๋ฐ์ ๊ด์
- ๋ฉ์ธ ํ์ผ app.js
- ๋ผ์ฐํธ
- Node.js ํ๋ก์ ํธ ํ์ผ package.json
- node_modules ๋ด ์์กด ๋ชจ๋
- DB
- ํ ํ๋ฆฟ
- ์ ์ ํ์ผ
-์ค์ ํ์ผ
Express.js 4 Hello World ์์
ํด๋ ์ ์ ํ๊ธฐ
views: Jade(๋๋ ๋ค๋ฅธ ํ ํ๋ฆฟ ์์ง) ํ์ผ
public: HTML, CSS, ์๋ฐ์คํฌ๋ฆฝํธ(๋ธ๋ผ์ฐ์ ), Stylus(๋๋ ๊ทธ ์ธ ๋ชจ๋ CSS ํ๋ ์์ํฌ ํ์ผ)๋ฅผ ํฌํจํ ๋ชจ๋ ์ ์ (ํ๋ก ํธ์๋) ํ์ผ
NPM init๊ณผ package.json
- Express
- Jade
- Mongoskin
- Stylus
์์กด ๋ชจ๋ ์ ์ธ: npm install
App.js ํ์ผ
๋ฉ์ธ Express.js ํ์ผ์ ์ ํ์ ์ธ ๊ตฌ์กฐ๋ ๋ค์ ๋ถ๋ถ์ ํฌํจํ๋ค.
1. ์์กด ๋ชจ๋ ํ์
2. ์ค์
3. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ (์ ํ)
4. ๋ฏธ๋ค์จ์ด ์ ์
5. ๋ผ์ฐํธ ์ ์
6. ์๋ฒ ์์
7. ํด๋ฌ์คํฐ๋ฅผ ์ด์ฉํ์ฌ ์์ ์ค๋ ๋ ์์ (์ ํ)
์ฌ๊ธฐ์ ์์๊ฐ ๋งค์ฐ ์ค์ํ๋ค.
์์ฒญ์ ์ผ๋ จ์ ๋ฏธ๋ค์จ์ด๋ฅผ ๋ฐ๋ผ ์์์๋ถํฐ ์์๋๋ก ์คํ๋๋ค.
app.js์ ๋ช ๊ฐ์ง ์ค์
- port: ์์ฒญ์ ๊ธฐ๋ค๋ฆด ์๋ฒ์ ๋ฒํธ
- views: ํ ํ๋ฆฟ์ด ์๋ ํด๋์ ์ ๋ ๊ฒฝ๋ก
- view engine: ํ ํ๋ฆฟ ํ์ผ์ ํ์ผ ํ์ฅ์(์. jade, html)
๋ฏธ๋ค์จ์ด์ ๋ ๊ฐ์ง ํํ
1. ์ธ๋ถ(์๋ํํฐ) ๋ชจ๋์์ ์ ์
2. ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋์์ ์ ์ (์. app.use(function(req, res, next)){...};)
๋ผ์ฐํธ
๋ผ์ฐํธ๋ ์ ํด์ง ์์๋๋ก ์ฒ๋ฆฌ๋๋ค. ๋ณดํต ๋ผ์ฐํธ๋ ๋ฏธ๋ค์จ์ด ๋ค์์ ์์นํ์ง๋ง, ์ผ๋ถ ๋ฏธ๋ค์จ์ด๋ ๋ผ์ฐํฐ ๋ค์ ์์นํ๊ธฐ๋ ํ๋ค. ๋ผ์ฐํธ ๋ค์ ์์นํ ๋ฏธ๋ค์จ์ด์ ๋ํ์ ์ธ ์๋ ์๋ฌ ํธ๋ค๋ฌ๋ค.
// ์์กด ๋ชจ๋ ํฌํจ
var express = require('express');
var http = require('http');
var path = require('path');
var app = express(); // express ๊ฐ์ฒด ์ด๊ธฐํ
// ์ค์
app.set('appName', 'hello-world');
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// ๋ฏธ๋ค์จ์ด
// ๋ผ์ฐํฐ
app.all('*', (req, res) => {
res.render('index', {msg: 'Welcome to Practical Node.js!'})
})
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port' + app.get('port'));
})
Jade ์๊ฐ
1. ์ฒซ ๋ฒ์งธ ๋จ์ด๋ HTML ํ๊ทธ(HTML ์์)๋ก ์ฌ์ฉ๋๊ณ ,
2. ๊ทธ ๋ค์ ๋ฐ๋ผ์ค๋ ํ ์คํธ(๋ด๋ถ ํ ์คํธ)๋ ์ด ์์ ์์ ์์นํ๋ค.
views/index.jade
h1 hello
p= msg
Hello World App ์คํํ๊ธฐ