StrongLoop / IBM์— ์˜ํ•ด ์ œ๊ณต์ด ๋ฒˆ์—ญ.

์ด ๋ฌธ์„œ๋Š” ์˜๋ฌธํŒ ๋ฌธ์„œ์— ๋น„ํ•ด ๋” ์˜ค๋ž˜๋œ ๋ฒ„์ „์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์˜๋ฌธํŒ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

โœ–

๋ผ์šฐํŒ…

๋ผ์šฐํŒ…์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”๋“œ ํฌ์ธํŠธ(URI)์˜ ์ •์˜, ๊ทธ๋ฆฌ๊ณ  URI๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋Š” ๊ธฐ๋ณธ ๋ผ์šฐํŒ…์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๋ผ์šฐํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.


var express = require('express');
var app = express();

// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
  res.send('hello world');
});

๋ผ์šฐํŠธ ๋ฉ”์†Œ๋“œ

๋ผ์šฐํŠธ ๋ฉ”์†Œ๋“œ๋Š” HTTP ๋ฉ”์†Œ๋“œ ์ค‘ ํ•˜๋‚˜๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋˜๋ฉฐ, express ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์•ฑ์˜ ๋ฃจํŠธ์— ๋Œ€ํ•œ GET ๋ฐ POST ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ์ •์˜๋œ ๋ผ์šฐํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.


// GET method route
app.get('/', function (req, res) {
  res.send('GET request to the homepage');
});

// POST method route
app.post('/', function (req, res) {
  res.send('POST request to the homepage');
});

Express๋Š” HTTP ๋ฉ”์†Œ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ผ์šฐํŒ… ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. get, post, put, head, delete, options, trace, copy, lock, mkcol, move, purge, propfind, proppatch, unlock, report, mkactivity, checkout, merge, m-search, notify, subscribe, unsubscribe, patch, search ๋ฐ connect.

์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ JavaScript ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋ผ์šฐํŒ…ํ•˜๋ ค๋ฉด ๋Œ€๊ด„ํ˜ธ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด app['m-search']('/', function ... ๋“ฑ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŠน์ˆ˜ํ•œ ๋ผ์šฐํŒ… ๋ฉ”์†Œ๋“œ์ธ app.all()์€ ์–ด๋– ํ•œ HTTP ๋ฉ”์†Œ๋“œ๋กœ๋ถ€ํ„ฐ๋„ ํŒŒ์ƒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” ๋ชจ๋“  ์š”์ฒญ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด ํ•œ ๊ฒฝ๋กœ์—์„œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š”, GET, POST, PUT ๋˜๋Š” DELETE ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋˜๋Š” http ๋ชจ๋“ˆ์—์„œ ์ง€์›๋˜๋Š” ๊ธฐํƒ€ ๋ชจ๋“  HTTP ์š”์ฒญ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋“ฑ์˜ โ€œ/secretโ€์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์œ„ํ•˜์—ฌ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.


app.all('/secret', function (req, res, next) {
  console.log('Accessing the secret section ...');
  next(); // pass control to the next handler
});

๋ผ์šฐํŠธ ๊ฒฝ๋กœ

๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š”, ์š”์ฒญ ๋ฉ”์†Œ๋“œ์™€์˜ ์กฐํ•ฉ์„ ํ†ตํ•ด, ์š”์ฒญ์ด ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” ๋ฌธ์ž์—ด, ๋ฌธ์ž์—ด ํŒจํ„ด ๋˜๋Š” ์ •๊ทœ์‹์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Express๋Š” ๋ผ์šฐํŠธ ๊ฒฝ๋กœ์˜ ์ผ์น˜๋ฅผ ์œ„ํ•ด path-to-regexp๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์„ ํ™•์ธํ•˜๋ ค๋ฉด path-to-regexp ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. Express Route Tester๋Š” ๊ธฐ๋ณธ์ ์ธ Express ๋ผ์šฐํŠธ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ ๋„๊ตฌ์ด์ง€๋งŒ, ํŒจํ„ด ์ผ์น˜๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์กฐํšŒ ๋ฌธ์ž์—ด์€ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ผ์šฐํŠธ ๊ฒฝ๋กœ์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” ์š”์ฒญ์„ ๋ฃจํŠธ ๋ผ์šฐํŠธ /์— ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.


app.get('/', function (req, res) {
  res.send('root');
});

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” ์š”์ฒญ์„ /about์— ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.


app.get('/about', function (req, res) {
  res.send('about');
});

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” ์š”์ฒญ์„ /random.text์— ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.


app.get('/random.text', function (req, res) {
  res.send('random.text');
});

๋ฌธ์ž์—ด ํŒจํ„ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ผ์šฐํŠธ ๊ฒฝ๋กœ์˜ ๋ช‡ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” acd ๋ฐ abcd์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” abcd, abbcd ๋ฐ abbbcd ๋“ฑ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


app.get('/ab+cd', function(req, res) {
  res.send('ab+cd');
});

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” abcd, abxcd, abRABDOMcd ๋ฐ ab123cd ๋“ฑ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


app.get('/ab*cd', function(req, res) {
  res.send('ab*cd');
});

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” /abe ๋ฐ /abcde์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

?, +, * ๋ฐ () ๋ฌธ์ž๋Š” ์ •๊ทœ์‹ ๋ฌธ์ž์˜ ์„œ๋ธŒ์„ธํŠธ์ž…๋‹ˆ๋‹ค. ํ•˜์ดํ”ˆ(-) ๋ฐ ์ (.)์€ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜ ๊ฒฝ๋กœ์— ์˜ํ•ด ๋ฌธ์ž ๊ทธ๋Œ€๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

์ •๊ทœ์‹์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ผ์šฐํŠธ ๊ฒฝ๋กœ์˜ ์˜ˆ:

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” ๋ผ์šฐํŠธ ์ด๋ฆ„์— โ€œaโ€๊ฐ€ ํฌํ•จ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.


app.get(/a/, function(req, res) {
  res.send('/a/');
});

๋‹ค์Œ์˜ ๋ผ์šฐํŠธ ๊ฒฝ๋กœ๋Š” butterfly ๋ฐ dragonfly์™€ ์ผ์น˜ํ•˜์ง€๋งŒ, butterflyman ๋ฐ dragonfly man ๋“ฑ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


app.get(/.*fly$/, function(req, res) {
  res.send('/.*fly$/');
});

๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ

๋ฏธ๋“ค์›จ์–ด์™€ ๋น„์Šทํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ์—ฌ๋Ÿฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ด๋Ÿฌํ•œ ์ฝœ๋ฐฑ์€ next('route')๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‚˜๋จธ์ง€ ๋ผ์šฐํŠธ ์ฝœ๋ฐฑ์„ ์šฐํšŒํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ด์šฉํ•˜๋ฉด ๋ผ์šฐํŠธ์— ๋Œ€ํ•œ ์‚ฌ์ „ ์กฐ๊ฑด์„ ์ง€์ •ํ•œ ํ›„, ํ˜„์žฌ์˜ ๋ผ์šฐํŠธ๋ฅผ ๊ณ„์†ํ•  ์ด์œ ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์ œ์–ด๋ฅผ ํ›„์† ๋ผ์šฐํŠธ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์— ๋‚˜ํƒ€๋‚œ ๊ฒƒ๊ณผ ๊ฐ™์ด, ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํ•จ์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ ๋˜๋Š” ๋‘˜์„ ์กฐํ•ฉํ•œ ํ˜•ํƒœ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ผ์šฐํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


app.get('/example/a', function (req, res) {
  res.send('Hello from A!');
});

2๊ฐœ ์ด์ƒ์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ•˜๋‚˜์˜ ๋ผ์šฐํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(next ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์•ผ ํ•จ). ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


app.get('/example/b', function (req, res, next) {
  console.log('the response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from B!');
});

ํ•˜๋‚˜์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋ฐฐ์—ด์€ ํ•˜๋‚˜์˜ ๋ผ์šฐํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

var cb2 = function (req, res) {
  res.send('Hello from C!');
}

app.get('/example/c', [cb0, cb1, cb2]);

๋…๋ฆฝ์ ์ธ ํ•จ์ˆ˜์™€ ํ•จ์ˆ˜ ๋ฐฐ์—ด์˜ ์กฐํ•ฉ์€ ํ•˜๋‚˜์˜ ๋ผ์šฐํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

app.get('/example/d', [cb0, cb1], function (req, res, next) {
  console.log('the response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from D!');
});

์‘๋‹ต ๋ฉ”์†Œ๋“œ

๋‹ค์Œ ํ‘œ์— ํ‘œ์‹œ๋œ ์‘๋‹ต ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ฉ”์†Œ๋“œ(res)๋Š” ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•˜๊ณ  ์š”์ฒญ-์‘๋‹ต ์ฃผ๊ธฐ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ ์ค‘ ์–ด๋Š ํ•˜๋‚˜๋„ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์€ ์ •์ง€๋œ ์ฑ„๋กœ ๋ฐฉ์น˜๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์†Œ๋“œ ์„ค๋ช…
res.download() ํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ๋˜๋„๋ก ํ”„๋กฌํ”„ํŠธํ•ฉ๋‹ˆ๋‹ค.
res.end() ์‘๋‹ต ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
res.json() JSON ์‘๋‹ต์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
res.jsonp() JSONP ์ง€์›์„ ํ†ตํ•ด JSON ์‘๋‹ต์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
res.redirect() ์š”์ฒญ์˜ ๊ฒฝ๋กœ๋ฅผ ์žฌ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
res.render() ๋ณด๊ธฐ ํ…œํ”Œ๋ฆฌํŠธ๋ฅผ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.
res.send() ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์‘๋‹ต์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
res.sendFile() ํŒŒ์ผ์„ ์˜ฅํ…Ÿ ์ŠคํŠธ๋ฆผ์˜ ํ˜•ํƒœ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
res.sendStatus() ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•œ ํ›„ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•œ ๋‚ด์šฉ์„ ์‘๋‹ต ๋ณธ๋ฌธ์œผ๋กœ์„œ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

app.route()

app.route()๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ผ์šฐํŠธ ๊ฒฝ๋กœ์— ๋Œ€ํ•˜์—ฌ ์ฒด์ธ ๊ฐ€๋Šฅํ•œ ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๋Š” ํ•œ ๊ณณ์— ์ง€์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ๋ชจ๋“ˆ์‹ ๋ผ์šฐํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ค‘๋ณต์„ฑ๊ณผ ์˜คํƒ€๊ฐ€ ๊ฐ์†Œํ•˜์—ฌ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋ผ์šฐํŠธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์ •๋ณด๋Š” Router() ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

app.route()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •์˜๋œ ์ฒด์ธ ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });

express.Router

express.Router ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“ˆ์‹ ๋งˆ์šดํŒ… ๊ฐ€๋Šฅํ•œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Router ์ธ์Šคํ„ด์Šค๋Š” ์™„์ „ํ•œ ๋ฏธ๋“ค์›จ์–ด์ด์ž ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ์ด๋ฉฐ, ๋”ฐ๋ผ์„œ โ€œ๋ฏธ๋‹ˆ ์•ฑ(mini-app)โ€์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ๋ผ์šฐํ„ฐ๋ฅผ ๋ชจ๋“ˆ๋กœ์„œ ์ž‘์„ฑํ•˜๊ณ , ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆ์—์„œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋ฅผ ๋กœ๋“œํ•˜๊ณ , ๋ช‡๋ช‡ ๋ผ์šฐํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ธฐ๋ณธ ์•ฑ์˜ ํ•œ ๊ฒฝ๋กœ์— ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆ์„ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์˜ ๋‚ด์šฉ์ด ์ž…๋ ฅ๋œ birds.js๋ผ๋Š” ์ด๋ฆ„์˜ ๋ผ์šฐํ„ฐ ํŒŒ์ผ์„ ์•ฑ ๋””๋ ‰ํ† ๋ฆฌ์— ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.


var express = require('express');
var router = express.Router();

// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// define the home page route
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// define the about route
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

์ดํ›„ ์•ฑ ๋‚ด์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค.


var birds = require('./birds');
...
app.use('/birds', birds);

์•ฑ์€ ์ด์ œ /birds ๋ฐ /birds/about์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋ผ์šฐํŠธ์— ๋Œ€ํ•œ ํŠน์ •ํ•œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜์ธ timeLog๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.