์ด์ ์ ์ด์ด์ ์ค๋์ map์ object๋ฅผ ๋ฃ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๊ณ , map์ ํ์ฉํ์ฌ ์ ํ๋ฒ ์ ๋ณด ์กฐํ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์๋ค. - ์ด์ ๋ ๋ง์ด ๊ฒน์น๋ ๋ด์ฉ๋ค์ด์ด์ ์ ๋ฆฌ๋ ์๋ต.
๋์ ์ค๋ ์๋กญ๊ฒ ๋ฐฐ์ด Express์ ๊ธฐ๋ณธ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ express-generator๋ฅผ ํตํด Express ํ๋ก์ ํธ์ ํ์ ์๋์ผ๋ก ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด์๋ค. ์ฌํ๊น์ง ๊ฐ์ฌ๋ ์ฝ๋๋ฅผ ๋ฐ๋ผ API๋ฅผ ๋ง๋ค๊ธฐ๋ง ํ๋ค ๋ณด๋ ์ผ๋จ ์ฝ์๋ง ์ฐํ๋ฉด ์ค์ค์ค์ค ํ๋๋ฐ, ์ค๋์ ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ง์ ๋ค์ฌ๋ค๋ณด๋ฉด์ Express๋ฅผ ๋ ๊น๊ฒ ์ดํดํ ์ ์์๋ค.
๐ณExpress๋ ํ๋ ์์ํฌ
์ฌ์ค Node.js
๋ก ์น ์๋ฒ๋ฅผ ๋ง๋ค ๋ http
๋ชจ๋๋ง์ผ๋ก๋ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง API๊ฐ ๋ง์์ง๊ณ ์์ฒญ์ด ๋ค์ํด์ง์๋ก ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ๊ด๋ฆฌํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค. ์ด๋ฅผ ํด๊ฒฐํด ์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก Express์ด๋ค.
๊ณต์ ๋ฌธ์์์๋ Express๋ฅผ ์ด๋ ๊ฒ ์๊ฐ ํ๊ณ ์๋ค.
Fast, Unopinionated, minimalist web framework for Node.js
์ฆ, ๊ฐ๋จํ๊ณ ๋น ๋ฅด๋ฉฐ, ์ ์ฐํ๊ฒ ๊ตฌ์ฑ ๊ฐ๋ฅํ ์น ํ๋ ์์ํฌ๋ผ๋ ๊ฒ์ด๋ค.
Express - Node.js ์น ์ ํ๋ฆฌ์ผ์ด์ ํ๋ ์์ํฌ
Express is a fast, unopinionated, minimalist web framework for Node.js, providing a robust set of features for web and mobile applications.
expressjs.com
๐ชExpress Generator
Express ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ํ์ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ๋๊ตฌ
๊ฐ๋ฐ์๊ฐ ๋งค๋ฒ app.js
๋ฅผ ๋ง๋ค๊ณ , routes
ํด๋๋ฅผ ๋ง๋ค๊ณ , listen()
์ค์ ์ ํ๊ณ ...์ด๋ฐ ๋ฐ๋ณต ์์
์ ํ์ง ์๋๋ก ๋ฏธ๋ฆฌ ์์ฑ๋ ํ
ํ๋ฆฟ์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๋๊ตฌ์ด๋ค.
์ค์น
$ npm install express-generator -g
์ฌ์ฉ
express
๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด, ํด๋๊ฐ ์๋์ผ๋ก ์ธํ ์ด ๋๋ค.
Generator ์์ด ์ง์ ๋ง๋ค๋ฉด?
express-generator
์์ด ๋ง๋ค๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ ์ฐจ๊ฐ ํ์ํ๋ค:
npm init
,npm install express
app.js
์ง์ ์์ฑrouter
,views
,public
์ง์ ๊ตฌ์ฑ- ํฌํธ ์ค์ ,
listen
์ฝ๋ ์์ฑ
์ง๊ธ๊น์ง๋ ์ด๋ ๊ฒ ์ค์ต์ ์งํํด์๋ค.ํ์ง๋ง ๋จ์ ์ค์ต์ด๋ผ๋ฉด ๊ด์ฐฎ์ง๋ง, ํ์ ์ ํ๊ฑฐ๋ ์ค์ ํ๋ก์ ํธ๋ฅผ ํ๋ค๋ฉด ๊ตฌ์กฐํ๊ฐ ํ์์ด๋ฏ๋ก generator ์ฌ์ฉ์ด ํจ์ฌ ํจ์จ์ ์ด๋ค.
๐๏ธํด๋๊ตฌ์กฐ
์ผ๋จ, ์์ฑ๋ ํ๋ก์ ํธ ํด๋ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
myapp/
โโโ app.js
โโโ bin/
โ โโโ www
โโโ public/
โ โโโ images/
โ โโโ javascripts/
โ โโโ stylesheets/
โโโ routes/
โ โโโ index.js
โ โโโ users.js
โโโ views/
โ โโโ error.jade
โ โโโ index.jade
โโโ package.json
bin > www
์๋ฒ ์คํ ํ์ผ
var app = require('../app');
var debug = require('debug')('expressgenerator:server');
var http = require('http');
../app
์์ ์ค์ ํ Express ์ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์จ๋ค.debug
: ๋๋ฒ๊น ์ฉ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ค.http
: ์ค์ ์๋ฒ๋ฅผ ๋์ฐ๊ธฐ ์ํ ๋ก๊ทธ
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
- ํ๊ฒฝ๋ณ์
PORT
๊ฐ ์์ผ๋ฉด ์ฌ์ฉํ๊ณ , ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ3000
์ ์ฌ์ฉํ๋ค. - Express ์ฑ์ ์ด ํฌํธ ์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ค.
var server = http.createServer(app);
app
๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋๊ฒจ HTTP ์๋ฒ๋ฅผ ์์ฑํ๋ค.
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
- ์๋ฒ ๋ฆฌ์ค๋ ๋ฐ ์ด๋ฒคํธ ๋ฐ์ธ๋ฉ์ ์ํ ์ฝ๋์ด๋ค.
.listen()
์ผ๋ก ์ค์ ์๋ฒ๋ฅผ ๊ตฌ๋ํ๊ณ , ์๋ฌ์ ๋ฆฌ์ค๋ ์ด๋ฒคํธ์ ๋ํ ์ฝ๋ฐฑ์ ๋ฑ๋กํ๋ค.
๐ wwwํ์ผ์ Express ์ฑ์ ๊ฐ์ผ HTTP ์๋ฒ๋ฅผ ์์ฑํ๊ณ ์คํํ๋ ์ํธ๋ฆฌ ํฌ์ธํธ
app.js
Express ํต์ฌ ์ค์ ํ์ผ
app.js
์๋ ์๋ฒ์ ์ ๋ฐ์ ์ธ ์ค์ ๊ณผ ๋ฏธ๋ค์จ์ด, ๋ผ์ฐํ
์ฒ๋ฆฌ๊ฐ ๋ค์ด๊ฐ๋ค.
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
- ์ค๋ฅ ์ฒ๋ฆฌ์ฉ
http-errors
,express
,path
, ์ฟ ํคํ์, ๋ก๊ทธ์ฉmorgan
๋ฑ ํ์ ๋ชจ๋์ ๋ถ๋ฌ์จ๋ค.
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
/
,/users
์์ฒญ์ด ๋ค์ด์์ ๋ ์ฒ๋ฆฌํ ๋ผ์ฐํฐ ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
var app = express();
- ๋ชจ๋ ์ค์ ์ ๊ธฐ๋ฐ์ด ๋๋
app
๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
- ํ
ํ๋ฆฟ ํ์ผ์
view
ํด๋์ ์์นํ๋ค. - ๊ธฐ๋ณธ ๋ทฐ ์์ง์
jade
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
- ๋ฏธ๋ค์จ์ด ์ค์
๋ฏธ๋ค์จ์ด | ์ค๋ช |
---|---|
logger('dev') |
์์ฒญ ๋ก๊ทธ ์ถ๋ ฅ |
express.json() |
JSON ์์ฒญ ๋ฐ๋ ํ์ฑ |
express.unlencoded() |
ํผ ํ์ ๋ฐ์ดํฐ ํ์ฑ |
cookieParser() |
์์ฒญ์ ์ฟ ํค ํ์ฑ |
express.static() |
public/ ํด๋ ์ ์ ํ์ผ ์ ๊ณต |
๐ ์ฌ๊ธฐ๊น์ง๊ฐ ์์ฒญ์ด ๋ค์ด์ค๊ธฐ ์ ์ฒ๋ฆฌ๋๋ ๋ฏธ๋ค์จ์ด๋ค. ์์ฒญ์ ๊ฐ๊ณตํ๊ณ , ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ค.
app.use('/', indexRouter);
app.use('/users', usersRouter);
- ์ค์ ์์ฒญ ๊ฒฝ๋ก์ ๋ผ์ฐํฐ๋ฅผ ์ฐ๊ฒฐํ๋ค.
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
- ์์ธ์ฒ๋ฆฌ. ์ ๋ผ์ฐํฐ๋ฅผ ๋ค ํต๊ณผํ๋๋ฐ ํด๋น ๊ฒฝ๋ก๊ฐ ์๋ค? ->
404
์๋ฌ๋ฅผ ์ถ๋ ฅํ๋ค. - ๋ฐ์ํ ์๋ฌ๋ฅผ ๋ทฐ์ ์ ๋ฌํ๊ณ ๋ ๋๋งํ๋ค.
module.exports = app;
app
๊ฐ์ฒด๋ฅผ ์ธ๋ถ(www
)์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ด๋ณด๋ธ๋ค.
routes ํด๋
๋ผ์ฐํฐ ํ์ผ ๋ชจ์
//index.js
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
module.exports = router;
- GET
/
์์ฒญ์ด ๋ค์ด์ค๋ฉดviews/index.jade
๋ฅผ ๋ ๋๋งํ๋ค. res.render()
๋ก ๋ฐ์ดํฐ๋ฅผ ํ ํ๋ฆฟ์ ๋๊ฒจ์ฃผ๊ณ HTML์ ์์ฑํ๋ค.
views ํด๋
ํ ํ๋ฆฟ ํ์ผ
jade
ํ ํ๋ฆฟ ์์ง์ ๊ธฐ๋ฐ์ผ๋ก HTML์ ๋์ ์ผ๋ก ์์ฑํ๋ค.res.render()
์ ์ฐ๊ฒฐ๋์ด ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ฃผ๋ ์ญํ ์ ํ๋ค.
index.jade
extends layout
block content
h1= title
p Welcome to #{title}
- layout.jade๋ฅผ ์์ํ์ฌ ๊ฐ๋ณ ํ์ด์ง์ ์ฝํ ์ธ ๋ฅผ ์ฝ์ ํ๋ค.
layout.jade
doctype html
html
head
title= title
link(rel='stylesheet', href='/stylesheets/style.css')
body
block content
- ์ ์ฒด HTML ๋ ์ด์์์ ์ ์(๋จธ๋ฆฌ๊ธ, ๋ฐ๋ ๋ฑ)
public ํด๋
์ ์ ํ์ผ ๊ฒฝ๋ก
public ํด๋์ ์์นํ ํ์ผ์ ์ ์ ํ์ผ๋ก ์ง์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ์ด๋ฏธ์ง, JS, CSS ๋ฑ์ ํ์ผ์ ๋ฃ์ด๋๊ณ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ๋ค.
express ์คํ ๋ฐฉ๋ฒ
์ง๊ธ๊น์ง ์ค์ต ํ์ผ์ ์๋จ play ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฌธ์ ์์ด ์๋ํ๋ค. ํ์ง๋ง generator๋ก ๋ง๋ ํ๋ก์ ํธ๋ฅผ play ๋ฒํผ์ผ๋ก ์คํํ๋ฉด Running->Done์ผ๋ก ๋ฐ๋ก ์ข ๋ฃ๋๋ค.
www ํ์ผ์ด ์คํ ์ํธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์, ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด๋ก ์คํํด์ฃผ์ด์ผ ํ๋ค.
npm start
ํ์คํ, generator์ ์ฐ๋ ๋ฒ๊ฑฐ๋ก์ด ๊ฒ๋ค์ด ํ ์ค์ด๋ ๋๋์ด๋ค. ์๋๋ ํ ๊ฒ ์์๋๋ฐ ๋ ํ ๊ฒ ์์ด์ง ๋๋..