Node.js
๐ Chrome V8 Javascript ์์ง์ผ๋ก ๋น๋๋ Javascript ๋ฐํ์์ด๋ค.
node.js๋ ์๋ฒ ์คํ์ฉ์ผ๋ก ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
- ๋ฐํ์ : ํน์ ์ธ์ด๋ก ๋ง๋ ํ๋ก๊ทธ๋จ๋ค์ ์คํํ ์ ์๋ ํ๊ฒฝ
- ์๋ฒ : ๋คํธ์ํฌ๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ ๋ณด๋ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ปดํจํฐ ๋๋ ํ๋ก๊ทธ๋จ
- ํด๋ผ์ด์ธํธ : ์์ฒญ์ ๋ณด๋ด๋ ์ฃผ์ฒด๋ก, ์ฃผ๋ก ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ฏธํ๋ค.( ๋ชจ๋ฐ์ผ ์ฑ์ด๋, ๋ค๋ฅธ ์๋ฒ์ ์์ฒญ์ ๋ดฌ๋ ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ ์ ์๋ค. )
ํน์ฑ
โ ์ด๋ฒคํธ๊ธฐ๋ฐ
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ฌ์ ์ ์ง์ฌ์ง ์์ ์ ์ํํ๋ค. ์ฆ ํน์ ์ด๋ฒคํธ ๋ฐ์ ์ ํด๋น ์ด๋ฒคํธ์ ์ค์ ํด๋ ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๋ค. ํธ์ถ๋ ํจ์๋ค์ ์์๋๋ก ํธ์ถ ์คํ์ ๋ค์ด๊ฐ๊ณ ํจ์ ์คํ์ด ์๋ฃ๋๋ฉด ํธ์ถ ์คํ์์ ๋ง์ง๋ง์ ๋ค์ด๊ฐ ํธ์ถ๋ถํฐ ์ง์์ง๊ฒ ๋๋ค. ์ฆ ํ์ ์ ์ถ(LIFO: Last In First Out)์ด๋ค.
โ ๋ ผ๋ธ๋กํน I/O
์ด์ ์์ ์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ค๋ฅธ ์์ ์ ์ํํ๋ ๊ฒ์ด๋ค. (๋ธ๋กํน์ ์ด์ ์์ ์ด ๋ชจ๋ ์๋ฃ๋ ํ์ ๋ค๋ฅธ ์์ ์ํ์ด ๊ฐ๋ฅํ๋ค.) ๋ ธ๋๋ I/O์์ ์ ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋๊ฒจ ๋์์ ์ฒ๋ฆฌํ๋ค.
* I/O๋?
์ฃผ๋ก libuv๊ฐ ์ง์ํ๋ ์์คํ
๋์คํฌ๋ ๋คํธ์ํฌ์ ์ํธ์์ฉํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ฆ ํ์ผ์ ์ฝ๊ฑฐ๋ ํ์ผ์ฐ๊ธฐ, ํด๋ ๋ง๋ค๊ธฐ ๋ฑ ํ์ผ์์คํ
์ ๊ทผ์ด๋ ๋คํธ์ํฌ๋ฅผ ํตํ ์์ฒญ ๋ฑ์ด ์ด์ ํด๋น๋๋ค.
* libuv : ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋๊ธฐ I/O๋ฅผ ์ง์ํ๋ ๋ค์ค ํ๋ซํผ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
๋ ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์ง๋ ๊ฒ์ ์์ ์คํ์ ์ฑ๋ฅ์ ๋์ฌ์ค๋ค.
ex) ๋ ผ๋ธ๋กํน ์์
node.js์ ๊ฒฝ์ฐ '์์'์ ์ถ๋ ฅํ ์ดํ์ '์์ ์๋ฃ' ๊ฐ ์ถ๋ ฅํ๋ ์์ ์ด ์๋ฃ๋์ง ์์๋๋ผ๋ ๋ค์ ์์ ์ ์คํํ๋ค.
function longRunningTask() {
// ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
console.log('์์
์๋ฃ');
};
console.log('์์');
setTimeout(longRunningTask,1);
console.log('๋ค์์์
');
// ์์ ์ฝ๋ ์คํ์
// ์์ -> ๋ค์์์
-> ์์
์๋ฃ
node.js ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ I/O ๋ฉ์๋๋ ๋ ผ๋ธ๋กํน์ธ ๋น๋๊ธฐ ๋ฐฉ์์ ์ ๊ณตํ๊ณ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฐ๋๋ค.
ํ์ง๋ง ์์ ์ ํ๋ค๋ณด๋ฉด ์ด์ ์ ์์ ์ด ๋ชจ๋ ์๋ฃ๋ ํ์ ๋ค์ ์์ ์ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋์ ์ฝ๋๊ฐ ๊ทธ ์์์ด๋ค.
const fs = requir('fs');
fs.readFile('/file.md',(err,data) => {
if(err) throw err;
console.log(data);I/O
});
fs.unlinkSync('/file.md');
// ์ ์ฝ๋์ ๋ฌธ์ ์ ์ I/O๊ฐ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์์์ fs ํ์ผ์ด
// ๋ค ์ฝํ์ง๊ธฐ๋ ์ ์ unlinkSync()๊ฐ ์คํ๋์ด ํ์ผ์ด ์ ๊ฑฐ๋ ์ํ์ด ์๋ค.
// ๊ทธ๋ฌ๋ฏ๋ก ์ฝ๋๋ ์๋์ ๊ฐ์ด ์์ ๋์ด์ผ ํจ.
const fs = require('fs');
fs.readFile('/file.md',(readFileErr,data) => {
if(readFileErr) throw readFileErr;
console.log(data);
fs.unlink('/file.md',(funlinkErr) => {
if(unlinkErr) throw unlinkErr;
})
})
๋๋ promise๋ async await ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ์์ ์ด ์๋ฃ๋ ํ ๋ค์ ์์ ์ ์คํํ๋๋ก ๋๊ธฐ์์ผ๋ก ๊ตฌํํ ์ ์๋ค.
โ ์ฑ๊ธ์ค๋ ๋
node.js๋ ์ฑ๊ธ ์ค๋ ๋์ด๋ค.
๐ ์ดํด๋ฅผ ๋๋ ์์ฃผ ์ข์ ์์
์ ์์ด ํ ์๋์ ์ฃผ๋ฌธ์ ๋ฐ๊ณ ์ฃผ๋ฐฉ์ ์ฃผ๋ฌธ๋ด์ญ์ ๋๊ธด ๋ค ๋ค์ ์๋์ ์ฃผ๋ฌธ์ ๋ฐ์ต๋๋ค. ์ ์์ ์๋ฆฌ๊ฐ ๋๋๊ธฐ ๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ , ์ฃผ๋ฌธ๋ด์ญ๋ง ์ฃผ๋ฐฉ์ ๊ณ์ ์ ๋ฌํ๊ณ , ์ฃผ๋ฐฉ์์ ์๋ฆฌ๊ฐ ์๋ฃ๋๋ฉด ์๋ฃ๋ ์์๋๋ก ์๋์๊ฒ ์๋นํฉ๋๋ค. ์๋ฆฌ์ ํน์ฑ(๋ธ๋กํน์ธ์ง ๋ ผ๋ธ๋กํน์ธ์ง)์ ๋ฐ๋ผ ์๋ฃ๋๋ ์์๊ฐ ๋ฌ๋ผ์ง ์ ์์ด, ์ฃผ๋ฌธ์ ๋ค์ด์จ ์์์ ์๋นํ๋ ์์๊ฐ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค.
์๋ฆฌ๋ฅผ ํ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค๋ฉด( CPU๊ฐ ๋ง์ด ์๋ชจ๋๋ ์์ ) ์ฃผ๋ฌธ์ด ๋ง์ด ๋ค์ด์ค๋ฉด ๋ฒ๊ฑฐ์ธ ์ ์๋ค.
์ฆ ์ฑ๊ธ์ค๋ ๋ == ์ ์ ํ ๋ช
โ NPM (=Node Package Manager)
โ Package.json
์ค์น๋ ํจํค์ง์ ๋ฒ์ ์ ๊ด๋ฆฌํด์ฃผ๋ ํ์ผ์ด๋ค.
> npm init
> npm install [ ํจํค์ง๋ช ]
> npm uninstall [ ํจํค์ง๋ช ]
โ express
javascript๋ก ์์ฑ๋๊ณ Node.js ๋ฐํ์ ํ๊ฒฝ์์ ๊ตฌ๋๋๋ ์น ํ๋ ์์ํฌ์ด๋ค.
- app.all( [ ๊ฒฝ๋ก ] , [ ์ฝ๋ฐฑํจ์ ] )
// ๋ชจ๋ ์์ฒญ ๋ฉ์๋ ( get, post, delete, put ...)์ ๋ํ์ฌ ํด๋น ๊ฒฝ๋ก๋ก ๋ค์ด์ฌ ๋ ๋๋ฒ์งธ ์ธ์๋ก ์ค ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ค.
app.all('/user', ()=>{console.log( '๋ก๊ทธ์ธ ํ์์ต๋๋ค.' )});
// ์ด๋ค ๋ฉ์๋๋ก ์์ฒญํ๋์ ์๊ด์์ด /user๋ก ์์ฒญํ ๊ฒฝ์ฐ '๋ก๊ทธ์ธ ํ์์ต๋๋ค.'๋ฅผ ์ถ๋ ฅํด์ค๋ค.
- app.use( [๋ฏธ๋ค์จ์ด] ) or - app.use([๊ฒฝ๋ก], [๋ผ์ฐํธ])
app.use(cookieParser())
// ํด๋น ์๋ฒ์์ cookieParser๋ฅผ ์ฌ์ฉ.
const api = require('./api'); // api๋ ๋ผ์ฐํธ ํ์ผ
app.use('/api', api);
// '/api' ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ํด api ๋ฅผ ์ฌ์ฉํ๋ค.
์์ฒญ๋ฉ์๋
- get
- post
- put
- delete
- ...
์๋ต๋ฉ์๋
- res.json(). // ์๋ต์ json ํ์์ผ๋ก ๋ฐํ
- res.download() // ํ์ผ์ด ๋ค์ด๋ก๋๋๋๋ก ํ๋กฌํํธ
- res.end() // ์๋ต ํ๋ก์ธ์ค ์ข ๋ฃ
- res.redirect() // ๊ฒฝ๋ก ์ฌ์ง์
- res.render() // ์ธ์๊ฐ์ผ๋ก ์ค ํ ํ๋ฆฟ์ ๋ณด์ฌ์ค๋ค.
- res.send() // ์ธ์๊ฐ ๊ทธ๋๋ก ์ถ๋ ฅ
- res.sendFile() // ์ธ์๊ฐ์ผ๋ก ์ค ํ์ผ์ ํ๋ฉด์ ์ถ๋ ฅ
- res.sendStatus() // ํด๋น ์ํ ์ฝ๋๋ฅผ ๋ดํ
app.use( [๋ฏธ๋ค์จ์ด] ) or app.use([๊ฒฝ๋ก], [๋ผ์ฐํธ])
app.use(cookieParser())
// ํด๋น ์๋ฒ์์ cookieParser๋ฅผ ์ฌ์ฉ.
const api = require('./api'); // api๋ ๋ผ์ฐํธ ํ์ผ
app.use('/api', api);
// '/api' ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๋ํด api ๋ฅผ ์ฌ์ฉํ๋ค.
๊ธฐ๋ณธ ์ฝ๋
const express = require('express')
const app = express()
require('dotenv').config('env')
// dotenv์ฌ์ฉ์ ์ํ ์ธํ
// env ํ์ผ ์์ PORT=3010 ์ด์ ๊ฐ์ด ํค=๊ฐ ํ์์ผ๋ก ์ ์ฅํ
// ์ค์ ์ฌ์ฉ์์๋ ์๋์ ๊ฐ์ด process.env.PORT ์ด๋ ๊ฒ ์ฌ์ฉ
// ||๋ ๋ง์ฝ์ ํด๋น ํค๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ 3010์ ๊ฐ์ ์ฌ์ฉํ๊ฒ ๋ค.
const port = process.env.PORT||3010
const morgan = require('morgan')
// morgan ๋ฏธ๋ค์จ์ด๋ logging ์ฆ ์ํ์ ๋ํ ๊ธฐ๋ก์ ๋ณด์ฌ์ฃผ๋ ๋ฏธ๋ค์จ์ด
const cookieParser = require('cookie-parser')
const bodyParser = require('body-parser')
// ์ฟ ํค ํ์ฑ์ ๋๋ ๋ฏธ๋ค์จ์ด
app.use(express.urlencoded({extended:false}))
app.use(morgan(':method:url'))
// method์ url์ ๋ํ ์ ๋ณด๋ง ๋ณด์ฌ์ค
//app.use(morgan('tiny'));
// morgan()์ ์์ ์ค๋ ์ธ์์ ๋ฐ๋ผ ๋ณด์ฌ์ฃผ๋ ๋ด์ฉ์ด ๋ค๋ฅด๋ค.
// http://expressjs.com/en/resources/middleware/morgan.html ๊ด๋ จ
app.use(cookieParser())
// cookie-parser์ฌ์ฉ
// req๋ฅผ ํตํด cookies ๊ฐ์ฒด์ ์ ๊ทผ ๊ฐ๋ฅ
app.get('/',(req,res)=>{
if(req.cookies.remember){
// cookie-parser๋ฅผ ํตํด request๊ฐ์ฒด์ ์ฟ ํค์ ์ ๊ทผ ๊ฐ๋ฅ
// ์ฆ ํด๋น /์ ๋ค์ด์์ ๋ ์ฟ ํค์ remember์ด ์๋ค๋ฉด ์๋์ ๋ด์ฉ์ ์คํ
//console.log('if')
res.send('Remembered :).Click to <a href="/forget">forget</a>')
}else{
// remember์ด ์๋ค๋ฉด
// ์๋์ ๋ด์ฉ์ ์คํ
//console.log('else')
res.send('<form method="post"><p>check to<label>'
+'<input type="checkbox" name="remember"/> remberer me</label>'
+'<input type="submit" value="์ ์ถ"/>0</p></form>')
}
})
app.get('./forget',function(req,res){
res.clearCookie('remberer');
res.redirect('back');
})
app.post('/',(req,res)=>{
let min = 60000
if(req.body.remember) res.cookie('remember',1,{maxAge:min})
res.redirect('back')
})
app.listen(port,()=>{
console.log(`server start port${port}`)
})
์๋ฒ์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฐ๊ฒฐํ๊ธฐ
> npm install mysql
// mysql๋ก ์ฐ๊ฒฐ์ ์๋ฌ๋๋ ๊ฒฝ์ฐ mysql2๋ก ์ฌ์ฉํ๋ค.
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root'
});
// ์์ ์ค์ ์ ์ค์ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ค์ ๋ ๊ฒ์ ์ฌ์ฉํ๋ค.
connection.connect();
// ์ฌ์ฉํ ๋๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
// board ํ
์ด๋ธ์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์
connection.query(`SELECT * FROM board`, (err, rows, fields) => {
if(err) throw err;
console.log(rows);
});
connection.end();
'Javascript > Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ NestJs ] - NestJs๋? (0) | 2022.06.15 |
---|---|
[ Node.js ] - iamport๋ฅผ ์ฌ์ฉํด์ pg์ฌ ์ฐ๋ํด๋ณด๊ธฐ (0) | 2022.06.15 |
[ Node.js ] - ์๋ฒ DDos ๊ณต๊ฒฉ ๋ง๊ธฐ (0) | 2022.06.02 |
[ Node.js ] - axios์ node-fetch๋ก ํต์ ํ๊ธฐ (0) | 2022.06.02 |
[ Node.js ] - swagger-ui (0) | 2022.04.05 |