reference: Do it! Node.js ํ๋ก๊ทธ๋๋ฐ by ์ ์ฌ๊ณค, Node.js ๊ต๊ณผ์ by ์ ๋ก์ด
โ๏ธ JS๋ ๋์ ํ์ดํ(dynamic type language) ์ธ์ด.
- ๊ฐ์ ๋ฐ๋ผ ๋ณ์ type์ด ๋ฌ๋ผ์ง.
โ๏ธ Object
- ์ ํ๊ธฐ๋ฒ๊ณผ ๊ดํธํ๊ธฐ๋ฒ
- ์ ํ๊ธฐ๋ฒ : ์ ํจํ ๋ณ์ ์๋ณ์์ผ ๊ฒฝ์ฐ (๊ณต๋ฐฑX, ์ซ์์์X, $ or _ ์ ์ธํ ํน์ ๋ฌธ์X)
- ๊ดํธํ๊ธฐ๋ฒ : ๋ชจ๋ ํํ์์ ํ๊ฐ ๊ฒฐ๊ณผ๋ฅผ property ํค๋ก ์ฌ์ฉ๊ฐ๋ฅโ
๐๐ป ๋๊ดํธํ๊ธฐ๋ฒ์ ๋ฐํ์์ ํ๊ฐ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅโ
- ์ ํ๊ธฐ๋ฒ : ์ ํจํ ๋ณ์ ์๋ณ์์ผ ๊ฒฝ์ฐ (๊ณต๋ฐฑX, ์ซ์์์X, $ or _ ์ ์ธํ ํน์ ๋ฌธ์X)
โ๏ธ Function
- ํจ์ ์ ์ธ์๊ณผ ํจ์ ํํ์
โ๏ธ Array
- for ๋ฐ๋ณต๋ฌธ๊ณผ forEach
- ๋ฐฐ์ด์ ๋ด์ฅํจ์ (push, pop, unshift, shift)
- delete์ splice, slice
โ๏ธ Call-Back function
- ํจ์์ ์ธ์๋ก ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ
- ์ฝ๋ฐฑํจ์๋ ํด๋ก์ ์
- ํด๋ก์ : ์ธ๋ถํจ์์ ์คํ์ด ์ข ๋ฃ๋์ด๋, ์ธ๋ถํจ์์ ๋ฒ์์ ์ ๊ทผํ ์ ์๋ ๋ด๋ถํจ์
โ๏ธ Prototype
- ๊ฐ์ฒด์ ์ํ = ํ๋กํ ํ์ (class ์ญํ )
- ํ๋กํ ํ์ ์ ๋ง๋ค๊ณ new ์ฐ์ฐ์๋ฅผ ํตํด ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์.
- ์ฆ ํจ์๋ฅผ ๋ถ์ด๋นต ํ์ ๋ง๋ค๊ธฐ ์ํ ์ฉ๋๋ก ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ! ๐คช
๐พ ์ฃผ์ ๋ฌธ์์ด ๋ถ๋ฆฌ
- ํ์: https:// (IP) / ์์ฒญ path ? ์์ฒญ parameter (์ด๋ฆ = ๊ฐ)
- ์์ฒญ parameter ์ฌ์ด์ฌ์ด๋ & ๋ก ์ฐ๊ฒฐ๋จ.
- ์ด์ค ๊ฒ์์ด๋ query = ๊ฐ
โ๏ธ url ๋ชจ๋์ require๋ก ๋ถ๋ฌ์ ๋ณ์์ ํ ๋น.(๊ฐ์ฒดํํ)
- ๊ฐ์ฒด.parse('์ฃผ์') ์คํํ๋ฉด ๋ฌธ์์ด์ ๊ฐ์ฒด๋ก ๋ฆฌํดํด์ค.
- format('๋ณํ๋ ๊ฐ์ฒด')๋ ์๋ ๋ฌธ์์ด๋ก ๋ณํ.
โ๏ธ querystring ๋ชจ๋์ require๋ก ๋ถ๋ฌ์ ๋ณ์์ ํ ๋น.(๊ฐ์ฒดํํ)
- parse('์ด๋ฏธ ํ๋ฒ parse๋ ์ฃผ์')๋ฅผ ๋ฃ์ผ๋ฉด ๋ค์ parseํด์ค.
๐พ ์ด๋ฒคํธ
- ๋ ธ๋์ ๊ฐ์ฒด๋ EventEmitter๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด์ on(), emit() ๋ฉ์๋๋ฅผ ์ฌ์ฉ ๊ฐ๋ฅ.
- UI ์ ์ด๋ฒคํธ ์๋.
โ๏ธ EventEmitter
- A ๋ชจ๋์์ B ๋ชจ๋๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉ.
- emit()
- ์ด๋ฒคํธ๋ฅผ ๋ณด๋
- on()
- ์ด๋ฒคํธ๋ฅผ ๋ฐ์
๐พ ํ์ผ์ ์ฝ์ด ์ถ๋ ฅํด๋ณด๊ธฐ
โ๏ธ fs ๋ชจ๋์ require๋ก ๋ถ๋ฌ์ ๋ณ์์ ํ ๋น.
- fs.readFileSync() : file์ ๋ค ์ฝ์ ๋๊น์ง ๋๊ธฐ (๋๊ธฐ์)
- fs.readFile() : file์ ๋ค ์ฝ์ ๋๊น์ง ๋๊ธฐํ์ง ์๊ณ , ๋ค ์ฝ์ผ๋ฉด ์ฝ๋ฐฑํจ์ ์คํ (๋น๋๊ธฐ์)
๐พ ํ์ผ์ ๋ง๋ค๊ณ ์ฐ๊ธฐ
- fs.writeFile('๊ฒฝ๋ก', '๋ด์ฉ', ์ฝ๋ฐฑํจ์) ๋ฅผ ํตํด ํ์ผ ์ฐ๊ธฐ ๊ฐ๋ฅ
๐พ ํ์ผ์ ์ง์ ์ด๊ณ ๋ซ์ผ๋ฉด์ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ
- open(path, flags, [, mode][, callback])
- mode: w, r ๋ก ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ๊ถํ ๋ถ์ฌ
- read (fd, buffer, offset(index), length, position [, callback])
- fd: ์ฝ๋ฐฑ ํจ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ์ fd
- write (fd, buffer, offset, length, position [, callback])
- close (fd [, callback])
โ๏ธ Buffer
- ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ ์กํ ๋ ์ผ์์ ์ผ๋ก ๋ณด๊ดํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ
โ๏ธ stream
- ์ฐ์๋ byte๋ฅผ ๋ฐ์๋ค์ด๋ ํต๋ก, ๋ฐ์ดํฐ๋ฅผ ์ธ ํต๋ก
๐พ ๋ก๊ทธ ํ์ผ ๋จ๊ธฐ๊ธฐ
- winston ์ธ์ฅ ๋ชจ๋ ์ฌ์ฉ
โ๏ธ http & express
- ๋ ธ๋์ ๊ธฐ๋ณธ์ผ๋ก ๋ค์ด์๋ http ๋ชจ๋์ ์ฌ์ฉํด ์น ์๋ฒ๋ฅผ ๊ฐ์ฒด๋ก ๋ง๋ฆ.
- ์ถ๊ฐ๋ก ํ์ํ ๊ฒ๋ค์ด ๋๋ฌด ๋ง์ express ์ฌ์ฉ.
โ๏ธ server
- ํด๋ผ์ด์ธํธ ์์ฒญ์ ๋๊ธฐํ๊ณ ์๋ค๊ฐ ์์ฒญ์ ๋ฐ์ ํ์ํ ์๋ต์ ํจ.
- server ๊ฐ์ฒด.listen('ํฌํธ๋ฒํธ', ์๋ฒ ์คํ์ ํธ์ถ๋๋ ํจ์)
- listen() = ์๋ฒ๋ฅผ ์คํํ์ฌ ๋๊ธฐ.
- ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ port๋ฅผ ์ฌ์ฉ.
- server ๊ฐ์ฒด๋ eventemitter๋ฅผ ์ด๋ฏธ ์์ํด์ emit, on () ์ฌ์ฉ ๊ฐ๋ฅ.
๐พ ๋งฅ์์ ip ํ์ธ ๋ฐฉ๋ฒ
- ipconfig getifaddr en0
โ๏ธ event
- connection = ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ์ ๋ ์ด๋ฒคํธ
- connection ์ด๋ฒคํธ ๋ฐํ์ ๋ด๋ถ์ ์ผ๋ก socket์ด ๋ง๋ค์ด์ง.
- ํด๋ผ์ด์ธํธ socket์์ .address ๋ฉ์๋ ๋ฑ์ ํตํด ip๋ ๋ฐ์์ค๊ธฐ ๊ฐ๋ฅ.
- request = ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ ๋ณด๋ผ ๋ ์ด๋ฒคํธ
- ํ๋ผ๋ฏธํฐ๋ก req, res๋ฅผ ๋ฐ์.
- res.writeHead() ์๋ต์ผ๋ก ๋ณด๋ผ ํค๋๋ฅผ ๋ง๋ฆ.
- res.write() ๋ก html ์๋ต body ๋ฐ์ดํฐ ๋ง๋ฆ.
- res.end() ๋ก ์ ์ก
- ์ด๋ฏธ์ง ํ์ผ์ ์ฝ์ด์ ๋ณด๋ด๊ธฐ
- fs ๋ชจ๋์ ๋ฐ์์ค๊ธฐ
- 1๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ํ์ผ ์ด๋ฆ
- 2๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ํจ์๋ฅผ ์ ๋ฌ๋ฐ์ err๊ฐ์ฒด์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์.
- ๋ค์๊ณผ์ ์ ์์ ๊ฐ์
- ๋ง์ธํ์ : ํ์ผ์ ์ด๋ค ํ์์ผ๋ก ๋ฐ์์ ๋ณด์ฌ์ค๊ฑด์ง ์ง์ ํ๋ ๊ฒ.
๐พ ๋ค๋ฅธ ์น์๋ฒ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ํ ๊ณณ์ ์ฌ์ฉ 7ใ ๋ฅ!
- http ๋ชจ๋์ get ๋ฉ์๋๊ฐ ์์.
โ๏ธ express
- ๋ฏธ๋ค์จ์ด, ๋ผ์ฐํฐ ๊ธฐ๋ฅ์ ์ง์คํ๊ธฐ.
- express๋ http ๋ชจ๋์ ๋ฌด์กฐ๊ฑด ์.
- express ๋ชจ๋๋ก ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ ํจ์๋ก ์คํํด ๋ณ์์ ๋ด์ผ๋ฉด express server ๊ฐ์ฒด๊ฐ ๋จ.
- **set()**๋ก ํฌํธ ์ค์ ํ๊ธฐ
- .set('port', process.env.PORT || 3000)
- http.createServer() ์ธ์๋ก port ์ค์ ํ ๋ณ์๋ฅผ ๋ด์ผ๋ฉด express ์๋ฒ๊ฐ ๋ง๋ค์ด์ง.
- **get()**๋ก ํฌํธ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
- .get('port')
๐พ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ๋ณด๋ผ ๋ ์๋ต ๋ฐ๊ธฐ
-
๋ฏธ๋ค์จ์ด
- ํด๋ผ์ด์ธํธ ์์ฒญ์ ์ค๊ฐ์ ๊ฐ๋ก์ฑ์ ๋ฐ์.
- ์ฌ๋ฌ๊ฐ๋ก ๋ฑ๋ก ๊ฐ๋ฅ => use() ์ฌ์ฉ
- 1๋ฒ์งธ ์ธ์๋ก ์์ฒญ path๋ฅผ ๋ฃ์ ์๋ ์์ => '/' ๋ฑ๋ฑ
- ์ธ์๋ก req, res, next๋ฅผ ๋ฐ์. => use(function (req, res, next) {})
- next()๋ก ๋ค์ ๋ฏธ๋ค์จ์ด๊ฐ ๋ฐ์
- writeHead(), end() ํ ํ์์์ด res.send() ๋ก ์ฒ๋ฆฌ๊ฐ๋ฅ
- send () ์ธ์๋ก ๊ฐ์ฒด๋ฅผ ๋ฐ์ผ๋ฉด JSON ํฌ๋งท์ผ๋ก render๋์ง๋ง ์ฐ๋ฆฌ๊ฐ ๋ช ์์ ์ผ๋ก ๋ฌธ์์ด๋ก ๋ณํํ๋๊ฒ ์ค๋ฅ ํ๋ฅ ์ด ์ ๋ค!๐ฅ
- res.redirect()
- ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์น ์๋ฒ ์์ ๋ค๋ฅธ ์์ฒญ path๋ก ์ฐ๊ฒฐ์ํฌ ์ ์๋ค!!! => ๋ก๊ทธ์ธ ์ ๋ ๊ธฐ๋ฅ ๋ฑ๋ฑ
-
์์ฒญ path์ ์์ฒญ parameter
- http://localhost:3000 = ip์ port ๋ฒํธ
- http://localhost:3000/users = ํน์ ๊ฒฝ๋ก = ์์ฒญ path
- http://localhost:3000/users?name=mike = ? ๋ค์ ํค์ ๊ฐ์ ์์ฒญ parameter
- & ๋ก ์ฐ๊ฒฐ
- ๐๐ป ์ฃผ์์ฐฝ์ ์์ฒญ parameter๊ฐ ๋ฐ๋ก ๋ณด์ด๋ ๋ฐฉ์: get
- req.query. => get ๋ฐฉ์์ผ๋ก ์ ์กํ ํ๋ผ๋ฏธํฐ ํ์ธ
- req.body. => post ๋ฐฉ์์ผ๋ก ์ ์กํ ํ๋ผ๋ฏธํฐ ํ์ธ
-
router
- ์์ฒญ path์ ๋ฐ๋ผ ๋ค๋ฅธ ํจ์๊ฐ ์คํ๋๋๋ก ๋ง๋ฆ.
- ex) / path > A ํจ์, /users > B ํจ์
๐พ ๋ฏธ๋ค์จ์ด
์ฐ๋ฆฌ๊ฐ ์ผ์ผ์ด ๋ง๋ค์ง ์๊ณ , ๋จ๋ค์ด ๋ง๋ค์ด๋์ ๋ฏธ๋ค์จ์ด๋ค์ ์ฌ์ฉํด๋ณด์
- static ๋ฏธ๋ค์จ์ด
- require('serve-static')
- ํน์ ํด๋๋ฅผ ์คํํ๊ณ ์ถ์ ๊ฒฝ์ฐ
- ์น ๋ธ๋ผ์ฐ์ ๋ ํด๋ผ์ด์ธํธ๊ฐ ์น ์๋ฒ์ ํ์ผ๋ค์ ์๋ฌด๊ฑฐ๋ ๊ฐ์ ธ๊ฐ๋ฉด ์๋๊ธฐ ๋๋ฌธ์
ํน์ ํ ํด๋๋ง ์ด์ด์ฃผ๋ ์ญํ ์ ํ๋ค.- path.join()์ผ๋ก ๊ฒฝ๋ก ์ค์
- path๋ ์ธ์ฅ๋ชจ๋์ด๋ผ require ํด์ค์ผ ํจ.
- 1๋ฒ์งธ ์ธ์ ๐๐ป__dirname: ํ์ฌ ํ์ผ์ด ์คํ๋๋ ํด๋์ path๋ฅผ ์๋ฏธ.
- 2๋ฒ์งธ ์ธ์ ๐๐ป 'ํด๋ ์ด๋ฆ' : ๋ ธ์ถ์ ํ์ฉํ ํด๋๋ช
- ํ์ฌ ํด๋์ ์๋๊ฒฝ๋ก๋ฅผ ์ ํํ ํํํ๊ณ ์ถ๋ค๋ฉด use()์ 1๋ฒ์งธ ์ธ์๋ก ๊ฒฝ๋ก๋ฅผ ๋ฃ์ด์ค.
- app.use('ํด๋๊ฒฝ๋ก', static(path.join(__dirname, 'ํด๋์ด๋ฆ'')))
- body parser
- post ๋ฐฉ์ ์์ฒญ์ ๋ฐ์ ๋๋ bodyParser ์ธ์ฅ ๋ชจ๋์ ์ฌ์ฉํด์ผ ํจ. ์ค์น ํ์
- app.use(bodyParser.urlencoded({extended: false}))
- app.use(bodyParser.json());
- post ๋ฐฉ์์ header์ ๋ฐ๋ก ์ ๋ณด๋ฅผ ์ฃผ๋๊ฒ ์๋๋ผ ๋ฐ๋์์ ๋ฃ๊ธฐ ๋๋ฌธ์ bodyParser๊ฐ ํ์ํ ๊ฒ.
- req.body.name || req.query.name ๐๐ป post ๋ฐฉ์์ด ์๋๋ฉด get ๋ฐฉ์์ผ๋ก ๋ฐ์๋ผ
- postman
- post ๋ฐฉ์์ผ๋ก ์์ฒญํ ๋ ์ฌ์ฉํ๋ ํ ์คํธ ํด
๐พ Router
๊ฐ๊ฐ์ ์์ฒญ path ๋ณ๋ก ๋ค๋ฅธ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๊ฒ ํจ.
-
let router = express.Router()
-
app.use('/', router) ๋ฏธ๋ค์จ์ด๋ก ๋ฑ๋ก
-
์ ๋ ์ฝ๋ ์ฌ์ด์ router ์ฌ์ฉ
- router.route(์์ฒญ path).post(function (req, res) {})
๐๐ป ๋ฏธ๋ค์จ์ด์ฒ๋ผ ๋ชจ๋ ๊ฑธ ๋ฐ๋๊ฒ ์๋๋ผ ์์ฒญ path๋ก ๋ค์ด์จ req๋ง ๋ฐ์
- router.route(์์ฒญ path).post(function (req, res) {})
-
url parameter
- ์์ฒญ path์ parameter๋ฅผ ๋ฃ๋ ํ์
- let paramName = req.params.name; ๐๐ป req ์์ params๋ผ๋ ๊ฐ์ฒด ์์ ๋ค์ด๊ฐ
- ๋ฐฉ๋ฒ:
- ์์ฒญ์: action="/process/login/mike"
- ์๋ต์: router.route('/process/login/:name').post( (req, res)=> { ๐พ ์ค๋ฅ ํ ์คํธ ๋ณด์ฌ์ฃผ๊ธฐ
-
app.all('*', (req, res) => { res.status(404).send(ํ๋ฉด์ ํ์ํ ๋ด์ฉ) })
- all() : ๋ชจ๋ ์์ฒญ์ ๋ํด ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ค~
- status(404) : ๋ฌธ์๋ฅผ ์ฐพ์ ์ ์์
- status(200) : ์ ์
-
express-error-hander ๋ฏธ๋ค์จ์ด๋ก ์ค๋ฅ ํ์ด์ง ๋ณด๋ด๊ธฐ
-
let errHandler = require('express-error-hander');
-
let eH = errHandler({ static: { '404': './public/404.html' } });
-
app.use(errHadler.httpError(404));
-
app.use(eH);
๐พ ์ฟ ํค์ ์ธ์
โ๏ธ์ฟ ํค
- ํด๋ผ์ด์ธํธ ์น ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๋ ์ ๋ณด.
- ์ฌ์ฉ๋ฐฉ๋ฒ:
- cookie-parser ๋ฏธ๋ค์จ์ด ์ฌ์ฉ
- let cookieParser = require('cookie-parser');
- cookie-parser ์ค์ : app.use(cookieParser());
- res ๊ฐ์ฒด์ cookie() ๐๐ป ์น ๋ธ๋ผ์ฐ์ ์ ์ด ๋ด์ฉ์ ์ ์ฅํด์ค!
- ex) res.cookie(user, {๋ด์ฉ}) ๐๐ป ๊ฐ๋ฐ์๋๊ตฌ application Cookies ๋ถ๋ถ์ user ํค ๊ฐ์ผ๋ก ์ ์ฅ๋์ด ์์!
- req ๊ฐ์ฒด์ cookies๋ก ์ค์ ๋ ์ฟ ํค ์ ๋ณด ํ์ธ
- redirect() : ๋ค๋ฅธ path๋ก ์ฎ๊น
โ๏ธ์ธ์
-
์น ์๋ฒ์ ์ ์ฅ๋๋ ์ ๋ณด
-
๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๋ฑ์ ์ํด ์ฌ์ฉ.
-
์ธ์ ์ ์ฟ ํค๋ฅผ ๊ฐ์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ cookie-parser๊ฐ ํ์.
- Cookies๋ก ๋ค์ด๊ฐ๋ณด๋ฉด connect.sid๋ก ์ธ์ ์ด ๋ง๋ค์ด์ง.
-
let expressSession = require('express-session');
-
๋ก๊ทธ์ธํ๋ฉด ์ธ์ ์ด ๋ง๋ค์ด์ง๊ณ , ๋ก๊ทธ์์ํ๋ฉด ์ธ์ ์ด ์ญ์ ๋๋๋ก ๋ง๋ค์ด๋ณด์!
- ๊ฐ์: ์ธ์ ์ ๋ณด๊ฐ ์์ผ๋ฉด ์ํ ํ์ด์ง๋ก, ์์ผ๋ฉด ๋ก๊ทธ์ธ ์ ๋
- ๋ก๊ทธ์ธ ์ฑ๊ณตํ๋ฉด ์ํ ํ์ด์ง๋ก ๋ค์ ๋๊ฒจ์ค.
- ๋ก๊ทธ์์์ ํ๋ฉด ์ธ์
์ user ์ ๋ณด๋ฅผ ์์ ์ ๋ค์ ์ํํ์ด์ง๋ก ๋ค์ด๊ฐ๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ ๋
- req ๊ฐ์ฒด์ session์ผ๋ก ์ค์ ๋ ์ธ์ ์ ๋ณด ํ์ธ
- if (req.session.user) {redirect(path)} ๐๐ป ๋ค๋ฅธ ๊ณณ์ผ๋ก ์ ๋
- ๋ก๊ทธ์์์ req.session.destroy() ๋ก ์ธ์
์ ๋ณด ์ญ์
๐ฅ ์ฌ์ค ๋ก๊ทธ์ธ, ๋ก๊ทธ์์ ๊ฒ์ฆ์ passport๊ฐ ์์์ ํด์ค. (๋์ค์ ๋ฐฐ์)
๐พ ํ์ผ ์ ๋ก๋
-
ํ์ผ ์ ๋ก๋์ POST ๋ฐฉ์์ผ๋ก ์์ฒญํด์ผ ํจ
- body-parser ๋ฏธ๋ค์จ์ด ์ฌ์ฉ ํ์
- fs, cors ๋ชจ๋๋ ์ฌ์ฉ
-
ํ์ผ ์ ๋ก๋์ฉ ๋ฏธ๋ค์จ์ด
let multer = require('multer')
let fs = require('fs')
-
ํด๋ผ์ด์ธํธ์์ ajax๋ก ์์ฒญ ์ CORS(๋ค์ค ์๋ฒ ์ ์) ์ง์
let cors = require('cors')
- ์๋ฒ์ชฝ์์ ์ด๋ค ์ ๋ณด๋ฅผ option์ผ๋ก ์ฃผ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ๋ ๊ฒ ์ ์ํ ๊ฒ์ ํ์ฉ~.
- ex) ๋ค๋ฅธ ip๋ฅผ ๊ฐ์ง ๊ณณ์์ ์น ์๋ฒ์ ์ ์ํด ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ๊ฒ ๋ค ํ ๋ cors ์ฌ์ฉ.
-
ํ์ผ์ ์ ๋ก๋ ํ๋ฉด ์ด๋์ ์ ์ฅ๋๊ฒ ํ ๊ฒ์?
- diskStorage({}) ์์ง
- post๋ก ์ ์ก๋ ํ์ผ์ ์ ์ฅ๊ฒฝ๋ก์ ํ์ผ๋ช ๋ฑ์ ์ฒ๋ฆฌ.
- diskStorage({}) ์์ง
-
html ํ์ผ์ form ์์ฑ์ผ๋ก
enctype='multipart/form-data'
ํ์.- ํ์ผ์ ์ ๋ก๋ํ ๋ multipart ๋ฐ์ดํฐ ํ์์ผ๋ก ๋ณด๋ด๊ธฐ ๋๋ฌธ.
-
multer์ ์ํด ํ์ผ์ด ์ ๋ก๋๋๋ฉด req.files ๊ฐ์ฒด์์ ๋ค์ด๊ฐ.
๐พ ์น ์๋ฒ
- ์น ์๋ฒ๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์์ฒญ(req)์ ๋ฐ์ ์๋ต(res)์ ์ค.
- express๋ก ์ฒ๋ฆฌ.
๐พ ์๋ต ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
-
- ๋ฏธ๋ค์จ์ด ๐๐ป ๋ชจ๋ ์์ฒญ ์ฒ๋ฆฌ
-
- ๋ผ์ฐํฐ ๐๐ป ์์ฒญ path์ ๋ฐ๋ผ ๋ถ๊ธฐ
-
- ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ด์จ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ฒ๋ฆฌ
๐พ ์ฟ ํค, ์ธ์
- ๋ก๊ทธ์ธ ๋ฑ์ ์ ๋ณด๋ฅผ ์ ์ฅ. ์ํ ์ ์ง
๐พ ํ์ผ ์ ๋ก๋
๐พ AJAX
- ํ์ด์ง ์ด๋์์ด ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ ์๋ต์ ๋ฐ๋ ๊ธฐ์ .
- AJAX ์์ฒญ ๋ฐฉ๋ฒ: axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ์์
- axios.get, post => ๋ด๋ถ์ new Promise๊ฐ ๋ค์ด์์ด
then, catch, async, await ์ฌ์ฉ ๊ฐ๋ฅ. - axios.post๋ ๋๋ฒ์งธ ์ธ์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๋ณด๋!.
- axios.get, post => ๋ด๋ถ์ new Promise๊ฐ ๋ค์ด์์ด
๐พ FormData
const formData = new FormData()
- append ๋ฉ์๋๋ก ํค -๊ฐ ํ์์ ๋ฐ์ดํฐ ์ ์ฅ.
- has, get, getAll, delete, set
๐พ AJAX ์์ฒญ์ ์ฃผ์์ ํ๊ธ์ด ์๋ ๊ฒฝ์ฐ
encodeURIComponent
์ฌ์ฉ- ํ๊ธ ์ฃผ์ ๋ถ๋ถ๋ง ํด๋น ๋ฉ์๋๋ก ๊ฐ์ธ๊ธฐ
- ๋ฐ๋ ์ชฝ์์
decodeURIComponent()
๋ก ๋ณต๊ตฌ
๐พ data attribute & dataset
- ์๋ฒ์์ ๋ณด๋ด์ค ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
- html ํ๊ทธ ์์ฑ: data-
- dataset์ผ๋ก ํ์ธ
๐พ ๋ ธ๋์ ์ฝ์ ๊ธฐ๋ฅ REPL (Read, Eval, Print, Loop)
- ๋ ธ๋์ ์ฝ์์ ์ฝ๋๋ฅผ ์ฝ๊ณ , ํด์ํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ณ , ์ข ๋ฃํ ๋ ๊น์ง ๋ฐ๋ณตํ๋ค.
- ์ฝ์์์ REPL๋ก ๋ค์ด๊ฐ๋ ๋ช
๋ น์ด
node
๐พ ๋ชจ๋๋ก ๋ง๋ค๊ธฐ
-
๋ชจ๋: ํน์ ํ ๊ธฐ๋ฅ์ ํ๋ ํจ์, ๋ณ์๋ค์ ์งํฉ
- ๋ชจ๋๋ก ๋ง๋ค์ด๋๋ฉด ์ฌ๋ฌ ํ๋ก๊ทธ๋จ์ ํด๋น ๋ชจ๋์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ.
- ๋ฐฉ๋ฒ:
module.exports
์ ๋ด๊ธฐ- ๊ฐ์ฒด ๋ฟ๋ง ์๋๋ผ ํจ์, ๋ณ์๋ ๋์ ๊ฐ๋ฅ.
-
ES2015 ๋ชจ๋ ์คํ์ผ
- ๋ฐฉ๋ฒ:
import
,export default
- ํ์ผ ํ์ฅ์๋ฅผ js๋ก ํ๋ฉฐ ES2015 ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ๋ฒ :
- package.json์
type: 'module'
์์ฑ ๋ฃ๊ธฐ.
- package.json์
- ๋ฐฉ๋ฒ:
๐พ ๋ ธ๋ ๋ด์ฅ ๊ฐ์ฒด
-
global ๊ฐ์ฒด(์ ์ญ๊ฐ์ฒด) = ๋ธ๋ผ์ฐ์ ์ window ๊ฐ์ฒด
- ์๋ต ๊ฐ๋ฅ ex) global.require ๐๐ป require, global.console ๐๐ป console
- window๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ : DOM์ด๋ BOM์ด ์์ผ๋ฏ๋ก
- global ์์ฑ์ ๊ฐ์ ๋ฃ์ด ํ์ผ ๊ฐ ๊ณต์ ๊ฐ๋ฅ. (๊ถ์ฅํ์ง ์์)
-
global.console
console.time & console.timeEnd
- console.timeEnd(๋ ์ด๋ธ)๊ณผ ๋์๋์ด ๊ฐ์ ๋ ์ด๋ธ์ ๊ฐ์ง time๊ณผ timeEnd ์ฌ์ด์ ์คํ์๊ฐ ์ธก์
console.table(๋ฐฐ์ด)
- ๋ฐฐ์ด ์์๋ก ๊ฐ์ฒด ๋ฆฌํฐ๋ด์ ๋ฃ์ผ๋ฉด ๊ฐ์ฒด ์์ฑ๋ค์ด 'ํ ์ด๋ธ ํ์'์ผ๋ก ํํ๋จ.
console.dir(๊ฐ์ฒด, ์ต์ )
- ๊ฐ์ฒด๋ฅผ ์ฝ์์ ํ์ํ ๋ ์ฌ์ฉ.
- ์ต์ colors: true๋ก ํ๋ฉด ์ฝ์์ ์์ด ์ถ๊ฐ๋์ด ๋ณด๊ธฐ ํธํด์ง.
- ์ต์ depth: ๊ฐ์ฒด๋ฅผ ๋ช ๋จ๊ณ๊น์ง ๋ณด์ฌ์ค์ง ๊ฒฐ์ . ๊ธฐ๋ณธ๊ฐ > 2
console.trace(๋ ์ด๋ธ)
- ์๋ฌ ์์น ์ถ์ . ๋ณดํต ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ ์ ์ฌ์ฉํ์ง ์์.
- โญ๏ธ __filename, __dirname
- ํ์ฌ ํ์ผ์ ๊ฒฝ๋ก๋ ํ์ผ๋ช ์ ์๊ธฐ ์ํด ์ฌ์ฉ.
console.log(__filename)
- ์คํ์ ํ์ฌ ํ์ผ ๊ฒฝ๋ก์ ํ์ผ๋ช ๊น์ง ๋์ด.
console.log(__dirname)
- ์คํ์ ํ์ฌ ํ์ผ ๊ฒฝ๋ก๊น์ง ๋์ด.
- module, exports, require
- ๐ง exports
- ๋ชจ๋์ ๋ง๋ค ๋ module.exports ๋ง๊ณ ๋ ๊ทธ๋ฅ exports ๊ฐ์ฒด๋ก๋ ๋ง๋ค ์ ์์.
- module.exports์ exports๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํจ.
console.log(module.exports === exports)
- โ ๋จ ๊ฐ์ฒด๋ง ์ฌ์ฉํ ์ ์์.
- ๐ง require
- require === ํจ์, ํจ์ === ๊ฐ์ฒด, ๋ฐ๋ผ์ require === ๊ฐ์ฒด
require.cache
- ํ๋ฒ requireํ ํ์ผ์ require.cache์ ๋ค ์ ์ฅ๋จ.
require.main
- ๋ ธ๋ ์คํ ์ ์ฒซ ๋ชจ๋์ ๊ฐ๋ฆฌํด.
- ํ์ฌ ํ์ผ์ด ์ฒซ ๋ชจ๋์ธ์ง ์๋ ๋ฐฉ๋ฒ:
require.main === module
- ๐ง exports
- node์์์ this
- ์ต์์ ์ค์ฝํ์ ์กด์ฌํ๋
this === module.exports(exports ๊ฐ์ฒด)
- ํจ์ ์ ์ธ๋ถ ๋ด๋ถ์
this === global ๊ฐ์ฒด
- ์ต์์ ์ค์ฝํ์ ์กด์ฌํ๋
- process
- ํ์ฌ ์คํ๋๊ณ ์๋ ๋
ธ๋ ํ๋ก์ธ์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์.
- ๐ง process.env
- ์์คํ ํ๊ฒฝ๋ณ์
- ์๋น์ค์ ์ค์ํ ํค๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ผ๋ก๋ ์ฌ์ฉ๋จ. ex) ๋น๋ฐ๋ฒํธ ๋ฑ
process.env.SECRET_ID
process.env.SECRET_CODE
- ๐ง process.nextTick(์ฝ๋ฐฑ)
- microtask = process.nextTick , Promise
- ์ด๋ฒคํธ๋ฃจํ๊ฐ ๋ค๋ฅธ ์ฝ๋ฐฑํจ์๋ณด๋ค nextTick์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฐ์ ์ฒ๋ฆฌํ๋๋ก ํจ.
- promise ๋ํ ๋ค๋ฅธ ์ฝ๋ฐฑ๋ณด๋ค ์ฐ์ ์๋จ.
- ๐ง process.exit(์ฝ๋)
- ์คํ ์ค์ธ ๋ ธ๋ ํ๋ก์ธ์ค ์ข ๋ฃ. ์๋์ผ๋ก ๋ ธ๋๋ฅผ ๋ฉ์ถ๊ฒ ํ๊ธฐ ์ํด ์ฌ์ฉ.
- ํ์ฌ ์คํ๋๊ณ ์๋ ๋
ธ๋ ํ๋ก์ธ์ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์.
- os ๋ชจ๋
- ์ด์์ฒด์ ์ ๋ณด
- ์ฃผ๋ก ์ปดํจํฐ ๋ด๋ถ ์์์ ๋น๋ฒํ๊ฒ ์ ๊ทผํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ.
- ์ด์์ฒด์ ๋ณ๋ก ๋ค๋ฅธ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ณ ์ถ์ ๋.
- path ๋ชจ๋
- ํด๋, ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์กฐ์
- ์ด์์ฒด์ ๋ณ๋ก ๊ฒฝ๋ก ๊ตฌ๋ถ์๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ
- ํ์ผ ๊ฒฝ๋ก์์ ํ์ผ๋ช / ํ์ฅ์๋ง ๋ฐ๋ก ๋ผ์ด์ฃผ๋ ๊ธฐ๋ฅ๋ ์์.
- url ๋ชจ๋
- ์ธํฐ๋ท ์ฃผ์ ์ฝ๊ฒ ์กฐ์
url.parse(์ฃผ์)
: ์ฃผ์๋ถํดurl.format(๊ฐ์ฒด)
: ๋ถํด๋ ์ฃผ์ ์กฐ๋ฆฝsearchParams
- new URL๋ก myURL์ด๋ผ๋ ์ฃผ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๊ทธ ์์ searchParams ๊ฐ์ฒด๊ฐ ์์.
- search ๋ถ๋ถ์ ์กฐ์ํ๋ ๋ค์ํ ๋ฉ์๋ ์ง์.
- querystring ๋ชจ๋
- WHATWG ๋ฐฉ์์ url ๋์ ๊ธฐ์กด ๋ ธ๋์ url์ ์ฌ์ฉ์ search ๋ถ๋ถ ์กฐ์ ๋ชจ๋
querystring.parse(query)
: url์ query ๋ถ๋ถ์ JS ๊ฐ์ฒด๋ก ๋ถํดquerystring.stringify(๊ฐ์ฒด)
๋ถํด๋ query ๊ฐ์ฒด๋ฅผ ๋ฌธ์์ด๋ก ๋ค์ ์กฐ๋ฆฝ
-
crypto
- ์ํธํ ๊ด๋ จ ๋ชจ๋
- ๋ณตํธํ
- ์ํธํ๋ ๋ฌธ์์ด์ ์๋๋๋ก ๋๋๋ฆฌ๋ ๊ฒ.
- ๋จ๋ฐฉํฅ ์ํธํ
- ๋ณตํธํํ ์ ์๋ ์ํธํ ๋ฐฉ์
- ์ฃผ๋ก ๐ํด์ ๊ธฐ๋ฒ๐ ์ฌ์ฉ
- ๋ฌธ์์ด์ ๊ณ ์ ๋ ๊ธธ์ด์ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ๋ฐ๊พธ๋ ๋ฐฉ์.
createHash(์๊ณ ๋ฆฌ์ฆ)
: ์ฌ์ฉํ ํด์ ์๊ณ ๋ฆฌ์ฆ- sha 512 ์ฃผ๋ก ์ฌ์ฉ
update(๋ฌธ์์ด)
: ๋ณํํ ๋ฌธ์์ดdigest(์ธ์ฝ๋ฉ)
: ์ธ์ฝ๋ฉํ ์๊ณ ๋ฆฌ์ฆ.- ๋ณํ๋ ๋ฌธ์์ด ๋ฐํ.(base64, hex)
- base64 : ๊ฒฐ๊ณผ ๋ฌธ์์ด์ด ๊ฐ์ฅ ์งง์.
- ์ถฉ๋
- ๋ค๋ฅด๊ฒ ์ ๋ ฅ๋ ๋ฌธ์์ด์ด ๊ฐ์ ๋ฌธ์์ด๋ก ๋ฐํ๋๋ ํ์.
- ํดํน์ฉ ์ปดํจํฐ๊ฐ ์ด๋ฅผ ์์๋ด ํดํน.
- ๐
pbkdf2 ์๊ณ ๋ฆฌ์ฆ
๐- ๊ธฐ์กด ๋ฌธ์์ด + salt ๋ฌธ์์ด * ๋ฐ๋ณต(๋๋ต 10๋ง ๋ฒ)
randomBytes()
: 64๋ฐ์ดํธ ๊ธธ์ด์ ๋ฌธ์์ด ์์ฑ. = salt- randomBytes์ด๋ฏ๋ก ์คํ์๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง.
pbkdf2(๋น๋ฐ๋ฒํธ, salt, ๋ฐ๋ณตํ์, ์ถ๋ ฅ๋ฐ์ดํธ, ํด์์๊ณ ๋ฆฌ์ฆ)
- ์๋ฐฉํฅ ์ํธํ
- ๋ณตํธํ ๊ฐ๋ฅ, key ํ์
createCipheriv(์๊ณ ๋ฆฌ์ฆ, ํค, iv)
cipher.update(๋ฌธ์์ด, ์ธ์ฝ๋ฉ, ์ถ๋ ฅ ์ธ์ฝ๋ฉ)
- ๋ณดํต ๋ฌธ์์ด์ utf8 ์ธ์ฝ๋ฉ
- ์ถ๋ ฅ ์ธ์ฝ๋ฉ์ base64 ๋ง์ด ์ฌ์ฉ
cipher.final(์ถ๋ ฅ ์ธ์ฝ๋ฉ)
: ์ํธํ ์๋ฃ- ๋ณตํธํ๋ ์ ๊ณผ์ ์ de๋ง ๋ฃ์ผ๋ฉด ๋จ.
-
util module
- ๊ฐ์ข ํธ์ ๊ธฐ๋ฅ์ ๋ชจ์๋ ๋ชจ๋
util.deprecate
: ํจ์๊ฐ deprecated ๋์์ ์๋ ค์ค.- ์ฒซ๋ฒ์งธ ์ธ์๋ก ํจ์๋ฅผ, ๋๋ฒ์งธ ์ธ์๋ก ๊ฒฝ๊ณ ๋ฉ์ธ์ง ๋ฃ๊ธฐ.
util.promisify
์ฝ๋ฐฑ ํจํด์ ํ๋ก๋ฏธ์ค ํจํด์ผ๋ก ๋ณ๊ฒฝ
-
worker_threads
- ๋ ธ๋์์ ๋ฉํฐ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ์์
-
child_porcess
- ๋ ธ๋์์ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์คํํ๊ฑฐ๋ผ ๋ช ๋ น์ ์ํํ๊ณ ์ ํ ๋ ์ฌ์ฉ.
require('child_process').exec
const process = exec(๋ช ๋ น์ด)
stdout
ํ์ค์ถ๋ ฅ(์ฑ๊ณต)stderr
ํ์ค์๋ฌ(์๋ฌ)
- ๐พ fs ๋ชจ๋
- ํ์ผ ์์คํ ์ ์ ๊ทผํ๋ ๋ชจ๋ (ํ์ผ(ํด๋) ์์ฑ, ์ญ์ , ์ฝ๊ธฐ, ์ฐ๊ธฐ)
- ์ฝ๊ธฐ:
fs.readFile(๊ฒฝ๋ก, ์ฝ๋ฐฑํจ์)
- readFile์ ๊ฒฐ๊ณผ๋ฌผ์ Buffer ํ์์ผ๋ก ์ ๊ณต๋๋ฏ๋ก toString์ผ๋ก ๋ณํ.
- ๋ณดํต์ ํ๋ก๋ฏธ์ค ํ์์ผ๋ก ๋ฐ๊ฟ.
const fs = require('fs').promises
- Sync ๋ฉ์๋
- ๋๊ธฐ๋ฐฉ์. ์ด์ ์์ ์๋ฃ ํ ๋ค์ ์์ ์งํ
- ex)
fs.readFileSync
- ํ์ผ์ ์ฝ๊ฑฐ๋ ์ฐ๋ ๋๊ฐ์ง ๋ฐฉ์
- ๐ Buffer: ๋
ธ๋๊ฐ ํ์ผ์ ์ฝ์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ ํฌ๊ธฐ๋งํผ์ ๊ณต๊ฐ์ ๋ง๋ จํ๊ณ , ํ์ผ๋ฐ์ดํฐ(buffer)๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์กฐ์๊ฐ๋ฅํ๊ฒ ํจ.
Buffer.from(๋ฌธ์์ด)
: ๋ฌธ์์ด์ ๋ฒํผ๋ก ๋ณํBuffer.alloc(๋ฐ์ดํธ)
: ๋น๋ฒํผ ์์ฑ- ๋ฒํผ์ ๋จ์ !!
- (๋ฉ๋ชจ๋ฆฌ๋ฌธ์ ) ํ์ผ์ด ์ฌ๋ฌ๊ฐ์ผ ์๋ก ๋ฉ๋ชจ๋ฆฌ์ ๊ทธ๋งํผ์ ๋ฒํผ๋ฅผ ๋ง๋ค์ด์ผ ํจ.
- ๐ Stream
- ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ํด ์ฌ๋ฌ๋ฒ ๋๋ ๋ณด๋ด๋ ๋ฐฉ์
- ํ์ผ ์ฝ๊ธฐ:
createReadStream
- ํ์ผ ์ฐ๊ธฐ:
createWriteStream
- ๋๋ ์ง ์กฐ๊ฐ: chunk
- ์คํธ๋ฆผ๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฒ: ํ์ดํํ๋ค
- ๋์์ ๊ฐ์ ํฐ ํ์ผ ์ ์ก์ ์คํธ๋ฆผ์ ์ฌ์ฉํจ.
- ํ์ผ ์ฝ๊ธฐ:
- ๋ฒํผ์ ํฌ๊ธฐ๋ฅผ ์๊ฒ ํด ์ฌ๋ฌ๋ฒ ๋๋ ๋ณด๋ด๋ ๋ฐฉ์
- ๐ Buffer: ๋
ธ๋๊ฐ ํ์ผ์ ์ฝ์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ์ผ ํฌ๊ธฐ๋งํผ์ ๊ณต๊ฐ์ ๋ง๋ จํ๊ณ , ํ์ผ๋ฐ์ดํฐ(buffer)๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ์กฐ์๊ฐ๋ฅํ๊ฒ ํจ.
-
๐พ fs ๋ชจ๋ - ์์ฑ
fs.access(๊ฒฝ๋ก, ์ต์ , ์ฝ๋ฐฑ)
- ํด๋ / ํ์ผ์ ์ ๊ทผ ๊ฐ๋ฅํ ์ง ์ฒดํฌ.
- ์ต์
F_OK
: ํ์ผ ์กด์ฌ ์ฌ๋ถR_OK
: ์ฝ๊ธฐ ๊ถํ ์ฌ๋ถW_OK
: ์ฐ๊ธฐ ๊ถํ ์ฌ๋ถ- ํ์ผ / ํด๋ ๊ถํ์ด ์ ๋ค๋ฉด ์๋ฌ ๋ฐ์ : 'ENOENT'
fs.mkdir(๊ฒฝ๋ก, ์ฝ๋ฐฑ)
- ํด๋ ๋ง๋๋ ๋ฉ์๋.
- ์ด๋ฏธ ํด๋๊ฐ ์๋ค๋ฉด ์๋ฌ ๋ฐ์ํ๋ฏ๋ก access ๋ฉ์๋๋ก ์ฐ์ ํ์ธ.
fs.open(๊ฒฝ๋ก, ์ต์ , ์ฝ๋ฐฑ)
- ํ์ผ์ ์์ด๋(fd ๋ณ์)๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋.
- ํ์ผ์ด ์๋ค๋ฉด ๊ฒฝ๋ก์ ํ์ผ ์์ฑ ํ ๊ทธ ์์ด๋๋ฅผ ๊ฐ์ ธ์ด.
- ๊ฐ์ ธ์จ ์์ด๋๋ก
fs.read
,fs.write
๋ก ์ฝ๊ฑฐ๋ ์ธ ์ ์์. - ๋๋ฒ์งธ ์ธ์๋ก w(์ฐ๊ธฐ), r(์ฝ๊ธฐ), a(์ถ๊ฐ) ์ค์ .
fs.rename(๊ฒฝ๋ก, ์ต์ , ์ฝ๋ฐฑ)
- ํ์ผ ์ด๋ฆ ๋ฐ๊พธ๋ ๋ฉ์๋.
-
๐พ fs ๋ชจ๋ - ์ญ์
-
fs.readdir(๊ฒฝ๋ก, ์ฝ๋ฐฑ)
- ํด๋ ์์ ๋ด์ฉ๋ฌผ ํ์ธ.
-
fs.unlink(๊ฒฝ๋ก, ์ฝ๋ฐฑ)
- ํ์ผ ์ญ์ .
- ํ์ผ์ด ์๋ค๋ฉด ์๋ฌ ๋ฐ์
-
fs.rmdir(๊ฒฝ๋ก, ์ฝ๋ฐฑ)
- ํด๋ ์ญ์ .
- ํด๋ ์์ ํ์ผ์ด ์๋ค๋ฉด ์๋ฌ ๋ฐ์ํ๋ฏ๋ก, ๋จผ์ ๋ด๋ถ ํ์ผ์ ๋ชจ๋ ์ง์์ผ ํจ.
-
-
๐พ fs ๋ชจ๋ - ๋ณต์ฌ
fs.copyFile(๋ณต์ฌํ ํ์ผ, ๋ณต์ฌ๋ ๊ฒฝ๋ก, ์ฝ๋ฐฑ)
-
๐พ fs ๋ชจ๋ - ๋ณ๊ฒฝ ์ฌํญ ๊ฐ์
-
๐พ ์ค๋ ๋ํ
- ๋ฏธ๋ฆฌ ์์ฑํด ๋์ ์ค๋ ๋๋ฅผ ๋ชจ์๋ ๋ฌถ์.
- ์์ ์ ๋์์ ์ฒ๋ฆฌ.
- ์ค๋ ๋ํ ๊ฐ์ ์ ํ: ํฐ๋ฏธ๋์
UV_THREADPOOL_SIZE = ์ซ์
์ ๋ ฅ.
-
๐พ event
on(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ)
- ์ด๋ฒคํธ๋ช ๊ณผ ๋ฐ์ ์ ์ฝ๋ฐฑ ์ฐ๊ฒฐ. (์ด๋ฒคํธ ๋ฆฌ์ค๋)
addListener(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ)
- on๊ณผ ๋์ผ
emit(์ด๋ฒคํธ๋ช )
- ์ด๋ฒคํธ ํธ์ถ
once(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ)
- ํ ๋ฒ๋ง ์คํ๋๋ ์ด๋ฒคํธ.
removeAllListeners(์ด๋ฒคํธ๋ช )
- ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ์ ๊ฑฐ
removeListener(์ด๋ฒคํธ๋ช , ๋ฆฌ์ค๋)
- ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ๋ฆฌ์ค๋๋ฅผ ํ๋์ฉ ์ ๊ฑฐ
off(์ด๋ฒคํธ๋ช , ์ฝ๋ฐฑ)
removeListener
์ ๋์ผ
listenerCount(์ด๋ฒคํธ๋ช )
- ํ์ฌ ๋ฆฌ์ค๋๊ฐ ๋ช ๊ฐ ์ฐ๊ฒฐ๋๋์ง ํ์ธ.
+
-
๋ ธ๋์ ๋ฉ์ธ ์ค๋ ๋๋ ํ ๊ฐ์ด๋ฏ๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ํด์ผ ํ๋ค.
- ์์ธ: ์ฒ๋ฆฌํ์ง ๋ชปํ ์๋ฌ
- ์์ธ ์ฒ๋ฆฌ: ์๋ฌ ๋ก๊ทธ๊ฐ ๊ธฐ๋ก๋๋๋ผ๋ ์์ ์ด ๋ฉ์ถ์ง ์๊ณ ์งํ๋๋๋ก ์ฒ๋ฆฌ.
-
๐พ
try / catch
์ฌ์ฉ- ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ ๊ฐ์ ๋ถ๋ถ์ ์ฌ์ฉํ๋ฉด ์์ ์ด ๋ฉ์ถ์ง ์์.
- throw๋ฅผ ํ๋ ๊ฒฝ์ฐ, ๋ฐ๋์ try/ catch๋ฌธ์ ์ฌ์ฉํด์ผ ํจ.
- ์๊ทธ๋ผ ๋ ธ๋ ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถค.
-
๐พ ๋ ธ๋ ๋ด์ฅ ๋ชจ๋์ ์๋ฌ
- ๋ ธ๋ ๋ด์ฅ ๋ชจ๋์ ์๋ฌ๋ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋ฉ์ถ์ง ์์.
- ์๋ฌ ๋ก๊ทธ๋ฅผ ๊ธฐ๋กํด๋๊ณ ๋์ค์ ์์ธ ์ฐพ๊ธฐ.
-
๐พ Promise์ ์๋ฌ
- ํ๋ก๋ฏธ์ค์ ์๋ฌ๋ catchํ์ง ์์๋ ์์์ ์ฒ๋ฆฌ๋๋, ๋
ธ๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ด
catch
๋ฅผ ๋ถ์ด๋ ๊ฑธ ๊ถ์ฅ.
- ํ๋ก๋ฏธ์ค์ ์๋ฌ๋ catchํ์ง ์์๋ ์์์ ์ฒ๋ฆฌ๋๋, ๋
ธ๋ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ด
-
๐พ
on('uncaughtException', ์ฝ๋ฐฑ)
- uncaughtException ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋๋ถ์ ์๋ฌ๊ฐ ๋ฐ์ํด๋ ๋ฉ์ถ์ง ์์.
- try / catch๋ก ์ฒ๋ฆฌํ์ง ์์์ง๋ง ๋ฉ์ถ์ง ์์.
- โ ์ด ์ด๋ฒคํธ๋ ์ตํ์ ์๋จ์ผ๋ก ์ฌ์ฉํ๊ธฐ.
- ๋ ธ๋๊ฐ ์ด ์ด๋ฒคํธ ๋ฐ์ ํ ๋ค์ ๋์์ด ์ ๋๋ก ๋์ํ๋์ง ๋ณด์ฆํ๊ธฐ ์์!!
- ๋จ์ ์๋ฌ ๊ธฐ๋ก ์ฉ๋๋ก ์ฌ์ฉ.
- ์๋ฌ ๊ธฐ๋ก ํ
process.exit()
๋ก ํ๋ก์ธ์ค ์ข ๋ฃํ๊ธฐ.
-
ํด๋ผ์ด์ธํธ: ์์ฒญ(request)์ ๋ณด๋
-
์๋ฒ: ์์ฒญ์ ์ฝ๊ณ ์ฒ๋ฆฌ ํ, ์๋ต(response).
- ๋ฐ๋ผ์ ์๋ฒ๋ ์์ฒญ์ ๋ฐ๋ ๋ถ๋ถ, ์๋ต์ ๋ฐ๋ ๋ถ๋ถ๋ ์์ด์ผ ํจ.
- ๊ทธ๊ฑธ ์ด๋ฒคํธ๋ฆฌ์ค๋๋ก ๋ฑ๋กํจ!!
- ์ดํด๋๋น!!!!
-
๐พ http ๋ชจ๋
createServer((req, res) => )
- ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์ฝ๋ฐฑํจ์๊ฐ ์คํ๋๋ฏ๋ก, ์๋ต์ ์ ์ผ๋ฉด ๋จ.
- res ๊ฐ์ฒด
res.writeHead(์ํ์ฝ๋, ์๋ต ์ ๋ณด)
: ์๋ต์ ๋ํ ํค๋ ์ ๋ณด ๊ธฐ๋กres.write
: ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ผ ๋ฐ๋ ๋ฐ์ดํฐres.end
: ์๋ต ์ข ๋ฃ- ์ธ์๊ฐ ์๋ค๋ฉด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ์ข ๋ฃ.
.listen(ํฌํธ๋ฒํธ, ์ฝ๋ฐฑ)
- ํฌํธ์์ ์์ฒญ์ด ์ค๊ธฐ๋ฅผ ๋๊ธฐํจ
- 'listening' ์ด๋ฒคํธ ๋ฆฌ์ค๋ ํํ๋ ๊ฐ๋ฅ.
-
localhost & port
- localhost(127.0.01): ํ์ฌ ์ปดํจํฐ์ ๋ด๋ถ ์ฃผ์
- ๋ฐฐํฌ ์์๋ 80(HTTP), 443(HTTPS) ํฌํธ๋ฅผ ์ฌ์ฉํ๊ธฐ.
- ๋ฆฌ๋
์ค, ๋งฅ์์ 1024๋ฒ ์ดํ ํฌํธ ์ฐ๊ฒฐ ์ ๊ด๋ฆฌ์ ๊ถํ ํ์.
- ex) sudo node server1...
-
ํฌํธ ์ถฉ๋
- Error: listen EADDRINUSE ::: ํฌํธ๋ฒํธ
-
http ์ํ์ฝ๋
- 2**: ์ฑ๊ณต
- 200: ์ฑ๊ณต, 201: ์์ฑ๋จ
- 3**: ๋ฆฌ๋ค์ด๋ ์
(๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋)
- 301: ์๊ตฌ์ด๋, 302: ์์์ด๋, 304: ์์ ๋์ง ์์ (์บ์ ์ฌ์ฉ)
- 4**: ์์ฒญ ์ค๋ฅ
- 400: ์๋ชป๋ ์์ฒญ, 401: ๊ถํ ์์, 403: ๊ธ์ง๋จ, 404: ์ฐพ์ ์ ์์
- 5**: ์๋ฒ ์ค๋ฅ
- 500: ๋ด๋ถ ์๋ฒ ์ค๋ฅ, 502: ๋ถ๋ ๊ฒ์ดํธ์จ์ด, 503: ์๋น์ค๋ฅผ ์ด์ฉํ ์ ์์.
- 2**: ์ฑ๊ณต
-
๐พ REST (REpresentational State Transfer)
- ์ฃผ์๋ฅผ ์ ํ๋ ๊ท์น
- ์์: ์๋ฒ๊ฐ ํํ ์ ์๋ ๋ชจ๋ ๊ฒ.
- HTTP ์์ฒญ ๋ฉ์๋(GET, POST, PUT, PATCH, DELETE, OPTIONS)
- GET: ์๋ฒ ์์์ ๊ฐ์ ธ์ฌ ๋
- POST: ์๋ฒ์ ์์์ ์๋ก ๋ฑ๋กํ ๋ / ์ ๋งคํ ๋
- PUT: ์๋ฒ ์์์ ์์ ์นํํ ๋
- PATCH: ์๋ฒ ์์์ ์ผ๋ถ ์์ ํ ๋
- DELETE: ์๋ฒ ์์์ ์ญ์ ํ ๋
- RESTfulํ ์น ์๋ฒ
- REST ๋ฐฉ์๋๋ก ์๋ฒ ์ฃผ์๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฆฌํ์์ ์๋ฏธ.
-
HTTP ํ๋กํ ์ฝ
- ์ธ์ด์ ์๊ด์์ด ๋ชจ๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ์ฝ์