[Node] node.js๋ฅผ ์ด์ฉํ์ฌ ์๋ฒํต์ ๊ตฌํํ๊ธฐ
- -
๐ Node.js ๋ฐฑ์๋ ๊ธฐ์ด๊ฐ์
์ด ๊ธฐ์ด๊ฐ์ ๋ด์ฉ์ ์ ํ๋ธ ์กฐ์ฝ๋ฉ JoCoding๋์ "ํ ์๊ฐ ๋ง์ Node.js ๋ฐฑ์๋ ๊ธฐ์ด ๋๋ด๊ธฐ(ft. API๊ตฌ์ถ)"์ด๋ผ๋ ์ ๋ชฉ์ ๊ฐ์ง Node.js์ ๊ธฐ๋ณธ์์์ด๋ค. ๊ธธ์ด๋ 1์๊ฐ ์ ๋๋ก Node.js๊ฐ ๋ฌด์์ด๊ณ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์์๋ณด๊ธฐ ์ํด ๋ถํธ์บ ํ ์๋ฃ์ ๊ฐ๋ ์งํ์ฒ ์์ 1์๊ฐ ์ ๋ ๊ฐ๋ณ๊ฒ ๋ดค์๋๋ฐ Node.js๋ฅผ ์์ํ๊ธฐ ์ข์ ๊ฐ์๋ผ ์๊ฐ์ด ๋ค์ด ๋ค์ ํ๋ฒ ์์ฒญํ๋ฉด์ ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํด ๋ณด๋ ค๊ณ ํ๋ค.
์ถ์ฒ : ์กฐ์ฝ๋ฉ JoCoding -ํ์๊ฐ๋ง์ Node.js ๋ฐฑ์๋ ๊ธฐ์ด ๋๋ด๊ธฐ(ft. API๊ตฌ์ถ)
๐ Node.js๋ ๋ฌด์์ธ๊ฐ?
์ง๊ธ ๋ฉ์ธ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ python ์ธ์ด๋ ์ปดํจํฐ์ ์ค์นํด์ผ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๋ฐฑ์๋ ์ธ์ด์ด๋ค. ํ์ง๋ง javascript๋ ์ค์น๊ณผ์ ์์ด ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ ์ด์ ๋ javascript๋ ๋ธ๋ผ์ฐ์ ์ ์ธํฐํ๋ฆฌํฐ๊ฐ ์์ด javascript๋ฅผ ์ฝ์ด ์คํ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ก์ปฌ์ ์ค์น ์์ด ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ด์ javascript๋ฅผ node.js ๋ฐฑ์๋(์๋ฒ)์์ ์๋ํ๊ธฐ ์ํด์๋ node.js๋ฅผ ์ค์นํด์ผ ์คํ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ Node.js๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ธ ํ์ ์์ด javascript๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ๊ฒฝ์ด ๋ง๋ค์ด์ง๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐฑ์๋(์๋ฒ)์ ํ๋กํธ(ํด๋ผ์ด์ธํธ) ๋ชจ๋ javascript๋ก ๊ตฌํ์ด ๊ฐ๋ฅํด์ง๋ค.
์ด๋ ๊ฒ ๋ฐฑ์๋์ ํ๋ฐํธ ๋ชจ๋ ๊ฐ๋ฐํ ์ ์๋ node.js๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ํ์ตํ๊ธฐ ์ ์ node.js๊ฐ ๋ฌด์์ด๋ฉฐ ์ด๋ ํ ์ํฅ๋ ฅ์ ๊ฐ์ง๊ณ ์๋์ง ์์๋ณด๋๋ก ํ์. ํ์ฌ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ๋ ์ธ์ด๋ง๋ค ๋ค์ํ๊ณ ๋ง์๋ฐ ๊ทธ์ค์์ Node.js๋ ์์๊ถ์ ์ํ๋ค.
์ฌ๊ธฐ์ ํ๋ ์ง๊ณ ๋์ด๊ฐ์ผ ํ ๋ถ๋ถ์ด node.js๋ javascript์ฒ๋ผ ๊ฐ๋ฐ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋๋ผ javascript๋ก ๋ฐฑ์๋ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํ๋์ ํ๋ ์์ํฌ๋ผ๋ ๊ฒ์ ์๊ณ ๊ฐ์.
์ถ์ฒ : survey.stackoverflow.co
์์ ๊ทธ๋ฆผ์ stackoverflow์์ ์กฐ์ฌํ 2022๋
Web frameworks์ technologies๋ถ๋ถ ํต๊ณ์ด๋ฉฐ Node.js๊ฐ 47%์ด๋ฉฐ ๊ฑฐ์ 50%์ ์๋ฐํ๋ ๋น์ค์ ๊ฐ์ง๊ณ ์๋ ๋งํผ ๊ฐ๋ฐ์๋ค์ด ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ ํ๋ ์์ํฌ๋ผ๋ ๊ฒ์ ์์น๋ก์ ๋ณด์ฌ์ค๋ค.
๐ Node.js ์ค์น
ํ์ฌ ์์ฒญํ๊ณ ์๋ ๊ฐ์๋ Windows๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค์น๊ณผ์ ์ ์ค๋ช
ํ๊ณ ์์ผ๋ฏ๋ก Mac์ ์ฌ์ฉํ๊ณ ์๋ ๋๋ Homebrew๋ฅผ ์ฌ์ฉํด์ node.js๋ฅผ ์ค์นํด ๋ณด๊ฒ ๋ค. Homebrew๊ฐ ์ค์น๋์ด ์์ง ์์ผ๋ฉด ์๋ ๋ธ๋ก๊ทธ๋ฅผ ๋ฐ๋ผ ํ๋ฉด Homebrew์ node.js๋ฅผ ์ค์นํ๋๋ก ํ์.
์ถ์ฒ : Node.js ์ค์น
โค NVM
์ ๋ธ๋ก๊ทธ๋ฅผ ๋ฐ๋ผ ํ๋ค ๋ณด๋ฉด NVM์ด๋ผ๋ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ์ค์นํ๋๋ฐ "Node Version Manager"๋ผ๊ณ ํ๋ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ ๋๊ตฌ์ด๋ค.
# ๋ช
๋ น์ด
$ brew install nvm
NVM, ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
ํ์ ์ ํ ๋, ๋๋ ๋ค์ํ ํ๋ก์ ํธ๋ฅผ ๋์์ ์งํํด์ผ ํ ๋ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ / ํ๋ ์์ํฌ / ๊ฐ๋ฐํด์ ๋ฒ์ ํธํ ๋ฌธ์ ๋ฅผ ๊ฒช๊ธฐ ๋๋ฌธ์ด๋ค. NVM์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์ด์ ์ด ์๋๋ฐ ์๋์ ๊ฐ๋ค.
- ์ปดํจํฐ์ ๋ค์ํ ๋ฒ์ ์ Node.js๋ฅผ ์ค์นํ ์ ์๊ฒ ํด ์ค๋ค.
- use ์ปค๋งจ๋๋ฅผ ์ด์ฉํด ์ฌ์ฉํ Node ๋ฒ์ ์ผ๋ก ๊ฐ๋จํ๊ฒ ์ค์์นญํ ์ ์๊ฒ ํด ์ค๋ค.
- ๋ํดํธ ๋ฒ์ ์ ์ค์ ํ๊ฑฐ๋ / ์ค์นํ ๋ฒ์ ๋ค์ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ํ์ธํ๊ฑฐ๋ / ํ์ ์๋ ๋ฒ์ ์ ์ญ์ ํ๋ ๋ฑ ์์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ์ฌ์์ง๋ค.
- ๋ฃจ๋น์ rvm, rbenv๋ ํ์ด์ฌ์ pyenv์ ๊ฐ์ ์ญํ ์ ํ๋ค.
โค nvm ํ๊ฒฝ๋ณ์ ์ค์
# ๋ช
๋ น์ด
$ vim ~/.zshenv
# ํ๊ฒฝ ์ค์ ์ฝ๋
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh" # This loads nvm
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" # This loads nvm bash_completion
โค nvm ์ค์น ํ์ธ
์์ ๊ณผ์ ์ด ๋๋ฌ๋ค๋ฉด nvm์ด ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํด ๋ณด์.
# ๋ช
๋ น์ด
% nvm --version
โค nvm์ผ๋ก node.js์ค์น
์ด์ nvm์ ์ด์ฉํ์ฌ node.js๋ฅผ ์ค์นํด ๋ณด์. ls-remote๋ช ๋ น์ด๋ก ์ค์นํ ์ ์๋ node.js๋ฒ์ ์ ํ์ธํ ์ ์๋ค.
# ๋ช
๋ น์ด
% nvm ls-remote
v16.8.0
v16.9.0
v16.9.1
v16.10.0
v16.11.0
v16.11.1
v16.12.0
v16.13.0 (LTS: Gallium)
v16.13.1 (LTS: Gallium)
v16.13.2 (LTS: Gallium)
v16.14.0 (LTS: Gallium)
v16.14.1 (LTS: Gallium)
v16.14.2 (LTS: Gallium)
v16.15.0 (LTS: Gallium)
v16.15.1 (LTS: Gallium)
v16.16.0 (LTS: Gallium)
v16.17.0 (LTS: Gallium)
v16.17.1 (LTS: Gallium)
v16.18.0 (LTS: Gallium)
v16.18.1 (LTS: Gallium)
v16.19.0 (Latest LTS: Gallium)
v17.0.0
v17.0.1
v17.1.0
v17.2.0
ํ์ธํ ๋ฒ์ ์์ ์ํ๋ node.js๋ฒ์ ์ ์ ํํ์ฌ install ๋ช ๋ น์ด๋ก ์ค์นํ ์ ์๋ค.
# ๋ช
๋ น์ด
$ nvm install 17.2.0
๐ NVM ๊ธฐํ ๋ช ๋ น์ด
# node.js ๋ฒ์ ์ค์นํ๊ธฐ
$ nvm install 0.10
$ nvm install v0.1.2
$ nvm install v8
# node ์ต์ ๋ฒ์ ์ค์น (์ค์น ๋น์ ๊ธฐ์ค)
$ nvm install node
# node LTS ์ต์ ๋ฒ์ ์ค์น
$ nvm install --lts
# ์ค์น๋ node.js ๋ชฉ๋ก ํ์ธํ๊ธฐ
$ nvm ls
# ์ค์นํ ์ ์๋ ๋ชจ๋ Node ๋ฒ์ ์กฐํ (์ฌ๋ฏธ์ผ์ ํด๋ณด์ง๋ง์ธ์ ๊ฒ๋๋ง์... ํฉ๊ธํ control C ๋๋๋ฆฌ๊ธฐ)
$ nvm ls-remote
# ํน์ ๋ฒ์ ์ node ์ฌ์ฉํ๊ธฐ
$ nvm use <version>
# ํ์ฌ ์ฌ์ฉ์ค์ธ ๋ฒ์ ํ์ธํ๊ธฐ
$ nvm current
# node.js ์ค์น ๊ฒฝ๋ก ํ์ธํ๊ธฐ
$ which node
# ํ์์๋ node ๋ฒ์ ์ญ์ ํ๊ธฐ
$ nvm uninstall <version>
๋ง์ฝ์ ์๋ก์ด ์์ ์คํํ ๊ฒฝ์ฐ node์ ๋ฒ์ ์ด system๋ฒ์ ์ผ๋ก ๋ฆฌ์ ๋๋๋ฐ, ์ด๋ฅผ ๊ณ ์ ํ๊ธฐ ์ํ ์ปค๋งจ๋๋ ์๋์ ๊ฐ๋ค.
$ nvm alias default 8.9.4
# ์ค์น๋์ด ์๋ ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ node๋ฅผ ๋ํดํธ๋ก ์ฌ์ฉํ๊ธฐ
$ nvm alias default node
๐ ๊ธฐ์กด javascript๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ
์ฐ๋ฆฌ๊ฐ ๋ธ๋ผ์ฐ์ ์์ javascript๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ด์ ๋ ์๋์ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ๊ฐ ๋์์ง ์ํ์์ V8์ด๋ผ๊ณ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด javascript ์ฝ๋๋ฅผ ์คํํ๋ ์ธํฐํ๋ฆฌํฐ(ํด์๊ธฐ)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ๋ก์ปฌ ์ปดํจํฐ์์๋ ๊ทธ๋ฐ ํ๊ฒฝ์ด ๊ฐ์ถฐ์ ธ์์ง ์๋ค๊ฐ ์ด์ Node.js๋ฅผ ์ค์นํ๊ธฐ ๋๋ฌธ์ ์คํํ ์ ์๊ฒ ๋์๋ค.
๐ Node.js๋ฅผ ์ด์ฉํ์ฌ javascript ์ฌ์ฉํด ๋ณด๊ธฐ
// index.js
console.log("Hello world!");
์์ ๊ฐ์ด index.jsํ์ผ์ ์์ฑ ํ ๊ฐ๋จํ javascript์ฝ๋๋ฅผ ์ ๋ ฅํ์ฌ ์คํ์ ์์ผ ๋ณด์๋ค. node.js ์ค์น ์์ด ์คํํ๋ ๋ฐฉ๋ฒ์ htmlํ์ผ์ ๋ธ๋ผ์ฐ์ ๋ก ๋์ด ๋ค์์ jsํ์ผ์ import ๋ฐ์ javascript์ฝ๋๋ฅผ ์คํํ๊ฑฐ๋ htmlํ์ผ์ script์ฝ๋๋ฅผ ์์ฑํ์ฌ ์คํ์์ผ ์ฃผ์ด์ผ ํ๋ค. ํ์ง๋ง ์ด์ ์์ ๊ฐ์ด ์ ๋ ฅํ ์ฝ๋๋ฅผ control + option + n๋จ์ถํค๋ฅผ ์ด์ฉํ๊ฑฐ๋ teminal์ ์๋์ ๊ฐ์ด node ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์คํํ ์ ์๋ค.
# ๋ช
๋ น์ด
% node index.js
# ๊ฒฐ๊ณผ
[Running] node "/Users/cjy/Desktop/Source/Jupyter/node/index.js"
Hello world!
[Done] exited with code=0 in 0.106 seconds
์์ ๊ฐ์ด ์คํ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ์๋ค๋ฉด ์ด์ node.js์์ javascript๋ฅผ ์ฌ์ฉํ ์ค๋น๊ฐ ๋๋ ๊ฒ์ด๋ค.
๐ npm์ด๋ ๋ฌด์์ผ๊น?
์ถ์ฒ : npm ์ฌ์ดํธ
npm์ด๋ "Node Package Manage"๋ผ๊ณ ํ๋ node ํจํค์ง ๊ด๋ฆฌ์๋ผ๊ณ ํ๋ ํ์ํ ํด์ ๋ค์ด๋ก๋ํ์ฌ ์ฌ์ฉํ ์ ์๋ ์ฌ์ดํธ์ด๋ค.
์ถ์ฒ : ๋ชจ๋ ๊ฐ์ ํต๊ณ
node์ ์ด๋ฏธ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋์ ์๋ ์์ด ๋ง์๋ฐ ์๋ ํต๊ณ๋ฅผ ๋ณด๋ฉด npm์ ๋ชจ๋ ๊ฐ์๊ฐ ์๋์ ์ผ๋ก ๋ง์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โค figlet ์ฌ์ฉํ๊ธฐ (์์ ๋ชจ๋ ํ์ต-๊ฑด๋๋ฐ์ด๋ ๋ฌด๊ด)
figlet์ ์๋์ ๊ฐ์ด ํ ์คํธ๋ฅผ ์ด์ฉํ์ฌ ๊ทธ๋ฆผ์ ํํํ๋ "์์คํค ์ํธ"๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๊ฒ ํด์ฃผ๋ ๋ชจ๋์ด๋ค. ํด๋น ์ค๋ช ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ค์นํ๋ ๋ช ๋ น์ด์ ๊ฐ๋จํ ์ฌ์ฉ ์ฝ๋๊ฐ ๋์ ์์ผ๋ ๋ฐ๋ผ ํด ๋ณด์.
์๋์ ๊ฐ์ด index.jsํ์ผ์ ์ ๋ ฅ ํ ์คํ์์ผ ๋ณด๋ฉด ๋ด๊ฐ ์ ๋ ฅํ ๋ฌธ์์ด์ ์์คํค ์ํธ๋ก ์ถ๋ ฅํด ์ฃผ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
var figlet = require('figlet');
figlet('Hello World!!', function(err, data) {
if (err) {
console.log('Something went wrong...');
console.dir(err);
return;
}
console.log(data)
});
[Running] node "/Users/cjy/Desktop/Source/Jupyter/node/index.js"
_ _ _ _ _ _ _ _ __ __ _ _ _ _
| | | | ___| | | ___ | \ | | ___ __| | ___ (_)___ \ \ / /__ _ __| | __| | | |
| |_| |/ _ \ | |/ _ \ | \| |/ _ \ / _` |/ _ \ | / __| \ \ /\ / / _ \| '__| |/ _` | | |
| _ | __/ | | (_) | | |\ | (_) | (_| | __/_ | \__ \ \ V V / (_) | | | | (_| |_|_|
|_| |_|\___|_|_|\___/ |_| \_|\___/ \__,_|\___(_)/ |___/ \_/\_/ \___/|_| |_|\__,_(_|_)
|__/
[Done] exited with code=0 in 0.145 seconds
โค ๋ค์ด๋ก๋ํ ๋ชจ๋ ์ ๋ฆฌ
์ฌ์ฉ์๊ฐ npm์ผ๋ก ๋ค์ด๋ก๋ํ ๋ชจ๋์ ์ ๋ฆฌํด ์ฃผ๋ ๋ช ๋ น์ด์ด๋ฉฐ ์๋์ ๊ฐ์ด ์ ๋ ฅํ๋ฉด package.jsonํ์ผ์ด ์์ฑ๋๋ค. ๋ํ npm install [๋ชจ๋๋ช ]์ผ๋ก ๋ชจ๋์ ์ค์นํ๊ณ ๋๋ฉด [ํ๋ก์ ํธ ํด๋๋ช ]_modules๋ผ๋ ํด๋์ package-lock.json์ด ์๋ก ์์ฑ์ด ๋๋๋ฐ package.json์ ํ์ผ์ ๊ฐ๋ตํ ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค๋ค๋ฉด package-lock.json์ ๋ค์ด๋ก๋ํ ๋ชจ๋์ ์์ธ ์ ๋ณด๊ฐ ๋ค์ด์๋ ํ์ผ์ด๋ค.
# ๋ช
๋ น์ด
npm init
// package.json
{
"name": "node",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
๐ Express๋ ๋ฌด์์ธ๊ฐ?
Node.js ๊ธฐ๋ฐ์ ์น ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด Express๋ชจ๋์ด๋ผ๊ณ ํ๋ค. ์์ ๊ฐ์ด ์ผ์ชฝ์ ์น ๋ธ๋ผ์ฐ์ ์์ ์์ฒญํ request๋ฅผ db์ ๊ทธ ์ธ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์น ํ ์น๋ธ๋ผ์ฐ์ ๋ก ์๋ต response๋ฅผ ์ฃผ๋ ์ญํ ์ ํ๋ ๊ฒ์ ์น ํ๋ ์์ํฌ์ ์ญํ ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ด๋ฐ ์ญํ ์ ํ๋ ๊ฒ์ด Express์ด๋ค.
โค express ์ฌ์ฉํ๊ธฐ
# ๋ช
๋ น์ด
npm install express
// index.js
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
์ถ์ฒ : expressjs
์์ ๊ฐ์ด express๋ฅผ ์ค์นํ ํ npm์ฌ์ดํธ์ ์ ํ์๋ ์์ ์ฝ๋๋ฅผ index.jsํ์ผ์ ๋ถ์ฌ ์ค ํ ์คํ์ ์์ผ๋ณด์. ์ฒ์์๋ ๋ฐ์์ด ์์ ๊ฒ์ด๋ค. ์ผ๋จ ์ฝ๋๋ฅผ ์ค๋ช
ํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์์ localhost:3000๋ก url์ ์
๋ ฅํ์ฌ ์ด๋ํด ๋ณด์. ๊ทธ๋ฌ๋ฉด ์๋์ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ ๊ฒ์ด๋ค.
โค require
const express = require('express')
const app = express()
์์ ๋ด์ฉ์ require์ด๋ผ๋ ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ค์นํ express๋ผ๋ ๋ชจ๋์ "express"๋ผ๋ ๋ณ์์ ํ ๋นํด ์ฃผ๋ ์ฝ๋์ด๋ค.
โค port / listen
const port = 3000
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
3000์ด๋ผ๋ ๋ฒํธ๋ก ์ ์ํ ์ ์๊ฒ ํฌํธ๋ผ๋ ๊ฒ์ ์ด์ด์ฃผ๊ธฐ ์ํด ํฌํธ๊ฐ์ ์ด์ด ์ค ๊ฒ์ด๋ค.
app.listen์ด๋ผ๋ ๊ฒ์ ํตํด ๊ทธ ์ค์ ํ ๊ฐ์ ๋ฐ์ ๊ฒ์ด๋ค. ์ด listen์ ํญ์ ์คํ๋๊ณ ์๋ ์ํ๋ผ๊ณ ์๊ฐ์ ํ์.
โค get
app.get('/', (req, res) => {
res.send('Hello World!')
})
์์๋ expressํจ์๋ฅผ ์คํํ app์ด๋ผ๋ ๊ฐ์ฒด์ get์ ์ฌ์ฉํ์๊ณ , ์ด ์์ ๋งค๊ฐ๋ณ์๋ก '/'์ (req, res) => { res.send('Hello World!') } ์ฝ๋ฐฑํจ์๋ฅผ ๋ฃ์ด ์ฃผ์๋ค.
- get (HTTP ๋ฉ์๋)
- HTTP ๋ฉ์๋๋ก์ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ฉฐ get, post, delete, put... ๋ฑ์ ๋ค์ํ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค.
- '/' (๋ผ์ฐํ )
- ์์์ ์ค๋ช ํ ์ด์ด์ค port๋ก ๋ค์ด์ค๋ ๋ค์ํ api ๊ฒฝ๋ก๋ฅผ ์๋ฏธํ๋ค.
- (req, res) => { res.send('Hello World!') } (์ฝ๋ฐฑํจ์)
- ๋๋๊ณ ์คํํ ํจ์๋ผ๊ณ ์ดํดํ์.
- ์ฝ๋ฐฑํจ์๋?
์๊น ์์์ localhost:3000์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ ๋ ฅ์ ํ์ฌ 'Hello World!'๊ฐ ๋์ค๋ ํ์ด์ง๋ก ์ด๋์ ํ ๊ฒ์ ๋ณด์๋๋ฐ ์ด์ ์์ ์ฝ๋๊ฐ ๋ธ๋ผ์ฐ์ ์ ์ด๋ ํ ์ญํ ์ ํ๋์ง ์ ์ ์์ ๊ฒ์ด๋ค.
๐ api ๋ณ๋ก ๋ถ๊ธฐํ์ฌ ๋ผ์ฐํ ์์ฑ
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.get('/dog', (req, res) => {
res.send('๋ฉ๋ฉ')
})
app.get('/cat', (req, res) => {
res.send('<h1>์ผ์น</h1>')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
์์ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์๋์ ๊ฐ์ด ๋ผ์ฐํ ์ ๋๋ ๋ณด์๋ค.
- '/'๋ก ์ ์ํ์ ๋๋ "Hello World!"
- '/dog'๋ก ์ ์ํ์ ๋๋ "๋ฉ๋ฉ"
- '/cat'๋ก ์ ์ํ์ ๋๋ "์ผ์น'"
Point!!
'/cat'๋ผ์ฐํ ์์ htmlํ์์ ๋ฌธ์์ด์ ๋ณด๋ด๋ฉด ํ๋ฉด์ h1 ํ๊ทธ๊ฐ ์ ์ฉ๋๋ฉฐ ํ๋ฉด์ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ res.send()์ html๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ฌ์ค์ ์ ์ ์๋ค.
๐ response์ ๋ณ์๋ฅผ ๋ด์ ๋ณด๋ด๊ธฐ
โค GET: params, query
์์ ๊ทธ๋ฆผ์ ๋ธ๋ผ์ฐ์ ๊ฒฝ๋ก๋ฅผ ๋ณด๋ฉด youtube.com/[์ ํ๋ธ ๊ณ์ ๋ช
์นญ]์ผ๋ก ์ฃผ์๊ฐ ์ค์ ๋์ด ์๋ค. ํ์ง๋ง ์ ํ๋ธ๋ฅผ ๊ฐ๋ฐํ ๋ ๋ชจ๋ ์ ํ๋ธ ๊ณ์ ์ ์์ ๊ฐ์ด api๋ฅผ ๋ง๋ค์ง๋ ์์์ ๊ฒ์ด๋ค. ํด๋น ๊ณ์ ์ ์ ์ํ๋ ์ด๋ฒคํธ๊ฐ ์ด๋ฃจ์ด์ก์ ๋ ํด๋นํ๋ ๊ณ์ ๋ช
์นญ์ id๊ฐ์ด ๋ผ์ฐํ
์ param์ผ๋ก ๋ณด๋ด์ก๊ณ ๋์ผํ api๋ก ๋ค์ด์ param๊ฐ์ผ๋ก ์กฐํ๋๋ ๋ก์ง์ ๋ถ๊ธฐ์ฒ๋ฆฌํ์ ๊ฑฐ๋ผ๊ณ ์์ํ๋ค
๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ url์ param์ผ๋ก id๋ฅผ ๋ณด๋ด๊ณ param๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ api ๋ผ์ฐํ
์ ์์ฑํด ๋ณด์.
โค param
const express = require('express')
const app = express()
const port = 3000
app.get('/user/:id', (req, res) => {
const param = req.params
console.log(param)
console.log(param.id)
res.json({'animal': param.id})
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
์์ ๋ก์ง์ '/user/:id'์ ๊ฐ์ด ๋ผ์ฐํ ์ ์ค์ ํ์ฌ [id]์ ๋ํ param ๋ฐ์ ์ ์๊ฒ ์์ฑํ์๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ์ param์ ํ๋ฉด์ ์ถ๋ ฅ๋๊ฒ param.id๋ก param์ ๋ด๊ฒจ์๋ id ๊ฐ์ ๊บผ๋ด์ jsonํ์์ผ๋ก response์ ๋ณด๋ด์ฃผ์๋ค.
# ๋ธ๋ผ์ฐ์ ์ฃผ์
http://localhost:3000/user/๊ณ ์์ด
์ ๊ฐ์ด ๋ธ๋ผ์ฐ์ ์ ์ฃผ์๊ฐ์ ์ ๋ ฅํ๋ฉด ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. /user/:id ๋ค์ ๋ถ์ id๋ผ๋ param๊ฐ์ด api๋ฅผ ๊ฑฐ์ณ์ ์ถ๋ ฅ๋๊ฒ ๊ตฌํํ ๊ฒ์ด๋ค. ๋ฌผ๋ก ํด๋น api์์ db์ฒ๋ฆฌ๊ฐ ๋์ง ์์ง๋ง param์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅด๊ฒ ๊ตฌํ์ด ๋๋ ๊ฒ์ ํ์ธํ์๋ค.
# ๊ฒฐ๊ณผ
{"animal":"๊ณ ์์ด"}
โค query
์์์๋ param์ ์ด์ฉํด์ ๋ผ์ฐํ ์ ์ด์ฉํ๋ค๋ฉด ์ด๋ฒ์๋ query๋ฅผ ์ด์ฉํ์ฌ request๋ก ์์ฒญํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํด ๋ณด๊ฒ ๋ค.
const express = require('express')
const app = express()
const port = 3000
app.get('/user/query', (req, res) => {
const query = req.query
console.log(query)
res.json(query)
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
์์ ๊ฐ์ด ๋ณด๋ผ ๋๋ง๋ค param๊ฐ์ด ๋ณํ๋ ๊ฒ ์๋๋ผ query๋ฅผ ํตํด์ ๊ฒฐ๊ด๊ฐ์ ๋ค๋ฅด๊ฒ ์ถ๋ ฅ์ ํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์๋ค.
http://localhost:3000/user/query?name=Lagom&age=31&addr=Seoul
์์ ๊ฐ์ด /user/query๋ก ๋ผ์ฐํ ์ ์ค์ ํ๊ณ ๋ค์? name=Lagom&age=31&addr=Seoul์ผ๋ก ์ฟผ๋ฆฌ๋ฅผ ์ค์ ํ์ฌ ๋ณด๋ด๊ฒ ๋๋ฉด ํ๋ฉด์๋ ์๋์ ๊ฐ์ด url๋ก ๋ณด๋ธ query๊ฐ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
{"name":"Lagom","age":"31","addr":"Seoul"}
๐ name์ ๋ฐ๋ผ ๋ค๋ฅธ sound๊ฐ์ ์ถ๋ ฅํ๊ธฐ
โค GET /sound/:name
์ด์ ์๋ ์ด๋ ฅ ํ url์ param๊ฐ, ์ฆ id๊ฐ์ ๋ค๋ฅด๊ฒ ์ ๋ ฅํ๋ฉด ์ ๋ ฅํ id๊ฐ์ด ์ถ๋ ฅ๋๊ฒ ๊ตฌํ์ ํ์๋ค. ์ด๋ฒ์๋ ์ ๋ฌ๋ฐ์ param๊ฐ์ ๋ฐ๋ผ ์ถ๋ ฅ๋๋ ๊ฐ์ param๊ฐ์ด ์๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณด์ด๊ฒ ์ฝ๋๋ฅผ ๊ตฌํํด ๋ณด๊ฒ ๋ค.
const express = require('express')
const app = express()
const port = 3000
app.get('/sound/:name', (req, res) => {
const { name } = req.params
if(name == 'dog') {
res.json('๋ฉ๋ฉ')
}else if(name == 'cat') {
res.json('์ผ์น')
}else if(name == 'pig') {
res.json('๊ฟ๊ฟ')
}else{
res.json('์์ ์์!!')
}
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
์์ ๊ฐ์ด ์ ๋ฌ๋ฐ์ param์ ๋ํ name๊ฐ์ ๋ณ์๋ก ํ ๋นํ์ฌ ๋ณ์๋ก dog, cat, pig, ๊ทธ ์ธ๋ก ํ์ฌ ๋ถ๊ธฐ๋ฅผ ๊ฑธ์ด ๊ฒฐ๊ด๊ฐ์ ๋ค๋ฅด๊ฒ ์ถ๋ ฅํ๊ฒ ๊ตฌํํ์๋ค.
http://localhost:3000/sound/dog
http://localhost:3000/sound/cat
http://localhost:3000/sound/pig
http://localhost:3000/sound/๋
์์ ๊ฐ์ด ๊ฐ๊ฐ ๋ค๋ฅธ url์ ๋ธ๋ผ์ฐ์ ์ ์ ๋ ฅํ๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ด ํด๋นํ๋ ๋๋ฌผ์ ๋ํ ์ธ์์๋ฆฌ๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
"๋ฉ๋ฉ"
"์ผ์น"
"๊ฟ๊ฟ"
"์์์์!!"
๐ CORS์ด์
HTMLํ์ผ์์ node.js ๋๋ ๋ค๋ฅธ ์๋ฒ์ request๋ฅผ ์์ฒญ์ ๋ณด๋์ ๋ ์๋ฒ์์๋ ์ด์ํ ๊ณณ ๋๋ ์ํํ ์์ฒญ์ด ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฒญ์ ๋ง๊ฒ ๋์ด ์๋ค. ๊ทธ๋์ HTML๋ก ์์ฒญ์ ํ ๋ CORS์ค์ ์ด ์์ผ๋ฉด ์ฐจ๋จ์ด ๋๋ค. ์ด๊ฒ์ django์์ staticํ์ผ์ s3๋ก storages๋ฅผ ์ฐ๊ฒฐํ ๋๋ ๋ฐ์ํ๋ ์ด์์ด๋ค. ์ด ์ด์์ฌํญ์ ๋ํ ๊ฒ์ ํ๋ก์ ํธ ์ด์์ฌํญ์ ์ ๋ฆฌํ ๋ ๋ค์ ๋ค๋ค ๋ณด๊ฒ ๋ค.
๐ ํ๋ฐํธ ์๋ CORS ์ฐ๊ฒฐ
โค COSR ๋ชจ๋ ์ค์น ๋ฐ ์ฐ๊ฒฐ
# ๋ช
๋ น์ด
npm install cors
const express = require('express')
const cors = require('cors')
const app = express()
const port = 3000
app.use(cors())
์์ ๊ฐ์ด require('cors')๋ก ๋ณ์๋ฅผ ํ ๋นํ ์ app.user(cors())๋ก ํ์ฌ cors์ฐ๊ฒฐ์ ํด๊ฒฐํ ์ ์๊ฒ ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
โค HTML request์์ฒญ ํ๋ฉด ๊ตฌํ
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>cors ์ด์ ํด๊ฒฐ</title>
</head>
<body>
<input type="text" id="name">
<button onclick="getSound()">API ์์ฒญ</button>
<script>
function getSound() {
const name = document.getElementById('name').value
fetch(`http://localhost:3000/sound/${name}`)
.then(response => response.json())
.then(data => {
console.log(data)
document.getElementById('name').value = data
})
}
</script>
</body>
</html>
์์ ๊ฐ์ด input๋ฐ์ค์ dog, cat, pig๊ฐ์ ์ ๋ ฅํ์ ๋ ์๊น ์์์ ์์ฑํ ์๋ฒ api๋ก fetchํจ์๋ฅผ ํตํด ์์ฒญ์ ๋ณด๋ด๊ฒ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค. dog, cat, pig๊ฐ์ ๋ฐ๋ผ ๋์ค๋ ์ธ์์๋ฆฌ๊ฐ ๋ค์ input๋ฐ์ค์ ๊ฐ์ด ์ ๋ ฅ๋๊ฒ ๊ตฌํํด ๋ณด์๋ค.
์์ ๊ฐ์ด cat์ ์
๋ ฅํ ํ API ์์ฒญ ๋ฒํผ์ ๋๋ฅด๋ฉด ๊ตฌํํ๋ ๋ผ์ฐํ
์ ๋ํ api ์๋ฒ๋จ์ ๊ฑฐ์ณ์ ์ผ์น ๊ฐ์ ๋ฐ์ input์ ๋๋ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค๋ฅธ HTML์์ ์์ฒญ์ ๋ณด๋ด๋ CORS์ด์๊ฐ ๋ฐ์๋์ง ์๋ ๊ฒ์ ํ์ธํ์๋ค.
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค