Node.js ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์๋๋๋๊ฒ ์๋ ์๋ฒ์์ ์๋๋๋๋ก ํด์ฃผ๋ ๋ฐํ์ ํ๊ฒฝ์ ๋งํ๋ค.
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ Chrome(ํฌ๋กฌ) ์ V8 ์์ง์ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค!
Express
๋ Node.js ํ๊ฒฝ์์ ์๋ฒ๋ฅผ ์ ์์ ๋ณด๋ค ์ฝ๊ฒ ํ๊ธฐ ์ํ ํ๋ ์์ํฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค!
๊ธฐ์กด์ HTTP ๋ด์ฅ ๋ชจ๋
๋ก ๋ง๋ ์๋ฒ๋ณด๋ค ์๋ฒ๋ฅผ ๋ง๋ค๊ธฐ ํธ๋ฆฌํ๊ณ ๊ฐํธํ ๊ธฐ๋ฅ๋ค์ด ๋ด์ฅ๋์ด ์์ด ๊ฐ์ฅ ๋ง์ ๊ณณ์์ ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉํ๋ ํ๋ ์์ํฌ์ด๋ค. (๋ฌผ๋ก Express ๋ง๊ณ ๋ ์ฌ๋ฌ ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ํ๋ ์์ํฌ๊ฐ ์๋ค.)
์ฌ์ ์ Node.js ๊ฐ ์ค์น ๋์ด ์์ด์ผ ํฉ๋๋น ๐
์๋ฒ๋ฅผ ๋ณด๊ดํ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑ!
$ mkdir myapp
$ cd myapp
npm init ๋ช
๋ น์ ์ด์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ package.json ํ์ผ์ ์์ฑ!
์ถ๊ฐ๋ก js ํ์ผ๋ ์์ฑํ๊ธฐ!
$ npm init
์ดํ Express ์ค์น
$ npm install express --save
๋ง์ฝ ์์๋ก ์ค์นํ ๋ ค๋ฉด --save
๋ฅผ ๋นผ์ฃผ๋ฉด ๋๋ค!
์ค์น๊ฐ ๋ค๋๋๋ฉด package.json ์ express ๊ฐ ๋ณด์ผ ๊ฒ!
ํฐ๋ฏธ๋์ node ํ์ผ๋ช
์ ์
๋ ฅํด๋ณด๋ฉด ์๋ฒ์ฃผ์๊ฐ ๋ฌ๋ค.
๋ธ๋ผ์ฐ์ ์ ์
๋ ฅํด๋ณด์! 'hello http server!' ๊ฐ ๋ณด์ผ ๊ฒ!
const http = require('http');
http.createServer((request,response)=>{
response.writeHead(200, {'Content-Type' : 'text/html'})
response.write('hello http server!')
response.end()
}).listen(3000, ()=>{
console.log("http server runing http://127.0.0.1:3000/")
})
Http ๋ด์ฅ ๋ชจ๋๋ก ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ ๋ณด๋ค ํจ์ฌ ์ฝ๋๊ฐ ์ค์๋ค!
const express = require('express')
const app =express();
const port =3000;
app.get('/',(request,response)=>{
response.send('hellow Express server!')
})
app.listen(port,()=>{
console.log("Express server runing http://127.0.0.1:3000/")
})
๊ณต์ ๋ฌธ์์ ๋ผ์ฐํ ์ ์
๋ผ์ฐํ ์ด๋ URI ๋ฐ ํน์ ํ HTTP ์์ฒญ ๋ฉ์๋์ธ ํน์ ์๋ํฌ์ธํธ์ ๋ํ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ตํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์์ผ์ฟ ์ฟ ๋ค์ฌ์ด
๋ผ์ฐํ
์ด๋ ํด๋ผ์ด์ธํธ์ ํน์ ์์ฒญ ๋ฉ์๋์ ์๋ํฌ์ธํธ์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ต ์ฒ๋ฆฌ ํ๋ ๊ฒ์ ๋งํ๋ค.
์ฆ, ๋ถ๊ธฐ์ ์ ๋ง๋๋ ๊ฒ์ด ๋ผ์ฐํ
ํ
ํฑํฑ
์ด๊ฑด ๋ด์ผํด
ํด๋ผ์ด์ธํธ๋ ํน์ ํ HTTP ์์ฒญ ๋ฉ์๋(GET, POST ๋ฑ)์ ํจ๊ป ์๋ฒ์ ํน์ URI(๋๋ ๊ฒฝ๋ก)๋ก HTTP ์์ฒญ์ ๋ณด๋ ๋๋ค. ๋ผ์ฐํ ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ํด๋นํ๋ Endpoint์ ๋ฐ๋ผ ์๋ฒ๊ฐ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ ๋๋ค.
'/lower'
์๋ํฌ์ธํธ๋ก ๋ถ๊ธฐ์ ์ ์ก๊ณ ๊ทธ ์์์๋ http์์ฒญ ๋ฉ์๋
์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋ต์ ๋ด๋ณด๋ด๋๋ก ๋ผ์ฐํ
๊ตฌํ
const requestHandler = (req, res) => {
if(req.url === '/lower') {
if (req.method === 'GET') {
res.end(data)
} else if (req.method === 'POST') {
req.on('data', (req, res) => {
// do something ...
})}}}
http ๋ฉ์๋ ์์ ์ธ์๋ก ์๋ํฌ์ธํธ๋ฅผ ๋ฃ์ด์ฃผ๊ณ ์ด ๊ฒฝ์ฐ ์ด๋ค ์๋ต์ ๋ด๋ณด๋ผ๊ฑด์ง ํจ์๋ก ๊ตฌํ
const router= express.Router()
router.get('/lower',(request,response)=>{
response.send(data);
})
router.post('/lower',(request,response)=>{
///
})
์ด๊ฑด ๋ญ์ ธ ?
const router= express.Router()
์์์๋ ๋งํ์ง๋ง Express ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ค ํ๋๊ฐ ๋ผ์ฐํ ์ ๊น๋ํ๊ฒ ๊ด๋ฆฌ ํ ์ ์๋ค๋ ์ ์ด๋ค.!
์น์ด ์ปค์ง๋ฉด ์๋ฒ์๋ app.get ๊ณผ ๊ฐ์ ๋ฉ์๋๊ฐ ์ด๋ผ ๋ง์ด ์๊ฒจ ์ฝ๋๊ฐ ๋งค์ฐ ๊ธธ์ด์ง๋ค.
๊ทธ๋์ Express ์์๋ ๋ผ์ฐํฐ๋ฅผ ๋ถ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํจ!
๊ทธ๊ฒ์ด ๋ฐ๋ก express.Router( ) ๋ฅผ ์ด์ฉํ๋ ๊ฒ!
๋ฉ์ธํ์ผ : app.js
๋ผ์ฐํฐ๋ฅผ ์ ์ฅํ ํ์ผ : index.js
, user.js
index.js
, user.js
ํ์ผ๋ค์ routes ํด๋์ ์ ์ฅ ์ํจ๋ค๊ณ ๊ฐ์ก
// routes/index.js ํ์ผ
const express = require('express');
const router= express.Router()
router.get('/',(request,response)=>{
response.send('hello');
})
module.exports = router;
// routes/user.js ํ์ผ -----------------------
const express = require('express');
const router = express.Router();
router.get('/iam', (req, res) => {
res.send('Hello, User');
});
module.exports = router;
app.js ํ์ผ
const express = require('express');
const app = express();
const indexRouter = require('./routes'); // router.get('/', (req, res) => { ... ์ ๋ถ๋ฌ์ด
const userRouter = require('./routes/user'); // router.get('/iam', (req, res) => { ... ์ ๋ถ๋ฌ์ด
app.set('port', process.env.PORT || 3000);
app.use('/', indexRouter); // ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒฝ๋ก์ ๋ฏธ๋ค์จ์ด ์ฅ์ฐฉ
app.use('/user', userRouter); // ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒฝ๋ก์ ๋ฏธ๋ค์จ์ด ์ฅ์ฐฉ
app.use((req, res, next) => { // ๊ธฐ๋ณธ๊ฒฝ๋ก๋ /user๋ง๊ณ ๋ค๋ฅธ๊ณณ ์ง์
ํ์๊ฒฝ์ฐ ์คํ
res.status(404).send('Not Found');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '๋ฒ ํฌํธ์์ ๋๊ธฐ ์ค');
});
index.js
, user.js
๊ฐ ์๊ธด๊ฑด ๋น์ทํด๋ ์๋ก ๋ค๋ฅธ ์ฃผ์์ ๋ผ์ฐํฐ ์ญํ ์ ํ๊ณ ์๋ค.
app.use
๋ก ์ฐ๊ฒฐํ ๋์ ์ฐจ์ด ๋๋ฌธ!
indexRouter๋ app.use('/')์ ์ฐ๊ฒฐํ๊ณ (index)
userRouter๋ app.use('/user')์ ์ฐ๊ฒฐํ๋ค.(user)
์๋ฒ๋ก ์คํํ ๋ค localhost:3000/
๊ณผ localhost:3000/user/iam
๋ก ์ ์ํ๋ฉด ๊ฐ๊ฐ์ ํด๋นํ๋ ์๋ต์ ๋ฐ์ ์ ์๋ค.
Express.Router( ) ์๋ next ํจ์๊ฐ ์กด์ฌํ๋ค. next ํจ์๋ ๋ค์ ๋ผ์ฐํฐ๋ก ๋์ด๊ฐ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
next('route')
const express = require('express');
const router = express.Router();
router.get('/', (req, res, next) => {
next('route'); // ๋ค์ ๋ผ์ฐํฐ ๋ฏธ๋ค์จ์ด๋ก ์ ํํ๋ค.
}, (req, res, next) => {
console.log('์คํ๋์ง ์์ต๋๋ค.');
next();
});
router.get('/', (req, res) => {
console.log('์คํ๋ฉ๋๋ค.');
res.send('Hello, Express.');
});
next('route') ํจ์ ์ฌ์ฉ์ผ๋ก ํด๋น get ๋ฉ์๋์ ์ธ๋ฒ์งธ ํจ์๊ฐ ์คํ๋์ง ์๊ณ ๋ค์ get ๋ฉ์๋์ ๋ผ์ฐํฐ๊ฐ ์คํ๋๋ค!
์๋ํฌ์ธํธ๋ ๊ฐ์๋ฐ Http ๋ฉ์๋๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ?
๊ทธ๋ด ๋ ์ด๋ฅผ ํ๋์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ์ค ์ ์๋ค!
const express = require('express');
const router = express.Router();
router.get('/abc', (req, res) => {
res.send('GET /abc');
});
router.post('/abc', (req, res) => {
res.send('POST /abc');
});
๊ฐ์ ์๋ํฌ์ธํธ์ธ /abc
๋ก get ์์ฒญ๊ณผ post ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ค.
์ด๋ฐ๊ฒฝ์ฐ์ router.route
๋๋ app.route
๋ก ๋ฌถ์ ์ ์๋ค.
const express = require('express');
const router = express.Router();
router.route('/abc')
.get((req,res) => {
res.send('GET /abc');
})
.post((req, res) => {
res.send('POST /abc');
});
ํท๊ฐ๋ฆฌ๋ฉด์๋ ์๋ ๋๋ ์
query parameter
๊ฒฝ๋ก ๋ค์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ์ ๊ณตํ๋ ์์ผ๋ก ์ฌ์ฉํ๋ค.
/user?id=10
์์ ์ฝ๋์์ ๋ฌผ์ํ( ? ) ๋ค์ ๋์ค๋ id=10
์ด ๋ถ๋ถ์ query string ์ด๋ผ๊ณ ํ๋ฉฐ
key
์ value
์ ์์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค. &
์๋ ํ์๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ถ์ผ ์๋ ์๋ค.
๊ฒฝ๋ก๋ฅผ ๋ณ์๋ก ์ฌ์ฉํ๋ ๊ฒ
/user/{:id}
{:id}
์ด ๋ถ๋ถ์ด path ๋ถ๋ถ์ด๊ณ ํด๋น id ๊ฐ์ด๋ ํ์ํ ๊ฐ์ด ๋ค์ด๊ฐ๋ค.
๋ฏธ๋ค์จ์ด๋ Express ๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ค ํ๋์ด๋ค! ๊ฐ์ฅ ํฐ ์ด์ ๋ผ๊ณ ํด๋ ๋ฌด๋ฐฉํ๋ค.
๋ฏธ๋ค์จ์ด๋ HTTP ์์ฒญ๊ณผ ์๋ต ์ฌ์ด์์ ๋จ๊ณ๋ณ ๋์์ ์ํํ๋ ํจ์์ด๋ค.
๋ฏธ๋ค์จ์ด๋ HTTP Request(์์ฒญ)์ด ๋ค์ด์จ ์๊ฐ๋ถํฐ ์์ฐจ์ ์ผ๋ก ์์๋๋ค.
HTTP ์์ฒญ๊ณผ ์๋ต ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, ๋ค์ ๋ฏธ๋ค์จ์ด๋ฅผ ์คํํ ์ ์๋ค.
HTTP ์๋ต์ด ๋ง๋ฌด๋ฆฌ๋ ๋๊น์ง ๋ฏธ๋ค์จ์ด ๋์ ์ฌ์ดํด์ด ์คํ๋๋ค. ์์ ์ฌ์ง ์ฒ๋ผ!
๊ทธ๋ ๋ค ๋ฏธ๋ค์จ์ด๋ ์ฐ๋ฆฌ๊ฐ ๋ผ์ฐํฐ๋ฅผ ์์ฑํ ๋ ์๋ํฌ์ธํธ ๋ค์ ์ธ์๋ก ๋ฐ๋ ํจ์๋ฅผ ๋ฏธ๋ค์จ์ด๋ผ๊ณ ํ๋ค!
์ ํํ ๋งํ์๋ฉด ์ธ์๋ก req
,res
,next
๋ฅผ ๊ฐ๋ ํจ์๋ ๋ฏธ๋ค์จ์ด๋ก ๋์ ํ ์ ์๋ค.
next() ํจ์๊ฐ ํธ์ถ๋์ง ์์ผ๋ฉด ๋ฏธ๋ค์จ์ด ์ฌ์ดํด์ด ๋ฉ์ถ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ๋๋ค.
app.use()
๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ๋ฏธ๋ค์จ์ด๋ฅผ ์คํ์ํค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
app.http๋ฉ์๋
๋ ํด๋น ๋ฉ์๋ ์์ฒญ์ ๋ํด ๋ฏธ๋ค์จ์ด๋ฅผ ์คํ์ํฌ ๋ ์ฌ์ฉํ๋ค.
๊ณต์ ๋ฌธ์
๋ผ์ฐํ
์ฐธ๊ณ
์ฐธ๊ณ ๋ธ๋ก๊ทธ
๋ฏธ๋ค์จ์ด ์ฐธ๊ณ