[๐ฑ๋ชฉ์ฐจ๐ฑ]
- Node.js ๋?
- Node.js ํน์ง
- JavaScript ์ธ์ด ์ฌ์ฉ
- Single Thread
- Non-Blocking I/O
- ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ ์ณ
- Node.js ์ญํ
- ๋ชจ๋
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋์ ๋ค๋ฃจ๋ ๋ฐฉ์
- NPM
- http ๋ชจ๋
- Express
[ : Node.js๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ ๋ง๋ค๊ธฐ ]
01. Node.js๋?
์๋ฒ ์ธก ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์คํ ์์ง์ผ๋ก ๊ตฌ๊ธ ํฌ๋กฌ์์ ์ฌ์ฉํ๋ V8 ์์ง์ ํ์ฌํ์ฌ ์คํ ์๋๊ฐ ๋น ๋ฅด๊ณ , ์ด๋ฒคํธ ๊ธฐ๋ฐ, ๋น๋๊ธฐ I/O๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ๊ณ ํจ์จ์ ์
๋๋ค. ์ฆ, Node.js๋ Chrome V8 JavaScript ์์ง์ผ๋ก ๋น๋ ๋ JavaScript ๋ฐํ์์ผ๋ก ๋
ธ๋๋ฅผ ํตํด ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ ์ ์๊ณ , ์๋ฒ๋ฅผ ์คํํ๋๋ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฐํ์์ด๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ๊ตฌ๋๋๋ ํ๊ฒฝ์
๋๋ค. ๋ฐํ์์ ์๋ก ํ์ด์ฌ, ์๋ฐ, node.js๋ฑ์ด ์์ต๋๋ค. Node.js๋ ์ฆ, JavaScript ๋ฐํ์์ด๊ณ JavaScript๋ก ๋ง๋ ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์๋ ํ๋ก๊ทธ๋จ์ด๋ผ ํ ์ ์์ต๋๋ค. JavaScript๋ ์คํฌ๋ฆฝํธ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์, ํน์ ํ๋ก๊ทธ๋จ ์์์๋ง ๋์ํฉ๋๋ค. ๊ณผ๊ฑฐ, JavaScript์ ๋ฐํ์ ํ๊ฒฝ์ ์น ๋ธ๋ผ์ฐ์ ๋ง ์กด์ฌํ์์ต๋๋ค. ์ฆ, ํ์ฌ๋ JavaScript๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์์ ๋
๋ฆฝ์์ผ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์น ๋ธ๋ผ์ฐ์ ์์ด ์คํํ ์ ์์ต๋๋ค.
NPMํจํค์ง ๋งค๋์ ๋ ์ธ๊ณ์์ ๊ฐ์ฅ ํฐ ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ //JavaScript๋ก ๊ฐ๋ฐ๋ ๊ฐ์ข
๋ชจ๋์ ์ค์น, ์
๋ฐ์ดํธ, ๊ตฌ์ฑ, ์ ๊ฑฐ ๊ณผ์ ์ ์๋ํํ์ฌ ๊ด๋ฆฌํ๋ ํจํค์ง
REPL์ด๋ Read-Eval-Print-Loop์ ์ค์๋ง๋ก ์
ธ์ด ๋์ํ๋ ๋ฐฉ์์
๋๋ค. ์๋์ฐ์์์ cmd,๋งฅ์์์ terminal์ฒ๋ผ ๋
ธ๋์๋ REPL์ฝ์์ด ์์ต๋๋ค.
02. Node.js ํน์ง
- ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด ์ฌ์ฉ
- Single Thread
- Non-blocking I/O
- ๋น๋๊ธฐ์ Event-Driven
02-1 ์๋ฐ์คํฌ๋ฆฝํธ ์ธ์ด ์ฌ์ฉ
Node.js๋ JavaScript๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง๋ค์ก๊ณ JavaScript์ธ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. JavaScript๋ ๋
๋ฆฝ์ ์ธ ์ธ์ด๊ฐ ์๋ ์คํฌ๋ฆฝํธ ์ธ์ด๋ก ์๋ ์น ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ง ๋์์ด ๊ฐ๋ฅํ์์ต๋๋ค. ํ์ง๋ง Node.js์ ๋ฑ์ฅ์ผ๋ก ์น๋ธ๋ผ์ฐ์ ์์ด ํฐ๋ฏธ๋์์๋ ๋ฐ๋ก ์คํ์ด ๊ฐ๋ฅํฉ๋๋ค. JavaScript์ธ์ด ํ๊ฐ์ง๋ก 'ํ๋ก ํธ์๋' ์ '๋ฐฑ์๋(์๋ฒ)'๋ฅผ ๋ชจ๋ ๋ง๋ค ์ ์๊ฒ ๋์์ต๋๋ค.
02-2 Single Thread
Single Thread ์ค๋ช
์ ์์, ์ด์์ฒด์ ์์ ํ ๋นํ๋ ์์
์ ๋จ์๋ก 'ํ๋ก์ธ์ค'๋ผ๋ ๋จ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ๋ก์ธ์ค๋ ํ์ฌ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ๋งํฉ๋๋ค. Thread(์ฐ๋ ๋)๋ ์ด ํ๋ก์ธ์ค ๋ด์์ ์คํ๋๋ ํ๋ฆ์ ๋จ์๋ก ํ๋์ ํ๋ก์ธ์ค์๋ n๊ฐ์ ์ฐ๋ ๋๊ฐ ์กด์ฌํ๋ฉฐ, ๋์์ ์๋ํ ์ ์์ต๋๋ค.
Node.js๋ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ดํ ์ ์๋ ์ฐ๋ ๋๊ฐ ํ๋์
๋๋ค. ์ด๋ ์ฆ, Call Stack์ด ํ๋์์ ์๋ฏธํฉ๋๋ค. ์ด ๋ป์ ํ๋ฒ์ ํ๋์ ์์
๋ง ๊ฐ๋ฅํ๋ค๋ ๋ป์
๋๋ค. ํ์ง๋ง Non-blocking I/O๊ธฐ๋ฅ์ผ๋ก ์ผ๋ถ ์ฝ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋ (๋ค๋ฅธ ํ๋ก์ธ์ค)์์ ์คํ ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฑ๊ธ์ฐ๋ ๋์ด๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ Error๊ฐ ๋ฐ์ํ๋ฉด ๋ฉ์ถ๊ฒ ๋์ด ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ์์ธ์ฒ๋ฆฌ์ ์ค์์ฑ์ด ๋์์ง๋๋ค. ํ๋ก๊ทธ๋๋ฐ ๋์ด๋๊ฐ ์ฌ์ฐ๋ฉฐ,์ฑ๊ธ์ฐ๋ ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ CPU,๋ฉ๋ชจ๋ฆฌ ์์์ ์ ๊ฒ ์ฌ์ฉํฉ๋๋ค.
์ฝ ์คํ(Call Stack)์ด๋, ํ์ฌ ์ด๋ค ํจ์๊ฐ ๋์ํ๊ณ ์๋์ง, ๊ทธ ํจ์ ์์์ ์ด๋ค ํจ์๊ฐ ๋์ํ๊ณ ์์ผ๋ฉฐ ๋ค์์๋ ์ด๋ค ํจ์๊ฐ ํธ์ถ๋์ด์ผ ํ๋ ์ง ๋ฑ์ ์ ์ดํ๋ ๋์์ ๋งํฉ๋๋ค. ์ฑ๊ธ์ฐ๋ ๋๋ ์ฝ์คํ์ด ํ๋๋ง์๋ค๋ ๋ป์ผ๋ก ํ๋ฒ์ ํ๋์ ์์
๋ง ๊ฐ๋ฅํ๋ค๋ ๋ป์
๋๋ค.
์ฆ,
Single Thread == Call Stack์ด ํ๋ == ํ๋ฒ์ ํ๋์ ์์ ๋ง ๊ฐ๋ฅ
์ด๋ผ ํ ์ ์์ต๋๋ค. ์ฝ๋๋ก call stack์ ๋์์ ์ดํดํด๋ณด๊ฒ ์ต๋๋ค.
functuin first(){
second();
console.log(1);
return;
}
functuin second(){
console.log(2);
return;
}
first();
์ ์ฝ๋๋ ํจ์ ๋๊ฐ๊ฐ ์ ์๋์ด์์ต๋๋ค. ์ด ๋ firstํจ์๋ฅผ ์คํํ๋ค๋ฉด, firstํจ์์ ๋ค์ด๊ฐ secondํจ์๋ฅผ ๋ง๋๊ฒ ๋๊ณ ๊ทธ๋ฌ๋ฉด ๋๋ค์ secondํจ์๋ก ๋ค์ด๊ฐ 2๋ฅผ ์ถ๋ ฅํ firstํจ์์ ์ ์๋์ด ์๋ 1์ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ์ด ์ข
๋ฃ๋ฅผ returnํ๊ฒ ๋์ด ์ถ๋ ฅ์ 1๋ณด๋ค 2๊ฐ ๋จผ์ ์ถ๋ ฅ๋๊ฒ ๋ฉ๋๋ค.
call stack์ ์คํ์ด๋ผ ํ์
์ ์ถ์ธ LIFO๊ตฌ์กฐ๋ก ๋์ด์๋ ์๋ฃ๊ตฌ์กฐ ์
๋๋ค. ๋ค์ ์ค๋ช
ํ์๋ฉด first()ํจ์๊ฐ ์คํ๋์ด ์คํ์๋ first()ํจ์๊ฐ ๋ด๊ธฐ๊ฒ ๋๊ณ , first()ํจ์ ์์์๋ second()ํจ์๊ฐ ์คํ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ second()ํจ์๊ฐ ์คํ์ push๋๊ฒ ๋ฉ๋๋ค. second()ํจ์๊ฐ ์คํ๋๋ค๋ฉด ์ฝ์๋ก๊ทธ์ 2์ ์ถ๋ ฅํด์ผํ๊ธฐ ๋๋ฌธ์ ์คํ์ console.log(2)๊ฐ push ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ์ ๋ง์ง๋ง์ผ๋ก ๋ค์ด์จ ๊ฒ์ด ๋จผ์ ๋๊ฐ๊ธฐ ๋๋ฌธ์ 2๋ฅผ ์ถ๋ ฅํ๋ฉฐ ์คํ์์ ๋๊ฐ๊ฒ ๋ฉ๋๋ค. second()ํจ์๋ 2๋ฅผ ์ถ๋ ฅํ๊ณ ์ข
๋ฃ๋ก return๋๊ธฐ ๋๋ฌธ์ second()ํจ์๊ฐ ์คํ์์ pop๋๊ณ ๊ทธ ๋ค์ console.log(1)์ ์ถ๋ ฅํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ค์ ์คํ์ console.log(1)์ด push๋๊ณ pop๋๋ฉด์ 1์ด ์ถ๋ ฅ๋ฉ๋๋ค. ๋ง์ง๋ง์ ๋จ์ first()ํจ์ ๋ด์์ ์ข
๋ฃ๋ฅผ ๋ฆฌํดํ๋ฉฐ ์คํ์์ pop์ด ๋ฉ๋๋ค.
Node.js๋ ์ฑ๊ธ ์ค๋ ๋๊ฐ ํผ์์ ์ผ์ ์ฒ๋ฆฌํ์ง๋ง, ์์ฒญ ์์๊ฐ ์๋ ๋น๋๊ธฐ ๋ฐฉ์(Non-Blocking)์ผ๋ก ์ด์ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ์ง ์๊ณ ๋ค์ ์์
์ ์ํํฉ๋๋ค.
02-3 Non-Blocking I/O
๋
ผ๋ธ๋กํน์ ์ค๋ช
ํ๊ธฐ ์์ ๋ธ๋กํน(Blocking)์ด๋ ํด๋น ์์
์ด ๋๋์ผ๋ง ๋ค์ ์์
์ ์ํํ๋ ํน์ง์
๋๋ค. ์๋ฅผ ๋ค์ด ์์ด์ค ์๋ฉ๋ฆฌ์นด๋
ธ๋ฅผ ๋ง๋ ๋ค๋ฉด 1. ๋ฌผ์ ์ผ์์ ๋ฃ๋๋ค. 2. ์ท์ ๋ด๋ฆฐ๋ค. 3. ์ผ์๋ฌผ์ ์ท์ ๋ถ๋๋ค. ์ด๋ฌํ ์์๋ฅผ ์ฐจ๋ก๋ก 1์ ์์
์ ์๋ฃํ ๋ค์ 2๋ฅผ ์์
ํ๊ณ ์ด๋ฐ ์์ผ๋ก ์ํ๋ฉ๋๋ค.
๋
ผ ๋ธ๋กํน์ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ์ง ์๊ณ ๋ค์์์
์ ์ํํ๊ฒ ๋ฉ๋๋ค. ์ฆ, ๋นจ๋ฆฌ ์๋ฃ๋ ์์๋ก ์ฒ๋ฆฌํ๋ฉฐ, ๋ธ๋กํน ๋ฐฉ์๋ณด๋ค ๊ฐ์ ์์
์ ๋ ์งง์ ์๊ฐ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฉ๋ฆฌ์นด๋
ธ ๋ง๋ค๊ธฐ ๋น์ ํ๋ค๋ฉด, ์ผ์์ ๋๊ณ ๋ฌผ์ ๋ฐ์๋์ผ๋ฉด์ ์ท์ ๋ด๋ฆฌ๊ณ ํ๋ฉด์ ์ ๋๋ฆฌ..?์๊ฒ ์์
ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ์ข๋ ๊ฐ๋ฐ์์ค๋ฝ๊ฒ ์ค๋ช
ํ์๋ฉด, ํจ์ ํธ์ถ์ ๋ฐ๋ก ์คํํ๋๊ฒ์ด ์๋๋ผ ์ด๋ ๊ณณ์ ์์ ๋๊ณ ๋์์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ ์์ฒญ์ด ์๋ฃ๋ ์์๋๋ก ์ฒ๋ฆฌํ๋ค๋ ๋ป์
๋๋ค.
์ด๊ฑด ์ฌ๋ด์ธ๋ฐ ๋
ผ๋ธ๋กํน๊ณผ ๋ฉํฐ์ฐ๋ ๋๊ฐ ํท๊ฐ๋ ธ์ต๋๋ค. ์ ๋โฆ ์ฑ๊ธ์ค๋ ๋ ๋ฐฉ์์ด๋ฉด์ ๋
ผ๋ธ๋กํน ํ๋ค๋๊ฒ ์ดํด๊ฐ ์๊ฐ๊ฑฐ๋ ์. ์๋ ์ฒ์์ ํ๋์ฉ๋ง ์์
๊ฐ๋ฅํ๊ฒ ์ฑ๊ธ ์ค๋ ๋๊ณ ์์
์๊ฐ์ด ๊ธธ์ด์ง๋ฉด ์์
์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๊ฒ ์๋๊ณ ๋ค๋ฅธ๊ฒ๋ถํฐ ์ฒ๋ฆฌํ๋๋ฐฉ์์ด ๋
ผ๋ธ๋กํน์ด๊ณ ? ;;;๋จธ๋ผ๋๊ฒจ;;; ๋์ด ๋ฐ๋ ์๋์ผ? ํ์ต๋๋ค. ๊ฒฐ๋ก ์! ๋น์ ๋ก ์ด ๊ฐ๋
์ ์ดํดํด๋ณด์๋ฉด ์ฐ๋ ๋๋ฅผ ๋ด๊ฐ ๋ถ๋ฆด ์ผ๊พผ์ ๋ช
์๋ผ๊ณ ์๊ฐํ๊ณ ๋
ผ๋ธ๋กํน๋ฐฉ์์ ์ผ์ ์์์ ๊ดํ ์ผ์ด๋ผ๊ณ ์๊ฐํ๋ฉด๋ฉ๋๋ค.
์ฐ๋ ๋==๋ด๊ฐ ๋ถ๋ฆด ๋ ธ์ ์
๋ ผ๋ธ๋กํน==์ผ์ ์์
์ฆ, ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์ ๋ด๊ฐ ๋ถ๋ฆด ๋
ธ์๋ค์ด ์ฌ๋ฌ๋ช
์๋ค๋ ๋ป์ด ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋คโฆ. ๊ทธ๋ฌ๋ฉด ๋
ผ๋ธ๋กํน์ด ๋น๋๊ธฐ๋ ๋๊ฐ์๋ง์ธ๊ฐ..? ํ๋๋ฐโฆ ๋๊ฐ์๋ง์ ์๋๋ผ๋ค์ ๋โฆ ๋ค๋ฅธ ํฌ์คํธ์์ ๋ฐ๋ก ์ ๋ฆฌํด์ผ๊ฒ ์ต๋๋ค..( oฬดฬถฬทฬฅแท
โoฬดฬถฬทแท )
I/O๋ input/output์ ์ฝ์๋ก ์
์ถ๋ ฅ ์์
์ ์๋ฏธํฉ๋๋ค. ์
์ถ๋ ฅ์์
์ ์์๋ก ํ์ผ ์์คํ
์ ๊ทผ(์ฝ๊ธฐ, ์ฐ๊ธฐ, ๋ง๋ค๊ธฐ ๋ฑ) , ๋คํธ์ํฌ ์์ฒญ๋ฑ์ด ์์ต๋๋ค.
Node๋ I/O ์์
์ ํ ๋ ๋
ผ๋ธ๋กํน ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ์ฆ, ๋์์ ์ฒ๋ฆฌ๋ ์ ์๋ ์์
์ ์ต๋ํ ๋ฌถ์ด์ ๋ฐฑ๊ทธ๋ผ์ด๋(๋ค๋ฅธ ํ๋ก์ธ์ค)๋ก ๋๊ธฐ๋ฉฐ ์๊ฐ์ ์ด๋์ ํ๋ํฉ๋๋ค.
02-4 ์ด๋ฒคํธ ๊ธฐ๋ฐ(Event-Driven) ์ํคํ ์ณ
์ด๋ฒคํธ ๊ธฐ๋ฐ์ด๋ ์ด๋ฒคํธ(ex.ํด๋ฆญ, ๋คํธ์ํฌ ์์ฒญ, ํ์ด๋จธ ๋ฑ)๊ฐ ๋ฐ์ํ ๋ ๋ฏธ๋ฆฌ ์ง์ ํด๋ ์์
์ ์ํํ๋ ๋ฐฉ์์ ์๋ฏธํฉ๋๋ค.์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ์์๋ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๋ฌด์์ ํ ์ง ๋ฏธ๋ฆฌ ๋ฑ๋กํด์ผ ํฉ๋๋ค. ์ด๋ฒคํธ ๋ฆฌ์ค๋(์ด๋ฒคํธ ๋ฑ๋กํจ์)์ ์ฝ๋ฐฑํจ์(์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ์คํ๋๋ ํจ์)๋ฅผ ๋ฑ๋กํด๋๊ณ ์์คํ
์ด ์ด๋ฒคํธ ๋ฆฌ์ค๋์๊ฒ ์ด๋ฒคํธ ๋ฐ์์ ์๋ฆฌ๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์์คํ
์ผ๋ก ๋ฑ๋ก๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
Node.js์์ ์ค๋ ๊ฑธ๋ฆฌ๋ ์์
์ ์ด๋ฒคํธ ๋ฃจํ์ ๋งก๊น๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ์ฌ๋ฌ ์ด๋ฒคํธ ๋ฐ์์ ํธ์ถํ ์ฝ๋ฐฑํจ์๋ค์ ๊ด๋ฆฌํ๊ณ , ํธ์ถ๋ ์ฝ๋ฐฑํจ์์ ์คํ ์์๋ฅผ ๊ฒฐ์ ํ๋ ์ญํ ์ ๋ด๋นํฉ๋๋ค. ๋
ธ๋๊ฐ ์ข
๋ฃ๋ ๋๊น์ง ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํ ์์
์ ๋ฐ๋ณตํ๋ฏ๋ก ๋ฃจํ(loop)๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
function run(){
console.log("3์ด ๋ค ์คํ");
}
console.log("์์")
setTimeOut(run, 3000);
console.log("๋");
/*
์์
๋
3์ด ๋ค ์คํ
*/
์์ ์ฝ๋๋ฅผ ์์๋ก ๋ค๋ฉด ์ฒ์์ ์์์ ์ถ๋ ฅํ๊ณ runํจ์๋ฅผ 3์ด ๋ค์ ์คํํ๋ setTimeOut ํจ์๊ฐ ์ด๋ฒคํธ ๋ฃจํ๋ ํธ์ถ ์คํ์ ์์ด๊ฒ ๋ฉ๋๋ค. ์ฝ๋ฐฑํจ์์ run์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋ณด๋
๋๋ค. ๋ฐฑ๊ทธ๋ผ์ด๋์์ 3์ด ํ ํ์คํฌ ํ๋ก ๋ณด๋ด๊ฒ ๋ฉ๋๋ค. ํธ์ถ ์คํ ์คํ์ด ๋๋ ๋น์์ง๋ฉด ์ด๋ฒคํธ ๋ฃจํ๊ฐ ํ์คํฌ ํ์ ์ฝ๋ฐฑ์ ํธ์ถ ์คํ์ผ๋ก ์ฌ๋ฆฝ๋๋ค. runํจ์๊ฐ ํธ์ถ ์คํ์์ ์คํ๋๊ณ ์ ๊ฑฐ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ํ์คํฌ ํ์์ ์ฝ๋ฐฑ์ด ๋ค์ด์ฌ ๋๊น์ง ๋๊ธฐ์ํ๊ฐ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ ํ์ด๋จธ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ค์ด ๋๊ธฐํ๋ ๊ณต๊ฐ์ผ๋ก ์ฌ๋ฌ ์์
์ด ๋์์ ์คํ ๋ ์ ์์ต๋๋ค.
ํ์คํฌ ํ๋ ์ด๋ฒจํธ ๋ฐ์ ํ, ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์คํฌ ํ๋ก ํ์ด๋จธ/์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ฝ๋ฐฑํจ์๋ฅผ ๋ณด๋
๋๋ค.
03. Node.js์ ์ญํ
- ๊ฐ๋จํ ๋ก์ง
- ๋๋์ ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ๋ ์๋น์ค (I/O๊ฐ ๋ง์ ์๋น์ค)
- ๋น ๋ฅธ ๊ฐ๋ฐ ์๊ตฌ
- ๋น ๋ฅธ ์๋ต์๊ฐ ์๊ตฌ
- ๋น๋๊ธฐ ๋ฐฉ์์ ์ด์ธ๋ฆฌ๋ ์๋น์ค (์คํธ๋ฆฌ๋ฐ ์๋น์ค, ์ฑํ ์๋น์ค ๋ฑ)
๋
ธ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์์ผ๋ก ์๋ฒ์๋ง ์ฉ๋๊ฐ ํ์ ๋์ด ์์ง๋ ์์ต๋๋ค. ์๋ฒ์ธ์๋ ์น/ ๋ชจ๋ฐ์ผ/ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
04. ๋ชจ๋ (Module)
๋ชจ๋์ด๋ ํน์ ํ ๊ธฐ๋ฅ์ ํ๋ ํจ์๋ ๋ณ์๋ค์ ์งํฉ์ด ๋ชจ์ฌ์๋ ํ์ผ ํ๋๋ผ๊ณ ์๊ฐํ์๋ฉด๋ฉ๋๋ค. ๋ด๊ฐ ๋ง์ฝ ์ด์ฐจํจ์๋ฅผ ํธ๋ ํจ์๊ฐ ํ์ํ๋ฐ ํ๋ก๊ทธ๋จ1์์ ํ์ํ๊ณ , ํ๋ก๊ทธ๋จ2์์๋ ํ์ํ๊ณ ...ํ๋ก๊ทธ๋จ10000์์๋ ํ์ํ๋ค๋ฉด ํ๋ก๊ทธ๋จ๋ง๋ค ์ด์ฐจํจ์๋ฅผ ํธ๋ ํจ์๋ฅผ ๊ณ์๊ณ์ ์ ์ธํด์ค์ผํ๋ค๋ฉด ๋๋ฌด ๊ฐ์ฑ๋น์ ์ผ๋ก ๋ณ๋ก์ฃ ^^ ๊ทธ๋์ ์ด์ฐจํจ์๋ฅผ ํธ๋ ํจ์๋ฅผ ์ ์ธํ ํ์ผ ํ๋๋ฅผ ์ด ํจ์๊ฐ ํ์ํ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ธ๋ค๊ฐ ์ธ๊ฒ๋๋ค. ์ด๋ ์ด์ฐจํจ์๋ฅผ ํธ๋ ํจ์๊ฐ ์ ์ธ๋ ํ์ผ ํ๋๋ฅผ ๋ชจ๋์ด๋ผ๊ณ ํฉ๋๋ค. ์ฆ, ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ฝ๋ ์กฐ๊ฐ์ด๋ผ๊ณ ํ ์ ์๊ฒ ์ฃ . ์ด ๋ชจ๋์ ์ฅ์ ์ ์ฝ๋ ์ถ์ํ/์บก์ํ/์ฌ์ฌ์ฉ/์์กด์ฑ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์
๋๋ค.
์ฌ๊ธฐ์ ์ฝ๋ ์ถ์ํ๋ (abstraction) ๊ตฌ์ฒด์ ์ธ ๊ฒ์ ๊ฐ์ถ๊ณ , ์ ์ฒด์ ์ธ (ํต์ฌ์ ์ธ) ํน์ฑ์ ๋๋ฌ๋ด๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋ํ ์ฝ๋ ์บก์ํ(encapsulation)๋ ๋ด๋ถ์ ์ ๋ณด๋ฅผ ์ต์ํํด์ ์ธ๋ถ์ ๋ณด์ฌ์ฃผ๋ ๊ฒ์
๋๋ค.
๋ชจ๋ ๋ด ํจ์๋ ๊ฐ์ฒด ๋ฑ์ export ํค์๋๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ๋ด๋ณด๋ด์ง ๊ธฐ๋ฅ์ Import ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ๋ชจ๋ ํ์ผ ๋ด์์ add ํจ์๋ฅผ exports ํด๋ณด๊ฒ ์ต๋๋ค.
//math.js
const add = (a, b) => a + b;
module.exports = add;
module.exports ๊ตฌ๋ฌธ์ผ๋ก ๋ด๋ณด๋ด์ผ ๋ค๋ฅธ ํ์ผ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
'module.exports = ๋ด๋ณด๋ด๋ ค๋ ํญ๋ชฉ' ํํ๋ก exports ํ๋ฉด๋ฉ๋๋ค.
//app.js
const add = require('./math');
console.log(add);
console.log(add(4, 5));
๋ค๋ฅธ ํ์ผ์์ exportsํ ๋ชจ๋์ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ๋ณ์์ requireํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉํ ๋ชจ๋์ ๊ฒฝ๋ก๋ฅผ ์์ฑํด์ฃผ๊ณ ํ ๋นํด์ฃผ๋ฉด
[Function: add]
9
์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์ ์ํ์ง ์์ ํจ์๋ฅผ ๊ฐ์ ธ๋ค๊ฐ ์ฌ์ฌ์ฉํ์ต๋๋ค. ํ๋์ ๋ชจ๋ํ์ผ์ ํจ์๋ฅผ ์ฌ๋ฌ๊ฐ๋ ๋ง๋ค ์ ์์ต๋๋ค.
const add = (a, b) => a + b;
const E = 2.718;
const PI = 3.141592;
//case 1
module.exports = {
add,
E,
PI,
};
์ฌ์ฌ์ฉํ ๋ชจ๋ํ์ผ์ addํจ์ ์ธ์๋ ์ถ๊ฐํด์คฌ์ต๋๋ค. ๊ผญ ํจ์๊ฐ ์๋์ด๋ ๋ฉ๋๋ค. ๋ณ์ E์ PI์ ํน์ ํ ๊ฐ์ ๋ฃ๊ณ exports ํ์ต๋๋ค. ์ด๋ฒ์ exports๋ฅผ ๊ฐ์ฒด ๊ฐ์ธ์ ํด์ฃผ์์ต๋๋ค. obj์์๋ key์ value๊ฐ ๋์ผํ๋ค๋ฉด ์๋ต ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ์์ฑํด์ฃผ๊ฒ ์ต๋๋ค. ์ด ์ธ์๋ ํ๋์ฉ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ๊ณผ ํ๋์ฉ ๋ด๋ณด๋ด๋ ๊ฒ์์ ์๋ต๋ฒ์ ์ด ์์ต๋๋ค.
//add ๋ผ๋ ํจ์๋ฅผ ๋ค๋ฅธ js ํ์ผ์์ ์ธ ์ ์๋๋ก ๋ด๋ณด๋ด๊ธฐ
const add = (a, b) => a + b;
const E = 2.718;
const PI = 3.141592;
// case 2. ํ๋์ฉ ๋ด๋ณด๋ด๊ธฐ -> ์ด๋ ๊ฒ ๋ณด๋ด๋ ๊ฐ์ฒด๋ก ์ ์ฅ๋๋ค.
module.exports.add = add;
module.exports.E = E;
module.exports.PI = PI;
//add ๋ผ๋ ํจ์๋ฅผ ๋ค๋ฅธ js ํ์ผ์์ ์ธ ์ ์๋๋ก ๋ด๋ณด๋ด๊ธฐ
const add = (a, b) => a + b;
const E = 2.718;
const PI = 3.141592;
// //case2 ์๋ต๋ฒ์
exports.add = add;
exports.E = E;
exports.PI = PI;
math ๋ชจ๋์์ ๋ถ๋ฌ์จ ํจ์์ ๋ณ์๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
const mod = require('./math');
console.log(mod);
console.log(mod.add(mod.PI, mod.E));
์ถ๋ ฅ์
{ add: [Function: add], E: 2.718, PI: 3.141592 }
5.859592
๋ชจ๋์ ์๋ ํจ์์ ๋ณ์๋ฅผ ๊ฐ์ฒด ํ์
์ผ๋ก ์ถ๋ ฅํฉ๋๋ค.
๋
ธ๋ ๋ชจ๋์ ๋ถ๋ฌ์ฌ ๋ ์ฃผ์ํ ์ ์ด ์์ต๋๋ค. const {}๋ก ๊ฐ์ ธ์ฌ ๋๋ ๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ๋ถํดํ์ฌ ๊ฐ์ ธ์ค๊ธฐ๋๋ฌธ์ ์ด๋ฆ์ด ๋์ผํด์ผ ํฉ๋๋ค.
๊ตฌ์กฐ๋ถํดํ ๋น์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ์์ฑ์ ํด์ฒดํ์ฌ ๊ทธ ๊ฐ์ ๊ฐ๋ณ ๋ณ์์ ๋ด์ ์ ์๊ฒํ๋ ํํ์์
๋๋ค.
๊ธ๋กํ๋ ์ดํด๊ฐ ์ ์๊ฐ๊ฑฐ๊ฐ์ผ๋ ์ฝ๋๋ก ๋ณด๊ฒ ์ต๋๋ค.
const cookie = {
choco : '์ด์ฝ๋ง ์ฟ ํค',
vanilla : '๋ฐ๋๋ผ๋ง ์ฟ ํค',
orange : '์ค๋ ์ง๋ง ์ฟ ํค',
};
๋ค์๊ณผ ๊ฐ์ด ๋ด๊ฐ ๋ง๋ cookie๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๋ณด์์ต๋๋ค. ์ด๋ value๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด์๋ cookie.choco ์ด๋ฐ์์ผ๋ก ์ (.)์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ผ ํฉ๋๋ค.
//๊ตฌ์กฐ๋ถํดํ ๋น : ๊ตฌ์กฐ๋ฅผ ๋ถํดํด์ ํ ๋น(= ์ฐ์ฐ์) ํ๊ฒ ๋น !
//1. ๊ฐ์ฒด ({})๋ฅผ ๊ตฌ์กฐ๋ถํด
const cookie = {
choco: '์ด์ฝ๋ง ์ฟ ํค',
vanilla: '๋ฐ๋๋ผ๋ง ์ฟ ํค',
orange: '์ค๋ ์ง๋ง ์ฟ ํค',
};
//๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ๋ถํด ํด๋ณด์ฅ
const { vanilla, orange, choco } = cookie; //ํค๊ฐ ์์๋ ์๊ด์๋น
๋ค์๊ณผ๊ฐ์ด ๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ๋ถํดํ์ฌ ํ ๋นํด ์ฃผ์์ต๋๋ค.
const cookie = {
choco: '์ด์ฝ๋ง ์ฟ ํค',
vanilla: '๋ฐ๋๋ผ๋ง ์ฟ ํค',
orange: '์ค๋ ์ง๋ง ์ฟ ํค',
};
//๊ฐ์ฒด๋ฅผ ๊ตฌ์กฐ๋ถํด ํด๋ณด์ฅ
const { vanilla, orange, choco } = cookie; //ํค๊ฐ ์์๋ ์๊ด์๋น
// //key๊ฐ์ผ๋ก๋ ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅ
console.log(choco);
console.log(vanilla);
console.log(orange);
๊ตฌ์กฐ๋ถํด๋ฅผ ํด์ ๊ฐ์ฒด๋ฅผ ํ ๋นํด์ฃผ๋ฉด ์ (.)์ฐ์ฐ์๋ฅผ ์ธ ํ์์์ด ๊ฐ์ฒด์ key๊ฐ์ผ๋ก๋ ๋ฐ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ตฌ์กฐ๋ถํด๋ฅผ ํตํด ๋ณ์์ ์ ์ธ๊ณผ ๋ถ๋ฆฌํ์ฌ ๋ณ์์ ๊ฐ์ ํ ๋นํ ์ ์์ต๋๋ค.
const { choco, vanilla, orange } = {
choco: '์ด์ฝ๋ง ์ฟ ํค',
vanilla: '๋ฐ๋๋ผ๋ง ์ฟ ํค',
orange: '์ค๋ ์ง๋ง ์ฟ ํค',
};
// //key๊ฐ์ผ๋ก๋ ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅ
console.log(choco);
console.log(vanilla);
console.log(orange);
ํ๋๋ง ๋ด๋ณด๋ธ ๋ชจ๋์ ์ด๋ฆ์ด ๋ฌ๋ผ์ ธ๋ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค. ใ
04-1. JavaScript์์ ๋ชจ๋์ ๋ค๋ฃจ๋ ์ฌ๋ฌ ๋ฐฉ์
- CommonJS ๋ชจ๋
- ์๋ฐ์คํฌ๋ฆฝํธ ํ์ค ๋ชจ๋ ๋ฐฉ์์ ์๋
- ๋ ธ๋์์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๋ชจ๋๋ฐฉ์ (-> ํ์ค๋ณด๋ค ๋จผ์ ๋ฑ์ฅํด์ ๊ฐ์ฅ ๋ง์ด ์ฐ์)
- module.exports/ require์ ์ด์ฉํ์ฌ ๋ชจ๋๊ด๋ฆฌ
- AMD(Asyncronous Module Definition) -> ์์์ฐ์ ^^
- UMD(Universal Module Definition) -> ์์์ฐ์ ^^*
- ES2015(ES6) -๋ฆฌ์กํธ์์ ๋ง์ด ์ฌ์ฉ
- import(๋ถ๋ฌ์ค๊ธฐ ), export(๋ด๋ณด๋ด๊ธฐ) ํค์๋๋ก ๋ชจ๋๊ด๋ฆฌ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด ๋ชจ๋ ์์คํ ๋ฌธ๋ฒ
- ๋ ธ๋ ๋ชจ๋ ์์คํ ๊ณผ ๋ฐฉ์์ด ์ฝ๊ฐ ๋ค๋ฆ
- package.json์ "type : "module"์ ์ถ๊ฐํ์ฌ ์ฌ์ฉ
05. NPM
NPM์ Node Package Manager์ ์ฝ์๋ก ๋ง๊ทธ๋๋ก ๋
ธ๋ ํจํค์ง๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ํ์
๋๋ค. ์ด NPM์ ์
๋ก๋ ๋ ๋
ธ๋ ๋ชจ๋ ํจํค์ง๋ค ๊ฐ์ ์์กด๊ด๊ณ๊ฐ ์กด์ฌํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ๋์ ๋ชจ๋ํ์ผ(==ํจํค์ง)์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ ๋ชจ๋ํ์ผ์ ์์กด๋์ด์๋ ๋ค๋ฅธ ๋ชจ๋ ํ์ผ๊น์ง ๋ฌธ์ ๊ฐ ๋ฐ์๋ ์ ์์ต๋๋ค. ๋๋ฌธ์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋งค์ฐ ์ค์ํ๋ฐ ์ด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฒ์ด package.json์
๋๋ค. package.json์๋ ํ๋ก์ ํธ์ ๋ํ ์ ๋ณด์ ์ฌ์ฉ ์ค์ธ ํจํค์ง ์ด๋ฆ ๋ฐ ๋ฒ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ ์๋ ํ์ผ์
๋๋ค.
{
"name": "08-npm", //ํจํค์ง ์ด๋ฆ
"version": "1.0.0", //ํจํค์ง์ ๋ฒ์
"description": "npm ์ฐ์ต ํ๋ก์ ํธ", //ํจํค์ง์ ๋ํ ์ค๋ช
"main": "index.js", //์๋ฐ์คํฌ๋ฆฝํธ ์คํ ํ์ผ ์ง์
์
"scripts": { //npm run์ ์ด์ฉํด ์ ํด๋์ ์คํฌ๋ฆฝํธ ๋ช
๋ น์ด
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC" //ํด๋น ํจํค์ง์ ๋ผ์ด์ผ์ค
}
NPM์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ฒซ๋ฒ์งธ๋ $npm init ๋ช
๋ น์ด๋ก ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ์ฌ์ฉํ๋ ๋ช
๋ น์ด ์
๋๋ค. package.json์ ๊ธฐ๋ก๋ ๋ด์ฉ์ ๋ฌธ๋ต์์ผ๋ก ์
๋ ฅํ๊ฒ ๋ฉ๋๋ค.$npm init --yes ๋ช
๋ น์ด๋ package.json์ด ์์ฑ๋ ๋ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ์์ฑ์์ผ์ฃผ๋ ๋ช
๋ น์ด ์
๋๋ค. ์ถ๊ฐ๋ก $npm install ํจํค์ง์ด๋ฆ ์ ๋ช
๋ น์ด๋ก ์
๋ ฅํ๋ค๋ฉด ํ๋ก์ ํธ์์ ์ฌ์ฉํ ํจํค์ง๋ฅผ ์ค์นํ๋ ๋ช
๋ น์ด ์
๋๋ค. ์ค์น๋ ํจํค์ง์ ์ด๋ฆ๊ณผ ์ ๋ณด๋ package.json์ dependencies์ ์๋์ผ๋ก ์
๋ ฅ๋๊ฒ ๋ฉ๋๋ค.
06.http ๋ชจ๋
Node.js๋ฅผ ํตํด ์๋ฒ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์๋ http์ express๊ฐ ์์ต๋๋ค.
http ๋ชจ๋์ด๋ ์น ์๋ฒ๋ฅผ ๊ตฌ๋ํ๊ธฐ ์ํ node.js ๋ด์ฅ ์น ๋ชจ๋์
๋๋ค. server ๊ฐ์ฒด, request ๊ฐ์ฒด, response ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
server ๊ฐ์ฒด๋ ์น ์๋ฒ๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฒด ์
๋๋ค.
request ๊ฐ์ฒด๋ ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํ ๋ ์ฒซ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ๊ฐ์ฒด ์
๋๋ค.
response ๊ฐ์ฒด๋ ์๋ต ๋ฉ์์ง๋ฅผ ์์ฑํ ๋ ๋๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ๋๋ ๊ฐ์ฒด ์
๋๋ค.
http ๋ชจ๋ ์๋ฒ๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
const http = require('http');
const server = http.createServer();
server.listen(8080, function () {
console.log('8080๋ฒ ํฌํธ๋ก ์๋ฒ ์คํ');
});
//listen(port,callback) -> ์๋ฒ๋ฅผ ์ฒซ๋ฒ์งธ ๋งค๊ฐ๋ณ์์ ํฌํธ๋ก ์คํํ๋ค.
http ๋ชจ๋๋ก ์น ์๋ฒ๋ฅผ ์์ฑํ๊ณ ํด๋ผ์ด์ธํธ๊ฐ localhost:PORT ์์ฒญ์ ๋ ๋ ธ์ผ๋ ์๋ฒ๊ฐ ์๋ตํ๊ณ ์๋ ๋ด์ฉ์ด ์์ผ๋ฏ๋ก ์๋ฌด๊ฒ๋ ๋จ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ localhost๋ ์ปดํจํฐ ๋ด๋ถ ์ฃผ์ ์
๋๋ค. ์ฆ, ์์ ์ ์ปดํจํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํธ์คํธ ์ด๋ฆ์
๋๋ค.
port, ์ฆ ํฌํธ๋ ์๋ฒ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ๋ก์ธ์ค๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํ ๋ฒํธ์
๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก http ์๋ฒ๋ 80๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
const http = require('http');
const fs = require('fs'); //ํ์ผ ๊ด๋ จ ๋ด์ฅ ๋ชจ๋
const server = http.createServer(function (req, res) {
res.writeHead(200, { 'content-type': 'text/html; charset=utf8' }); //์๋ตํค๋
res.write('<h1>Hello, Node.js! </h1>'); //์๋ต ๋ณธ๋ฌธ
res.end('<p>My first node server!์ฐํํ</p>'); //์๋ต ๋ณธ๋ฌธ ์์ฑ ํ์ ์๋ต ์ข
๋ฃ
//Response ๊ฐ์ฒด
//writeHead : ์๋ตํค๋ ์์ฑ
//write : ์๋ต ๋ณธ๋ฌธ ์์ฑ
//end : ์๋ต ๋ณธ๋ฌธ ์์ฑ ํ ์๋ต ์ข
๋ฃ
});
//์๋ฒ์คํ
server.listen(8080, function () {
console.log('8080๋ฒ ํฌํธ๋ก ์๋ฒ ์คํ');
});
๋ฅผ ์
๋ ฅํ๊ณ node index.js๋ฅผ ํฐ๋ฏธ๋์ฐฝ์ ์
๋ ฅํ๊ณ ์น๋ธ๋ผ์ฐ์ ์ localhost:8080์ ์
๋ ฅํด์ ๋ค์ด๊ฐ๋ฉด ๋ด๊ฐ ์
๋ ฅํ๋ Html์ฝ๋์ ๋ฐ๋ผ ์น๋ธ๋ผ์ฐ์ ์ ๋ํ๋๊ฒ ๋ฉ๋๋ค. ๋ค์์ ์กด์ฌํ์ง ์๋ ํ์ผ์ ๊ฐ์ ธ์์ 404 ์๋ฌ ํ๋ฉด์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
const http = require('http');
const fs = require('fs'); //ํ์ผ ๊ด๋ จ ๋ด์ฅ ๋ชจ๋
const server = http.createServer(function (req, res) {
try {
//html ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
const data = fs.readFileSync('./index2.html');
res.writeHead(200, { 'content-type': 'text/html; charset=utf8' });
res.write(data);
res.end();
} catch (error) {
//ํด์ฆ : 404.html ๋ง๋ค์ด์ ํด๋น html์ ์๋ต์ผ๋ก ๋ณด๋ด๋๋ก ์ฝ๋ ์์
const err = fs.readFileSync('./404.html');
console.error(error);
res.writeHead(404, { 'content-type': 'text/html; charset=utf8' });
// res.write(error.message);
res.write(err);
res.end();
}
});
//req ์ด๋ฒคํธ : ํด๋ผ์ด์ธํธ ์์ฒญ
// server.on('req', function (req, res) {
// console.log('req ์ด๋ฒคํธ ๋ฐ์!!');
// });
//connection ์ด๋ฒคํธ : ํด๋ผ์ด์ธํธ๊ฐ ์ ์ ( ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ฐ๊ฒฐ๋์์ ๋)๋ฐ์
server.on('connection', function (req, res) {
console.log('connection ์ด๋ฒคํธ ๋ฐ์!!');
});
//์๋ฒ์คํ
server.listen(8080, function () {
console.log('8080๋ฒ ํฌํธ๋ก ์๋ฒ ์คํ');
});
html์ ๋ถ๋ฌ์ค๋ readFileSyncํจ์๋ฅผ ์ด์ฉํ์ฌ ๋ณ์ data์ ๋ฃ์ด์ค๋๋ค. index.2๋ ํ์ฌ ์์น์์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๊ณ catch ๊ตฌ๋ฌธ์ผ๋ก ์ด๋ํ์ฌ ๋ง๋ค์ด๋ 404.html์ ์๋ต์ผ๋ก ๋ณด๋ด๋๋ก ํ์์ต๋๋ค.
๊ฐ๋ ฌํฉ๋๋ค.... ํด๋นํ์ผ์ ์ฐพ์ ์ ์๋ค๊ณ ์น๋ธ๋ผ์ฐ์ ์ ์ฒด๊ฐ ๋๊ฐ๋ผ๊ณ ์ธ์น๋๊ฒ ๊ฐ์ต๋๋ค.
try catch ๊ตฌ๋ฌธ์ "์๋ฌ ํธ๋ค๋ง"์ ์ฌ์ฉ๋๋ ๊ตฌ๋ฌธ์ผ๋ก ์์ธ์ฒ๋ฆฌ์ ์ฌ์ฉํฉ๋๋ค.
try{
//์๋ ํด์ผํ๋ ์ผ
}
catch(error){ //error : ํ์ฌ ๋ฐ์ํ๊ณ ์๋ ์๋ฌ ์ ๋ณด๋ฅผ ๋ด๋ ๊ฐ์ฒด๋ก ์ด๋ฆ์ ๋ง์๋๋ก ์ง์ด๋ ๋จ ใ
_<
//์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ฒ๋ฆฌํ ์ผ
}
๋จผ์ try๊ตฌ๋ฌธ์ ์คํํ๊ณ try๊ตฌ๋ฌธ์์ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๊ณ ์ ์์ผ๋ก ๋์ํ๋ค๋ฉด catch ๋ธ๋ญ์ ํจ์คํ๊ฒ ๋๊ณ try ๋ธ๋ญ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด try ๊ตฌ๋ฌธ ์คํ์ ์ค๋จํ๊ณ catch ๋ธ๋ญ์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ฐ์ํ ์๋ฌ์ ๋ํ ์ ๋ณด๋ error ๋ณ์์ ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค.
console.error(error) -> ์๋ฌ๋ฅผ ๊ฐ์กฐ
error.message -> ์๋ฌ ๋ฉ์์ง๋ง ๋์ค๊ฒ ํจ
error.name -> ๋ฌด์จ ์๋ฌ์ธ์ง ์๋ฌ์ ์ข
๋ฅ๋ฅผ ๋ํ๋๊ฒ ํจ
[http ์๋ต]
- 1XX : ์ฒ๋ฆฌ์ค (100 : Continue , 102 : Processing)
- 2XX : ์ฑ๊ณต (200:OK, 201: Created, 202 : Accepted)
- 3XX : ๋ฆฌ๋ค์ด๋ ํธ(๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋)
- 4XX : ์์ฒญ ์ค๋ฅ (400 : ์๋ชป๋ ์์ฒญ, 401 : ๊ถํ ์์, 403 : ๊ธ์ง๋จ, 404 : ์ฐพ์ ์ ์์(page not found))
- 5XX : ์๋ฒ ์ค๋ฅ
07. Express
Express๋ Node.js์ ํ๋ ์์ํฌ ์ ๋๋ค ์ฌ๊ธฐ์ ํ๋ ์์ํฌ๋ ์ด๋ ํ ์์ ์ ์์ฑํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์งํฉ์ด๋ผ ํ ์ ์์ต๋๋ค. Node.js๋ฅผ ์ด์ฉํ์ฌ ์น์ ๋ง๋ค๊ธฐ ์ํ ํ(frame)์ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์งํฉ์ด๋ผ๊ณ ๋ค์ ๋งํ ์ ์์ต๋๋ค. . http ๋ชจ๋๊ณผ ๋ค๋ฅด๊ฒ ์ธ์ฅ ๋ชจ๋๋ก installํ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
๋ฆฌ๋๋์ด ๋ฉด์ ์์
์ด์ด ์ง์์,,, ๋ชจ๋์ด ๋ญ๋!!!
ํ๊ณ ๋ฌผ์ด๋ณด๋ฉด CommonJS๋ชจ๋๊ณผ ES2015๋ฅผ ์ ๊ตฌ๋ถํด์ ๋๋ตํด์ผํ๋ค๊ณ ํ์
ง๋น,, (๋์ค์ ๋ฆฌ์กํธ ํ๊ณ ๊ธฐ์ตํ๋ ค๊ณ ํ๊ณ ์ธ์ฒ ์ ๊ธฐ..) ๋๊ทผ๋๊ทผ ๋ฐฑ์๋ ์์์์ ?์ ์ธ์น๋ค.. ์ฌ์ค ๊ณต๋ถํ๋ค๊ฐ ๋ชจ๋ฅด๋ ๋จ์ด๊ฐ ๋์ค๋ฉด ๊ทธ ๋จ์ด ๊ณต๋ถํ๊ณ ์ ๊ทผ๋ฐ ๋ ๋ฌด์จ๊ณต๋ถํ๊ณ ์์์ง.. ? ์ ์ด๊ฑฐ ๊ณต๋ถํ๊ณ ์์์ง,, ์ด๋ ๊ฒ ๊ณ์ ์ธํฐ๋ฝํธ ๊ฑธ๋ ค์ ์์ง์ ํท๊ฐ๋ฆฌ์ง๋ง ,,, ๊ณ์ ๊ณต๋ถํด์ ๋ด๊ฑธ๋ก ๋ง๋ค์ด์ผ๊ฒ ๋น,, ํธํํ ! ์ด์์ฒด์ ๋ ๋ฐฐ์ ๋ ๊ฐ๋
๋์์ ๋ฐ๊ฐ์ ๋๋ฐ.. ์ฝ๊ฐ ํ์ผ๋ก ์๊ณ ์์๋ค,, ๊ทธ๋ ์ ์๋ฐ ๋๋์ด๊ตฐ .. ์ด์ ๋๋ก๋ง ์๊ณ ์์๋๋ณด๋ค,, ์ด๋ฒ์ ์คํฐ๋ํ๋ฉด์ ์ ๋๋ก ์์ฃผ๊ทธ๋ฅ ์๋ฒฝํ๊ฒ ์ดํดํด์ฃผ๋ง ํ๋ผํํํํใ
ํํํํ
'SeSAC > javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 06W_3_18 : MVC (+๋ผ์ฐํฐ์ชผ๊ฐ๊ธฐ) (0) | 2023.08.25 |
---|---|
๋น๋๊ธฐ ์ฒ๋ฆฌ (0) | 2023.08.15 |
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 2W_06 _04: javascript Event (0) | 2023.08.04 |
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 2W_06 _03: javascript DOM (0) | 2023.08.02 |
[SeSACXCodingOn] ์นํ์คํ๊ณผ์ 2W_06 _01: javascript_ํ์ค๊ฐ์ฒด (0) | 2023.08.01 |