SlideShare a Scribd company logo
Node.js ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์›น ๊ฐœ๋ฐœ framework๋ฅผ ์ œ๊ณตํ•œ๋‹ค! 
Paypal์ด ๋‚ด๋ถ€ ์‹œ์Šคํ…œ์„ ๋Œ€๊ทœ๋ชจ๋กœ node.js๋กœ ์ „ํ™˜ํ•˜๋ฉด์„œ! 
์˜คํ”ˆ์†Œ์Šคํ™”ํ•œ KarkenJs , Meteo ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ framework๊ฐ€ ์žˆ๋‹ค! 
! 
๊ทธ ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” 
EXPRESS! 
! 
Express ๋Š” ์›นํŽ˜์ด์ง€ ๊ฐœ๋ฐœ ๋ฐ REST API ๊ฐœ๋ฐœ์— ! 
์ตœ์ ํ™”๋œ framework๋กœ์„œ ๋งค์šฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค
EXPRESS 
NEW VERSION TUTORIAL 
Fast, unopinionated, minimalist web framework for Node.js 
YNCA STUDY 2ND โ€“EXPRESS 
BY NHN NEXT ๋ฅ˜์šฐ๋ฆผ 
DIRECTOR.RYU
EXPRESS MODULE 
http ๋ชจ๋“ˆ์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์„œ 
์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ๋ชจ๋“ˆ 
์ž‘๊ณ  ๋น ๋ฅด๋‹ค
EXPRESS FRAMEWORK 
express ๋ชจ๋“ˆ๋กœ ๋งŒ๋“  ํ”„๋ ˆ์ž„์›Œํฌ 
! 
ํ”„๋กœ์ ํŠธ๋ฅผ ์†์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค 
๊ธฐ๋ณธ์ ์ธ ๋ทฐ ์ง€์›, ์„ธ์…˜ ์ง€์› 
!
EXPRESS INSTALL 
์ฝ˜์†”์ฐฝ์—์„œ (Mac OS)! 
$sudo npm install express -g! 
[ sudo ] password for USER : **** 
$ sudo npm install -g express-generator
DIRECTORY 
๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ ,! 
๊ทธ ์•ˆ์— express ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑํ•˜๊ธฐ! 
[~] $ mkdir blackANDwhite 
[~] $ cd blackANDwhite 
[blackANDwhite] $ express blackANDwhite 
--sessions --css stylus 
&& cd blackANDwhite
DIRECTORY 
์„ธ์…˜์— ๋Œ€ํ•œ ์ง€์›์„ ์œ„ํ•ด์„œ โ€”sessions ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค 
! 
โ€”css ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, Stylus CSS engine์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค 
default : vanilla CSS
[blackANDwhite] $ npm install 
[blackANDwhite] $ DEBUG=blackANDwhite ./bin/www 
!!! 
[blackANDwhite] $ DEBUG=blackANDwhite ./bin/www 
blackANDwhite Express server listening on port 
3000 +0ms 
GET / 304 273.620 ms - - 
GET /stylesheets/style.css 200 79.352 ms - 110 
GET /favicon.ico 404 24.240 ms - 1302
INSTALL THE DEPENDENCIES 
FOR THE APP 
$ npm install 
์‘์šฉํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ ๋ฌด๋ฆฌ ์„ค์น˜ํ•˜๊ธฐ 
- ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธ์€ ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ๋‹ค 
$ node app 
Express server listening on port 3000
LOAD 
IN YOUR BROWSER 
HTTP://LOCALHOST:3000/
LOAD 
IN YOUR BROWSER
HOW IT WORKS 
how a request to an Express server flows 
! 
Route โ†’ Route Handler โ†’ Template โ†’ HTML 
!
SETTING UP THE 
ROUTES 
์šฐ๋ฆฌ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋” ์ ํ•ฉํ•˜๊ฒŒ, 
๋” ๋…ผ๋ฆฌ์ ์ด๊ฒŒ, 
์ต์Šคํ”„๋ ˆ์Šค์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์ดํ•ด๊ฐ€ ๋” ์‰ฝ๋„๋ก, 
! 
์ƒ์„ฑ๋œ ์ต์Šคํ”„๋ ˆ์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ž
1. routes ํด๋”์— ์žˆ๋Š” index.js and user.js ๋ฅผ ์ง€์›์‹œ๋‹ค. 
(ํ„ฐ๋ฏธ๋„์—์„œ open routes ํ•˜๋ฉด FINDER๋กœ ์—ด๋ฆผ) 
! 
2. routes ํด๋” ์•ˆ์— store.js ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ์‹œ๋‹ค. 
! 
3. ๊ทธ๋ฆฌ๊ณ  ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ store.js ํŒŒ์ผ ์•ˆ์— ์ ์–ด๋„ฃ์์‹œ๋‹ค. 
! 
exports.home = function(req, res){ 
res.render('home', { title: 'Ninja Store' }) 
}; 
! 
4. Rename the index.jade file in the views folder to home.jade.
APP.JS 
MODIFICATION 
app.js ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ค๋‹ˆ๋‹ค 
์ฃผ์„์ฒ˜๋ฆฌ : delete ํ•  ๋ถ€๋ถ„ 
11๋ฒˆ, 32๋ฒˆ ์ค„์„ ์ถ”๊ฐ€ํ•ด์ค„ ๋ถ€๋ถ„ 
//var routes = require('./routes/index'); 
9 //var users = require('./routes/users'); 
10 
11 var store = require(โ€˜./routes/store'); 
!! 
28 
29 //app.use('/', routes); 
30 //app.use('/users', users); 
31 
32 app.get('/', store.home); 
! 
=> ํ™ˆํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.
SERVER RESTART 
[blackANDwhite] $ DEBUG=blackANDwhite ./bin/www 
!!!! 
localhost:3000
! 
exports.home = function(req, res){ 
res.render('home', { title: 'Ninja Store' }) 
}; 
! 
title ๋ณ€์ˆ˜๋Š” 
=title 
!=title 
#{title} 
๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค 
! 
ex) p Welcome to #{title} 
p= title 
p!= title
ROUTES DIRECTORY 
์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. 
! 
์šฐ๋ฆฌ๋Š” routes directory์—์„œ ์ด๋ฆ„์žˆ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. 
๊ทธ ํŒŒ์ผ์€ ์šฐ๋ฆฌ๊ฐ€ app.js์—์„œ ์ •์˜๋‚ด๋ฆฐ route๋ฅผ ๋‹ค๋ฃฌ๋‹ค (์ฒ˜๋ฆฌํ•œ๋‹ค). 
! 
์šฐ๋ฆฌ๋Š” ์ด ํŒŒ์ผ๋“ค์„ ์šฐ๋ฆฌ์˜ app์œผ๋กœ import ํ•˜๊ณ , 
๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ ํŒŒ์ผ๋“ค์— ๊ธฐ๋Šฅ์„ ํ• ๋‹นํ•œ๋‹ค. 
!
JADE 
Node Template Engine 
node.js์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ view ํ…œํ”Œ๋ฆฟ ์—”์ง„ 
! 
! 
Jade ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์„ 
html์ด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค
JADE FUNCTIONS 
ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ง€์› 
๋›ฐ์–ด๋‚œ ๊ฐ€๋…์„ฑ 
์œ ์—ฐํ•œ ๋„์–ด์“ฐ๊ธฐ 
๋ธ”๋Ÿญ ํ™•๋Œ€(block-expansion) 
๋ฏน์Šค์ธ(mixins, ์„ž์–ด์“ฐ๋Š” ๊ฒƒ) 
์Šคํƒœํ‹ฑ ์ธํด๋ฃจ๋“œ(static includes) 
์†์„ฑ ์ธํ„ฐํด๋ ˆ์ด์…˜(attribute 
interpolation) 
๋ณด์•ˆ์„ ์œ„ํ•ด ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด 
์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋œ๋‹ค. 
์ปดํŒŒ์ผ๊ณผ ๋Ÿฐํƒ€์ž„์‹œ์— ๋ฌธ๋งฅ์— ๋งž๋Š” 
์—๋Ÿฌ ์ถœ๋ ฅ 
์ปค๋งจ๋“œ ๋ผ์ธ์„ ํ†ตํ•ด jade ํ…œํ”Œ๋ฆฟ์„ 
์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Œ 
๋‹ค์ด๋‚ด๋ฏน๊ณผ ์Šคํƒœํ‹ฑ ํƒœ๊ทธ ํด๋ž˜์Šค ์กฐํ•ฉ 
ํ•„ํ„ฐ๋ฅผ ์ด์šฉํ•œ ํŠธ๋ฆฌ๊ตฌ์กฐ ํŒŒ์‹ฑ parse tree 
manipulation via filters 
ํ…œํ”Œ๋ฆฟ ์ƒ์† 
์™ธ๋ถ€ ๋ชจ๋“ˆ๋กœ Express JS ์ง€์› 
๊ฐ์ฒด, ๋ฐฐ์—ด, ๊ทธ๋ฆฌ๊ณ  ์—ด๊ฑฐํ˜•์ด ์•„๋‹Œ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋„ 
each ๋ฅผ ์ด์šฉํ•˜์—ฌ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ดํ„ฐ๋ ˆ์ด์…˜ ์ง€์› 
๋ธ”๋Ÿญ ์ฝ”๋ฉ˜ํŠธ 
tag๋ฅผ ์ด์šฉํ•œ ์ ‘๋‘์–ด์ฒ˜๋ฆฌ ์—†์Œ 
AST ํ•„ํ„ฐ 
html 5 ๋ชจ๋“œ (!!! 5 doctype) 
์„ ํƒ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ
ADD FUNCTIONS 
1. ์ด๋ฆ„ ์ž…๋ ฅ๋ฐ›๋Š” ์นธ์„ ๋งŒ๋“ค์ž 
2. ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋Š” โ€˜๋กœ๊ทธ์ธ ๋ฒ„ํŠผโ€™์„ ๋งŒ๋“ค์ž 
3. LOGO.PNG ํŒŒ์ผ์„ ๋“ฑ๋กํ•ด์„œ ๋กœ๊ณ ๋ฅผ ๋ณด์—ฌ์ฃผ์ž 
4. FOOTER๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ COPYRIGHT ๋“ฑ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์ž 
5. FOOTER์— ABOUT/CONTACT US ์ปจํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์ž 
์™„์„ฑ๋œ ํ™”๋ฉด
ADD FUNCTIONS 
home.jade ํŒŒ์ผ์— ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ค์‹œ๋‹ค. 
! 
extends layout 
! 
block content 
#wrapper 
#logo 
img(src='/images/logo.png') 
#display 
#login 
form(method='post') 
| Enter your name if you want to be a ninja 
div 
input(type='text', name='username') 
input(type='submit', value='Log In') 
#footer 
div Copyright ยฉ Ninja Store #{+new Date().getFullYear()} 
a(href='/page?name=about') About 
| | 
a(href='/page?name=contact') Contact Us 
๋กœ๊ณ  ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ 
๋กœ๊ทธ์ธ ์•ˆ๋‚ด๋ฌธ๊ตฌ, 
์ด๋ฆ„์ž…๋ ฅ์นธ, 
๋กœ๊ทธ์ธ ๋ฒ„ํŠผ
ADD FUNCTIONS 
๊ฐ์ž ์›ํ•˜๋Š” ๋กœ๊ณ ๋ฅผ logo.png ๋กœ ์ €์žฅํ•œ ๋’ค, 
/public/images/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•ด์ค์‹œ๋‹ค. 
! 
cd public 
open public ํ•ด์„œ images ํด๋”๋กœ ๋“ค์–ด๊ฐ„ ๋’ค์—, logo.png ๋ฅผ ๋„ฃ์–ด์ค์‹œ๋‹ค
ADD FUNCTIONS 
/public/stylesheets/ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋“ค์–ด๊ฐ€์„œ, 
style.styl ์— ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค์‹œ๋‹ค. 
(vi style.styl ์จ์„œ ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ”๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅ) 
body 
padding: 0 
font: 14px "Lucida Grande", Helvetica, Arial, sans-serif 
! 
a 
color: #0069FF 
#wrapper 
width: 450px 
margin: 0 auto 
padding: 40px 20px 
background: #fff 
! 
#logo 
text-align: center 
! 
#display 
margin: 20px 0 50px 
! 
#userbar 
margin-bottom: 10px
ADD FUNCTIONS 
home.jade ์— 
link(rel='stylesheet', href='/stylesheets/style.css') 
๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค 
! 
=> home.jade ๊ฐ€ stylesheets ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, 
css๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๋ถ€๋ถ„ 
!
SERVER RESTART ! 
๋‹ค์‹œ, ์„œ๋ฒ„๋ฅผ ๋Œ๋ ค๋ด…์‹œ๋‹ค ! 
! 
localhost : 3000
Express framework tutorial
ERROR: 
๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด, ์—๋Ÿฌ๊ฐ€ ๋‚˜์ฃ ? 
! 
์™œ? 
! 
์•„๊นŒ app.js ํŒŒ์ผ์— 
app.get('/', store.home); ๋ผ๊ณ  ์ผ์ฃ  
=> get ์š”์ฒญ๋งŒ ๋ฐ›๊ณ  ์žˆ์–ด์š” 
! 
But, ๋กœ๊ทธ์ธ ์‹œ Post ์š”์ฒญ์„ ํ•˜๊ณ  ์žˆ์ฃ  
๊ทธ๋ž˜์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์š”
GET / POST 
GET 
ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆ„๊ณผ ๊ฐ’์ด ๊ฒฐํ•ฉ๋œ ์ŠคํŠธ๋ง ํ˜•ํƒœ๋กœ ์ „๋‹ฌ 
! 
POST 
ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ์ƒํ˜ธ ์ •์˜๋˜์–ด ์žˆ๋Š” ํ˜•์‹๋Œ€๋กœ ๊ฐ’์„ ์ธ์ฝ”๋”ฉํ•œ ๋‹ค์Œ ์„œ 
๋ฒ„๋กœ ์ „์†ก 
!
GET VS POST 
! 
GET ๋ฐฉ์‹ 
- ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์งˆ์˜์–ด ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ์š”์ฒญ ์ž์ฒด๋ฅผ ์œ„ํ•œ ์ •๋ณด๋ฅผ 
์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ 
- GET ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ ˆ๋‹จ 
- GET ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์†Œ ์ž…๋ ฅ๋ž€์— ํ‘œ์‹œ๋˜๋ฏ€๋กœ ์ตœ์†Œํ•œ์˜ ๋ณด์•ˆ๋„ ์œ ์ง€๋˜ 
์ง€ ์•Š์Œ 
! 
POST ๋ฐฉ์‹ 
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ฐฑ์‹  ์ž‘์—…๊ณผ ๊ฐ™์€ ์„œ๋ฒ„์ธก์—์„œ์˜ ์ •๋ณด ๊ฐฑ์‹  ์ž‘์—…์„ ์›ํ•  ๋•Œ ์‚ฌ์šฉ 
- ์ผ์ •ํ•œ ํฌ๊ธฐ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ์—๋Š” POST ๋ฐฉ์‹์„ ์‚ฌ์šฉ 
- POST ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด GET ๋ฐฉ์‹์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋Šฆ์–ด์ง 
- ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉ โ†’ ์„œ๋ฒ„์ธก์—์„œ ๋””์ฝ”๋”ฉ
POST REQUEST 
app.js ํŒŒ์ผ์— ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค 
! 
app.post('/', store.home_post_handler); 
! 
! 
store.js ํŒŒ์ผ์— ์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค 
! 
exports.home_post_handler = function(req, res) { 
username = req.body.username || 'Anonymous'; 
req.session.username = username; 
res.redirect('/'); 
};
SESSION PROBLEM 
์„ธ์…˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ฃ ? 
! 
! 
$sudo npm install express-session 
! 
๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ณ์ค์‹œ๋‹ค !
SESSION API 
app.js ํŒŒ์ผ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์š” 
! 
var express = require('express') 
var session = require('express-session') 
! 
var app = express() 
! 
app.use(session({secret: 'keyboard cat'}))
STORE.JS 
store.js ํŒŒ์ผ์— ์žˆ๋Š” exports.home ์„ ๋ฐ‘์— ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•ด์ค๋‹ˆ๋‹ค 
! 
exports.home = function(req, res) { 
if (typeof req.session.username == 'undefined') 
res.render('home', { title: 'Ninja Store'}); 
else res.redirect('/items'); 
};
SERVER RESTART 
์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด๋ด…์‹œ๋‹ค 
! 
์—๋Ÿฌ ๋œจ์ฃ  ? 
! 
jade๋ฅผ ์šฐ์„  ๋‚˜๋ˆˆ ๋’ค์—, ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•ฉ์‹œ๋‹ค
JADE INCLUDE 
views ์•ˆ์— footer.jade ํŒŒ์ผ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค 
! 
#footer 
div Copyright ยฉ Ninja Store #{+new Date().getFullYear()} 
a(href='/page?name=about') About 
| | 
a(href='/page?name=contact') Contact Us
JADE INCLUDE 
views์— userbar.jade ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค 
! 
#userbar 
| Welcome 
b #{username} 
| | 
a(href='/items') Items 
| | 
a(href='/logout') Log Out
JADE INCLUDE 
home.jade ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. 
! 
extends layout 
! 
block content 
#wrapper 
#logo 
a(href='/') 
img(src='/images/logo.png') 
#display 
#login 
form(method='post') 
| Enter your name if you want to be a ninja 
div 
input(type='text', name='username') 
input(type='submit', value='Log In') 
include footer 
์ˆ˜์ •๋œ ๋ถ€๋ถ„
ADD 
app.js ์— items์™€ item์„ ์—ฐ๊ฒฐํ•ด์ค์‹œ๋‹ค 
! 
// display the list of item 
app.get('/items', store.items); 
// show individual item 
app.get('/item/:id', store.item);
DATABASE 
store.js ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค 
! 
// our 'database' 
var items = { 
SKN:{name:'Shuriken', price:100}, 
ASK:{name:'Ashiko', price:690}, 
CGI:{name:'Chigiriki', price:250}, 
NGT:{name:'Naginata', price:900}, 
KTN:{name:'Katana', price:1000} 
};
ADD 
store.js ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค 
! // handler for displaying the items 
exports.items = function(req, res) { 
// don't let nameless people view the items, redirect them back to the homepage 
if (typeof req.session.username == 'undefined') res.redirect('/'); 
else res.render('items', { title: 'Ninja Store - Items', username: req.session.username, 
items:items }); 
}; 
! // handler for displaying individual items 
exports.item = function(req, res) { 
// don't let nameless people view the items, redirect them back to the homepage 
if (typeof req.session.username == 'undefined') res.redirect('/'); 
else { 
var name = items[req.params.id].name; 
var price = items[req.params.id].price; 
res.render('item', { title: 'Ninja Store - ' + name, username: req.session.username, 
name:name, price:price }); 
} 
};
views ์— items.jade ๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค 
! 
extends layout 
! 
block content 
#wrapper 
#logo 
img(src='/images/logo.png') 
#display 
include userbar 
-for (var id in items) 
- var item = items[id] 
div 
a(href='/item/#{id}') #{item.name} - $#{item.price} 
include footer
views ์— item.jade ๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค 
! 
extends layout 
! 
block content 
#wrapper 
#logo 
img(src='/images/logo.png') 
#display 
include userbar 
p The #{name.toLowerCase()} is one of the must-have items for 
any aspiring ninja. It costs just $#{price} on our store. 
p Buy it today! 
include footer
LOGOUT 
app.js ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. 
! 
app.get('/logout', function(req, res) { 
delete req.session.username; 
res.redirect('/'); 
});
SERVER RESTART ! 
๋‹ค์‹œ, ์„œ๋ฒ„๋ฅผ ๋Œ๋ ค๋ด…์‹œ๋‹ค ! 
! 
localhost : 3000
VERY GOOD !!
์ถœ์ฒ˜/์ฐธ๊ณ  
! 
www.hacksparrow.com/express-js-tutorial.html๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฒˆ์—ญ ๋ฐ ์ฝ”๋“œ ๋ฒ„์ „์—…๋ฐ์ดํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

More Related Content

PDF
แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผแ„€แ…ขแ„‰แ…ฅแ†ซ แ„…แ…ฒแ„‹แ…ฎแ„…แ…ตแ†ท
PDF
SPDY : ๋” ๋น ๋ฅธ ์›น์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ
PDF
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ - ch5. web server
PPTX
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ 10แ„Œแ…กแ†ผ http2.0, 11แ„Œแ…กแ†ผ_แ„แ…ณแ†ฏแ„…แ…กแ„‹แ…ตแ„‹แ…ฅแ†ซแ„แ…ณแ„‰แ…ตแ†จแ„‡แ…งแ†ฏแ„€แ…ชแ„แ…ฎแ„แ…ต
DOCX
Comet
DOCX
์•„๋งˆ์กด Aws ์„œ๋น„์Šค_์—ฐ๊ตฌ
PDF
HTTP ์™„๋ฒฝ๊ฐ€์ด๋“œ- 19์žฅ ๋ฐฐํฌ์‹œ์Šคํ…œ
PPTX
HTTP ๋ฐœํ‘œ์ž๋ฃŒ - ๊น€์—ฐ์ˆ˜
แ„‰แ…ฅแ„‡แ…ฅแ„‰แ…ฅแ†ผแ„‚แ…ณแ†ผแ„€แ…ขแ„‰แ…ฅแ†ซ แ„…แ…ฒแ„‹แ…ฎแ„…แ…ตแ†ท
SPDY : ๋” ๋น ๋ฅธ ์›น์„ ์œ„ํ•œ ํ”„๋กœํ† ์ฝœ
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ - ch5. web server
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ 10แ„Œแ…กแ†ผ http2.0, 11แ„Œแ…กแ†ผ_แ„แ…ณแ†ฏแ„…แ…กแ„‹แ…ตแ„‹แ…ฅแ†ซแ„แ…ณแ„‰แ…ตแ†จแ„‡แ…งแ†ฏแ„€แ…ชแ„แ…ฎแ„แ…ต
Comet
์•„๋งˆ์กด Aws ์„œ๋น„์Šค_์—ฐ๊ตฌ
HTTP ์™„๋ฒฝ๊ฐ€์ด๋“œ- 19์žฅ ๋ฐฐํฌ์‹œ์Šคํ…œ
HTTP ๋ฐœํ‘œ์ž๋ฃŒ - ๊น€์—ฐ์ˆ˜

What's hot (20)

PDF
Http ์™„๋ฒฝ๊ฐ€์ด๋“œ(3์žฅ http ๋ฉ”์‹œ์ง€)
PPTX
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ 7แ„Œแ…กแ†ผ แ„แ…ขแ„‰แ…ต
PPTX
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ - ch15. ์—”ํ„ฐํ‹ฐ, ์ธ์ฝ”๋”ฉ (Entities and Encoding)
PPTX
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ 4แ„Œแ…กแ†ผ แ„แ…ฅแ„‚แ…ฆแ†จแ„‰แ…งแ†ซแ„€แ…ชแ†ซแ„…แ…ต
PDF
Http ์™„๋ฒฝ ๊ฐ€์ด๋“œ(2์žฅ url๊ณผ ๋ฆฌ์†Œ์Šค)
PDF
CoreDot TechSeminar 2018 - Session1 Park Jihun
PDF
[D2 CAMPUS]แ„‹แ…ฐแ†ธ แ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‰แ…ณแ„‘แ…ฆแ†จ : HTTP
PDF
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
PDF
Browser Principle์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.pdf
PDF
Http ํ—ค๋”
ย 
PPTX
Restful API guide
PPTX
๋ฆฌ์ŠคํŽ™ํ† ๋ง ์„ธ๋ฏธ๋‚˜ - ์›น ๋ธŒ๋ผ์šฐ์ € ๋™์ž‘ ๊ฐœ๋…, Node.js๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ดํ•ด, REST API
PPTX
REST API ์„ค๊ณ„
PDF
Play node conference
PDF
Node.js ์ฒซ๊ฑธ์Œ
PDF
HTTP/3 ์‹œ๋Œ€์˜ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ์ˆ  ์ดํ•ดํ•˜๊ธฐ
PPTX
Node.js DBMS short summary
PDF
์˜คํ”ˆ ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•œ ์บ์ฅฌ์–ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœ
PPTX
Node.js๋ฅผ ์‚ฌ์šฉํ•œ Big Data ์‚ฌ๋ก€์—ฐ๊ตฌ
PDF
HTTP/2์™€ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์•ˆ
Http ์™„๋ฒฝ๊ฐ€์ด๋“œ(3์žฅ http ๋ฉ”์‹œ์ง€)
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ 7แ„Œแ…กแ†ผ แ„แ…ขแ„‰แ…ต
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ - ch15. ์—”ํ„ฐํ‹ฐ, ์ธ์ฝ”๋”ฉ (Entities and Encoding)
HTTP แ„‹แ…ชแ†ซแ„‡แ…งแ†จแ„€แ…กแ„‹แ…ตแ„ƒแ…ณ 4แ„Œแ…กแ†ผ แ„แ…ฅแ„‚แ…ฆแ†จแ„‰แ…งแ†ซแ„€แ…ชแ†ซแ„…แ…ต
Http ์™„๋ฒฝ ๊ฐ€์ด๋“œ(2์žฅ url๊ณผ ๋ฆฌ์†Œ์Šค)
CoreDot TechSeminar 2018 - Session1 Park Jihun
[D2 CAMPUS]แ„‹แ…ฐแ†ธ แ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‰แ…ณแ„‘แ…ฆแ†จ : HTTP
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
Browser Principle์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.pdf
Http ํ—ค๋”
ย 
Restful API guide
๋ฆฌ์ŠคํŽ™ํ† ๋ง ์„ธ๋ฏธ๋‚˜ - ์›น ๋ธŒ๋ผ์šฐ์ € ๋™์ž‘ ๊ฐœ๋…, Node.js๋ฅผ ํ†ตํ•œ ์„œ๋ฒ„ ์ดํ•ด, REST API
REST API ์„ค๊ณ„
Play node conference
Node.js ์ฒซ๊ฑธ์Œ
HTTP/3 ์‹œ๋Œ€์˜ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ธฐ์ˆ  ์ดํ•ดํ•˜๊ธฐ
Node.js DBMS short summary
์˜คํ”ˆ ์†Œ์Šค๋ฅผ ํ™œ์šฉํ•œ ์บ์ฅฌ์–ผ ๊ฒŒ์ž„ ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐœ๋ฐœ
Node.js๋ฅผ ์‚ฌ์šฉํ•œ Big Data ์‚ฌ๋ก€์—ฐ๊ตฌ
HTTP/2์™€ ์›น ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ์•ˆ
Ad

Similar to Express framework tutorial (20)

PDF
แ„‹แ…กแ†ฏแ„‹แ…กแ„‡แ…ฉแ†ธแ„‰แ…ตแ„ƒแ…ก, Polymer: Web Components & Web Animations
PPTX
Nodejs, PhantomJS, casperJs, YSlow, expressjs
PPTX
Nodejs express
PDF
Portfolio
PDF
XECon+PHPFest2014 ๋ฐœํ‘œ์ž๋ฃŒ - ElasticSearch๋ฅผ ์ด์šฉํ•œ ํ†ตํ•ฉ๊ฒ€์ƒ‰ ๊ตฌ์ถ•๋ฐฉ๋ฒ• - ๊น€ํ›ˆ๋ฏผ
PPTX
Node js[stg]onimusha 20140822
PDF
Mean แ„‰แ…ณแ„แ…ขแ†จแ„‹แ…ณแ†ฏ แ„‰แ…กแ„‹แ…ญแ†ผแ„’แ…กแ†ซ IoT แ„€แ…ขแ„‡แ…กแ†ฏ
PPTX
์š”์ฆ˜์›น๊ฐœ๋ฐœ
PPTX
Startup JavaScript 8 - NPM, Express.JS
PDF
Create-React-App์œผ๋กœ SSR์„ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋ฐฐ์šด ์  (feat. TypeScript)
PPTX
Node.js์˜ ๋„์ž…๊ณผ ํ™œ์šฉ
PDF
Front-end Development Process - ์–ด๋””๊นŒ์ง€ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‚˜
PDF
20131217 html5
ย 
PDF
Progressive Web Apps
PDF
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
PDF
What's new in IE11
PDF
์กฐ์€ - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
ย 
PPTX
Nest js 101
PDF
NODE.JS ๊ธ€๋กœ๋ฒŒ ๊ธฐ์—… ์ ์šฉ ์‚ฌ๋ก€ ๊ทธ๋ฆฌ๊ณ , real-time ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ
PDF
Amazed by aws 2nd session
แ„‹แ…กแ†ฏแ„‹แ…กแ„‡แ…ฉแ†ธแ„‰แ…ตแ„ƒแ…ก, Polymer: Web Components & Web Animations
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs express
Portfolio
XECon+PHPFest2014 ๋ฐœํ‘œ์ž๋ฃŒ - ElasticSearch๋ฅผ ์ด์šฉํ•œ ํ†ตํ•ฉ๊ฒ€์ƒ‰ ๊ตฌ์ถ•๋ฐฉ๋ฒ• - ๊น€ํ›ˆ๋ฏผ
Node js[stg]onimusha 20140822
Mean แ„‰แ…ณแ„แ…ขแ†จแ„‹แ…ณแ†ฏ แ„‰แ…กแ„‹แ…ญแ†ผแ„’แ…กแ†ซ IoT แ„€แ…ขแ„‡แ…กแ†ฏ
์š”์ฆ˜์›น๊ฐœ๋ฐœ
Startup JavaScript 8 - NPM, Express.JS
Create-React-App์œผ๋กœ SSR์„ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋ฐฐ์šด ์  (feat. TypeScript)
Node.js์˜ ๋„์ž…๊ณผ ํ™œ์šฉ
Front-end Development Process - ์–ด๋””๊นŒ์ง€ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‚˜
20131217 html5
ย 
Progressive Web Apps
[TECHCON 2019: MOBILE - Android]2.์˜ˆ์ œ์—์„œ๋Š” ์•Œ๋ ค์ฃผ์ง€ ์•Š๋Š” Model ์ด์•ผ๊ธฐ
What's new in IE11
์กฐ์€ - AMP PWA 101 [WSConf.Seoul.2017. Vol.2]
ย 
Nest js 101
NODE.JS ๊ธ€๋กœ๋ฒŒ ๊ธฐ์—… ์ ์šฉ ์‚ฌ๋ก€ ๊ทธ๋ฆฌ๊ณ , real-time ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœํ•˜๊ธฐ
Amazed by aws 2nd session
Ad

Express framework tutorial

  • 1. Node.js ๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์›น ๊ฐœ๋ฐœ framework๋ฅผ ์ œ๊ณตํ•œ๋‹ค! Paypal์ด ๋‚ด๋ถ€ ์‹œ์Šคํ…œ์„ ๋Œ€๊ทœ๋ชจ๋กœ node.js๋กœ ์ „ํ™˜ํ•˜๋ฉด์„œ! ์˜คํ”ˆ์†Œ์Šคํ™”ํ•œ KarkenJs , Meteo ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ framework๊ฐ€ ์žˆ๋‹ค! ! ๊ทธ ์ค‘ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” EXPRESS! ! Express ๋Š” ์›นํŽ˜์ด์ง€ ๊ฐœ๋ฐœ ๋ฐ REST API ๊ฐœ๋ฐœ์— ! ์ตœ์ ํ™”๋œ framework๋กœ์„œ ๋งค์šฐ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค
  • 2. EXPRESS NEW VERSION TUTORIAL Fast, unopinionated, minimalist web framework for Node.js YNCA STUDY 2ND โ€“EXPRESS BY NHN NEXT ๋ฅ˜์šฐ๋ฆผ DIRECTOR.RYU
  • 3. EXPRESS MODULE http ๋ชจ๋“ˆ์— ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“  ๋ชจ๋“ˆ ์ž‘๊ณ  ๋น ๋ฅด๋‹ค
  • 4. EXPRESS FRAMEWORK express ๋ชจ๋“ˆ๋กœ ๋งŒ๋“  ํ”„๋ ˆ์ž„์›Œํฌ ! ํ”„๋กœ์ ํŠธ๋ฅผ ์†์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค ๊ธฐ๋ณธ์ ์ธ ๋ทฐ ์ง€์›, ์„ธ์…˜ ์ง€์› !
  • 5. EXPRESS INSTALL ์ฝ˜์†”์ฐฝ์—์„œ (Mac OS)! $sudo npm install express -g! [ sudo ] password for USER : **** $ sudo npm install -g express-generator
  • 6. DIRECTORY ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ ,! ๊ทธ ์•ˆ์— express ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ƒ์„ฑํ•˜๊ธฐ! [~] $ mkdir blackANDwhite [~] $ cd blackANDwhite [blackANDwhite] $ express blackANDwhite --sessions --css stylus && cd blackANDwhite
  • 7. DIRECTORY ์„ธ์…˜์— ๋Œ€ํ•œ ์ง€์›์„ ์œ„ํ•ด์„œ โ€”sessions ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค ! โ€”css ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, Stylus CSS engine์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค default : vanilla CSS
  • 8. [blackANDwhite] $ npm install [blackANDwhite] $ DEBUG=blackANDwhite ./bin/www !!! [blackANDwhite] $ DEBUG=blackANDwhite ./bin/www blackANDwhite Express server listening on port 3000 +0ms GET / 304 273.620 ms - - GET /stylesheets/style.css 200 79.352 ms - 110 GET /favicon.ico 404 24.240 ms - 1302
  • 9. INSTALL THE DEPENDENCIES FOR THE APP $ npm install ์‘์šฉํ”„๋กœ๊ทธ๋žจ์— ์˜ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ ๋ฌด๋ฆฌ ์„ค์น˜ํ•˜๊ธฐ - ์‘์šฉํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธ์€ ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ๋‹ค $ node app Express server listening on port 3000
  • 10. LOAD IN YOUR BROWSER HTTP://LOCALHOST:3000/
  • 11. LOAD IN YOUR BROWSER
  • 12. HOW IT WORKS how a request to an Express server flows ! Route โ†’ Route Handler โ†’ Template โ†’ HTML !
  • 13. SETTING UP THE ROUTES ์šฐ๋ฆฌ์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋” ์ ํ•ฉํ•˜๊ฒŒ, ๋” ๋…ผ๋ฆฌ์ ์ด๊ฒŒ, ์ต์Šคํ”„๋ ˆ์Šค์˜ ๋‚ด๋ถ€ ๋™์ž‘ ์ดํ•ด๊ฐ€ ๋” ์‰ฝ๋„๋ก, ! ์ƒ์„ฑ๋œ ์ต์Šคํ”„๋ ˆ์Šค๋ฅผ ์ˆ˜์ •ํ•˜์ž
  • 14. 1. routes ํด๋”์— ์žˆ๋Š” index.js and user.js ๋ฅผ ์ง€์›์‹œ๋‹ค. (ํ„ฐ๋ฏธ๋„์—์„œ open routes ํ•˜๋ฉด FINDER๋กœ ์—ด๋ฆผ) ! 2. routes ํด๋” ์•ˆ์— store.js ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ฉ์‹œ๋‹ค. ! 3. ๊ทธ๋ฆฌ๊ณ  ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ store.js ํŒŒ์ผ ์•ˆ์— ์ ์–ด๋„ฃ์์‹œ๋‹ค. ! exports.home = function(req, res){ res.render('home', { title: 'Ninja Store' }) }; ! 4. Rename the index.jade file in the views folder to home.jade.
  • 15. APP.JS MODIFICATION app.js ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ค๋‹ˆ๋‹ค ์ฃผ์„์ฒ˜๋ฆฌ : delete ํ•  ๋ถ€๋ถ„ 11๋ฒˆ, 32๋ฒˆ ์ค„์„ ์ถ”๊ฐ€ํ•ด์ค„ ๋ถ€๋ถ„ //var routes = require('./routes/index'); 9 //var users = require('./routes/users'); 10 11 var store = require(โ€˜./routes/store'); !! 28 29 //app.use('/', routes); 30 //app.use('/users', users); 31 32 app.get('/', store.home); ! => ํ™ˆํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.
  • 16. SERVER RESTART [blackANDwhite] $ DEBUG=blackANDwhite ./bin/www !!!! localhost:3000
  • 17. ! exports.home = function(req, res){ res.render('home', { title: 'Ninja Store' }) }; ! title ๋ณ€์ˆ˜๋Š” =title !=title #{title} ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค ! ex) p Welcome to #{title} p= title p!= title
  • 18. ROUTES DIRECTORY ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์‘์šฉํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ! ์šฐ๋ฆฌ๋Š” routes directory์—์„œ ์ด๋ฆ„์žˆ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ๊ทธ ํŒŒ์ผ์€ ์šฐ๋ฆฌ๊ฐ€ app.js์—์„œ ์ •์˜๋‚ด๋ฆฐ route๋ฅผ ๋‹ค๋ฃฌ๋‹ค (์ฒ˜๋ฆฌํ•œ๋‹ค). ! ์šฐ๋ฆฌ๋Š” ์ด ํŒŒ์ผ๋“ค์„ ์šฐ๋ฆฌ์˜ app์œผ๋กœ import ํ•˜๊ณ , ๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ ํŒŒ์ผ๋“ค์— ๊ธฐ๋Šฅ์„ ํ• ๋‹นํ•œ๋‹ค. !
  • 19. JADE Node Template Engine node.js์šฉ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ view ํ…œํ”Œ๋ฆฟ ์—”์ง„ ! ! Jade ๋ฌธ๋ฒ•์— ๋งž๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์„ html์ด๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค
  • 20. JADE FUNCTIONS ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ์ง€์› ๋›ฐ์–ด๋‚œ ๊ฐ€๋…์„ฑ ์œ ์—ฐํ•œ ๋„์–ด์“ฐ๊ธฐ ๋ธ”๋Ÿญ ํ™•๋Œ€(block-expansion) ๋ฏน์Šค์ธ(mixins, ์„ž์–ด์“ฐ๋Š” ๊ฒƒ) ์Šคํƒœํ‹ฑ ์ธํด๋ฃจ๋“œ(static includes) ์†์„ฑ ์ธํ„ฐํด๋ ˆ์ด์…˜(attribute interpolation) ๋ณด์•ˆ์„ ์œ„ํ•ด ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ปดํŒŒ์ผ๊ณผ ๋Ÿฐํƒ€์ž„์‹œ์— ๋ฌธ๋งฅ์— ๋งž๋Š” ์—๋Ÿฌ ์ถœ๋ ฅ ์ปค๋งจ๋“œ ๋ผ์ธ์„ ํ†ตํ•ด jade ํ…œํ”Œ๋ฆฟ์„ ์ปดํŒŒ์ผ ํ•  ์ˆ˜ ์žˆ์Œ ๋‹ค์ด๋‚ด๋ฏน๊ณผ ์Šคํƒœํ‹ฑ ํƒœ๊ทธ ํด๋ž˜์Šค ์กฐํ•ฉ ํ•„ํ„ฐ๋ฅผ ์ด์šฉํ•œ ํŠธ๋ฆฌ๊ตฌ์กฐ ํŒŒ์‹ฑ parse tree manipulation via filters ํ…œํ”Œ๋ฆฟ ์ƒ์† ์™ธ๋ถ€ ๋ชจ๋“ˆ๋กœ Express JS ์ง€์› ๊ฐ์ฒด, ๋ฐฐ์—ด, ๊ทธ๋ฆฌ๊ณ  ์—ด๊ฑฐํ˜•์ด ์•„๋‹Œ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋„ each ๋ฅผ ์ด์šฉํ•˜์—ฌ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ดํ„ฐ๋ ˆ์ด์…˜ ์ง€์› ๋ธ”๋Ÿญ ์ฝ”๋ฉ˜ํŠธ tag๋ฅผ ์ด์šฉํ•œ ์ ‘๋‘์–ด์ฒ˜๋ฆฌ ์—†์Œ AST ํ•„ํ„ฐ html 5 ๋ชจ๋“œ (!!! 5 doctype) ์„ ํƒ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ
  • 21. ADD FUNCTIONS 1. ์ด๋ฆ„ ์ž…๋ ฅ๋ฐ›๋Š” ์นธ์„ ๋งŒ๋“ค์ž 2. ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ๋กœ๊ทธ์ธํ•˜๋Š” โ€˜๋กœ๊ทธ์ธ ๋ฒ„ํŠผโ€™์„ ๋งŒ๋“ค์ž 3. LOGO.PNG ํŒŒ์ผ์„ ๋“ฑ๋กํ•ด์„œ ๋กœ๊ณ ๋ฅผ ๋ณด์—ฌ์ฃผ์ž 4. FOOTER๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ COPYRIGHT ๋“ฑ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์ž 5. FOOTER์— ABOUT/CONTACT US ์ปจํ…์ธ ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์ž ์™„์„ฑ๋œ ํ™”๋ฉด
  • 22. ADD FUNCTIONS home.jade ํŒŒ์ผ์— ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ค์‹œ๋‹ค. ! extends layout ! block content #wrapper #logo img(src='/images/logo.png') #display #login form(method='post') | Enter your name if you want to be a ninja div input(type='text', name='username') input(type='submit', value='Log In') #footer div Copyright ยฉ Ninja Store #{+new Date().getFullYear()} a(href='/page?name=about') About | | a(href='/page?name=contact') Contact Us ๋กœ๊ณ  ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ ๋กœ๊ทธ์ธ ์•ˆ๋‚ด๋ฌธ๊ตฌ, ์ด๋ฆ„์ž…๋ ฅ์นธ, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ
  • 23. ADD FUNCTIONS ๊ฐ์ž ์›ํ•˜๋Š” ๋กœ๊ณ ๋ฅผ logo.png ๋กœ ์ €์žฅํ•œ ๋’ค, /public/images/ ๋””๋ ‰ํ† ๋ฆฌ์— ์ €์žฅํ•ด์ค์‹œ๋‹ค. ! cd public open public ํ•ด์„œ images ํด๋”๋กœ ๋“ค์–ด๊ฐ„ ๋’ค์—, logo.png ๋ฅผ ๋„ฃ์–ด์ค์‹œ๋‹ค
  • 24. ADD FUNCTIONS /public/stylesheets/ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋“ค์–ด๊ฐ€์„œ, style.styl ์— ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค์‹œ๋‹ค. (vi style.styl ์จ์„œ ํ„ฐ๋ฏธ๋„์—์„œ ๋ฐ”๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅ) body padding: 0 font: 14px "Lucida Grande", Helvetica, Arial, sans-serif ! a color: #0069FF #wrapper width: 450px margin: 0 auto padding: 40px 20px background: #fff ! #logo text-align: center ! #display margin: 20px 0 50px ! #userbar margin-bottom: 10px
  • 25. ADD FUNCTIONS home.jade ์— link(rel='stylesheet', href='/stylesheets/style.css') ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค ! => home.jade ๊ฐ€ stylesheets ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, css๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๋ถ€๋ถ„ !
  • 26. SERVER RESTART ! ๋‹ค์‹œ, ์„œ๋ฒ„๋ฅผ ๋Œ๋ ค๋ด…์‹œ๋‹ค ! ! localhost : 3000
  • 28. ERROR: ๋กœ๊ทธ์ธ์„ ํ•˜๋ฉด, ์—๋Ÿฌ๊ฐ€ ๋‚˜์ฃ ? ! ์™œ? ! ์•„๊นŒ app.js ํŒŒ์ผ์— app.get('/', store.home); ๋ผ๊ณ  ์ผ์ฃ  => get ์š”์ฒญ๋งŒ ๋ฐ›๊ณ  ์žˆ์–ด์š” ! But, ๋กœ๊ทธ์ธ ์‹œ Post ์š”์ฒญ์„ ํ•˜๊ณ  ์žˆ์ฃ  ๊ทธ๋ž˜์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์š”
  • 29. GET / POST GET ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ฆ„๊ณผ ๊ฐ’์ด ๊ฒฐํ•ฉ๋œ ์ŠคํŠธ๋ง ํ˜•ํƒœ๋กœ ์ „๋‹ฌ ! POST ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ„์— ์ƒํ˜ธ ์ •์˜๋˜์–ด ์žˆ๋Š” ํ˜•์‹๋Œ€๋กœ ๊ฐ’์„ ์ธ์ฝ”๋”ฉํ•œ ๋‹ค์Œ ์„œ ๋ฒ„๋กœ ์ „์†ก !
  • 30. GET VS POST ! GET ๋ฐฉ์‹ - ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์งˆ์˜์–ด ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ์š”์ฒญ ์ž์ฒด๋ฅผ ์œ„ํ•œ ์ •๋ณด๋ฅผ ์ „์†กํ•  ๋•Œ ์‚ฌ์šฉ - GET ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ ˆ๋‹จ - GET ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์†Œ ์ž…๋ ฅ๋ž€์— ํ‘œ์‹œ๋˜๋ฏ€๋กœ ์ตœ์†Œํ•œ์˜ ๋ณด์•ˆ๋„ ์œ ์ง€๋˜ ์ง€ ์•Š์Œ ! POST ๋ฐฉ์‹ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ๊ฐฑ์‹  ์ž‘์—…๊ณผ ๊ฐ™์€ ์„œ๋ฒ„์ธก์—์„œ์˜ ์ •๋ณด ๊ฐฑ์‹  ์ž‘์—…์„ ์›ํ•  ๋•Œ ์‚ฌ์šฉ - ์ผ์ •ํ•œ ํฌ๊ธฐ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋•Œ์—๋Š” POST ๋ฐฉ์‹์„ ์‚ฌ์šฉ - POST ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด GET ๋ฐฉ์‹์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋Šฆ์–ด์ง - ํด๋ผ์ด์–ธํŠธ์ธก์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ฝ”๋”ฉ โ†’ ์„œ๋ฒ„์ธก์—์„œ ๋””์ฝ”๋”ฉ
  • 31. POST REQUEST app.js ํŒŒ์ผ์— ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค ! app.post('/', store.home_post_handler); ! ! store.js ํŒŒ์ผ์— ์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค ! exports.home_post_handler = function(req, res) { username = req.body.username || 'Anonymous'; req.session.username = username; res.redirect('/'); };
  • 32. SESSION PROBLEM ์„ธ์…˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ฃ ? ! ! $sudo npm install express-session ! ๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ณ์ค์‹œ๋‹ค !
  • 33. SESSION API app.js ํŒŒ์ผ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์š” ! var express = require('express') var session = require('express-session') ! var app = express() ! app.use(session({secret: 'keyboard cat'}))
  • 34. STORE.JS store.js ํŒŒ์ผ์— ์žˆ๋Š” exports.home ์„ ๋ฐ‘์— ์ฝ”๋“œ๋กœ ๋Œ€์ฒดํ•ด์ค๋‹ˆ๋‹ค ! exports.home = function(req, res) { if (typeof req.session.username == 'undefined') res.render('home', { title: 'Ninja Store'}); else res.redirect('/items'); };
  • 35. SERVER RESTART ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•ด๋ด…์‹œ๋‹ค ! ์—๋Ÿฌ ๋œจ์ฃ  ? ! jade๋ฅผ ์šฐ์„  ๋‚˜๋ˆˆ ๋’ค์—, ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•ฉ์‹œ๋‹ค
  • 36. JADE INCLUDE views ์•ˆ์— footer.jade ํŒŒ์ผ์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค ! #footer div Copyright ยฉ Ninja Store #{+new Date().getFullYear()} a(href='/page?name=about') About | | a(href='/page?name=contact') Contact Us
  • 37. JADE INCLUDE views์— userbar.jade ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค ! #userbar | Welcome b #{username} | | a(href='/items') Items | | a(href='/logout') Log Out
  • 38. JADE INCLUDE home.jade ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ! extends layout ! block content #wrapper #logo a(href='/') img(src='/images/logo.png') #display #login form(method='post') | Enter your name if you want to be a ninja div input(type='text', name='username') input(type='submit', value='Log In') include footer ์ˆ˜์ •๋œ ๋ถ€๋ถ„
  • 39. ADD app.js ์— items์™€ item์„ ์—ฐ๊ฒฐํ•ด์ค์‹œ๋‹ค ! // display the list of item app.get('/items', store.items); // show individual item app.get('/item/:id', store.item);
  • 40. DATABASE store.js ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค ! // our 'database' var items = { SKN:{name:'Shuriken', price:100}, ASK:{name:'Ashiko', price:690}, CGI:{name:'Chigiriki', price:250}, NGT:{name:'Naginata', price:900}, KTN:{name:'Katana', price:1000} };
  • 41. ADD store.js ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค ! // handler for displaying the items exports.items = function(req, res) { // don't let nameless people view the items, redirect them back to the homepage if (typeof req.session.username == 'undefined') res.redirect('/'); else res.render('items', { title: 'Ninja Store - Items', username: req.session.username, items:items }); }; ! // handler for displaying individual items exports.item = function(req, res) { // don't let nameless people view the items, redirect them back to the homepage if (typeof req.session.username == 'undefined') res.redirect('/'); else { var name = items[req.params.id].name; var price = items[req.params.id].price; res.render('item', { title: 'Ninja Store - ' + name, username: req.session.username, name:name, price:price }); } };
  • 42. views ์— items.jade ๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค ! extends layout ! block content #wrapper #logo img(src='/images/logo.png') #display include userbar -for (var id in items) - var item = items[id] div a(href='/item/#{id}') #{item.name} - $#{item.price} include footer
  • 43. views ์— item.jade ๋ฅผ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค ! extends layout ! block content #wrapper #logo img(src='/images/logo.png') #display include userbar p The #{name.toLowerCase()} is one of the must-have items for any aspiring ninja. It costs just $#{price} on our store. p Buy it today! include footer
  • 44. LOGOUT app.js ์— ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค. ! app.get('/logout', function(req, res) { delete req.session.username; res.redirect('/'); });
  • 45. SERVER RESTART ! ๋‹ค์‹œ, ์„œ๋ฒ„๋ฅผ ๋Œ๋ ค๋ด…์‹œ๋‹ค ! ! localhost : 3000
  • 47. ์ถœ์ฒ˜/์ฐธ๊ณ  ! www.hacksparrow.com/express-js-tutorial.html๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฒˆ์—ญ ๋ฐ ์ฝ”๋“œ ๋ฒ„์ „์—…๋ฐ์ดํŠธ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.