2023. 8. 26. 13:33ใ3. Node.js
1. Express.js์ ์ดํด
Express.js๋ Node.js๋ก ์๋ฒ๋ฅผ ๋น ๋ฅด๊ณ ๊ฐํธํ๊ฒ ๋ง๋ค ์ ์๊ฒ ๋์์ฃผ๋ ๊ฐ์ฅ ๋ํ์ ์ธ ์น ํ๋ ์์ํฌ.
์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ค์ ํจ์จ์ ์ด๊ณ ๋น ๋ฅด๊ฒ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํ ์ ์๋ค.
Express - Node.js web application framework
Fast, unopinionated, minimalist web framework for Node.js $ npm install express --save
expressjs.com
Express.js์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ ๋ฏธ๋ค์จ์ด(Middleware)๋ฅผ ์ง์ํ๋ค. ๋ฏธ๋ค์จ์ด๋ ์ฌ์ฉ์์ ์์ฒญ๊ณผ ์๋ต ์ฌ์ด์ ์์นํ๋ฉฐ, ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ํจ์๋ก ์๊ฐํ ์ ์๋ค.
- Express.js์ ์น ์๋ฒ(Web Server)๋ ๋์ผํ์ง ์๋ค.
- Express.js๋ ์น์๋ฒ ์์ฒด๊ฐ ์๋๋ผ, ์น ์๋ฒ๋ฅผ ๊ตฌํํ๋๋ฐ ๋์์ ์ฃผ๋ ๋๊ตฌ์ ๋๋ค. ์ฆ, Node.js๋ฅผ ์ํ ์น ํ๋ ์์ํฌ!
2. Express.js๋ก ๋ฐฑ์๋ ์๋ฒ ๊ตฌํ
[ ์ ํ๋ก์ ํธ ์ค์ ]
1) VS Code๋ฅผ ์คํ.
2) ์๋จ ๋ฉ๋ด์ File → Open
3) ์๋ก์ด ํด๋ ๋ฒํผ์ ๋๋ฅด๊ณ ์ ํด๋๋ฅผ ์์ฑ (spa-shop)
4) ์๋ก ๋ง๋ค์ด์ง ํด๋๋ฅผ ํด๋ฆญํ๊ณ ์ด๊ธฐ.
5) ๊ทธ๋ฆฌ๊ณ ์์ ๋ฉ๋ด์์ ์ ํฐ๋ฏธ๋์ ํด๋ฆญ.

6) ํฐ๋ฏธ๋์ด ์ด๋ฆฌ๋ฉด ํฐ๋ฏธ๋์ ์๋์ ๊ฐ์ด ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ package.json์ ์์ฑํ๋ค.
yarn init -y
// ๋ค์ -y๋ yarn init ๋ช
๋ น ์คํ์ ์๋๋ ํ๋ก์ ํธ๋ช
์ด๋ ๋ฒ์ ๋ฑ์ ๋ฌผ์ด๋ณด๋๋ฐ
// ๊ทธ๋ฐ ๊ฒ๋ค์ ๋ฌผ์ด๋ณด์ง ์๊ณ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์์์ ๋ฐ๋ก ์ค์ ํด์ฃผ๋ ์ต์
! ๋ฐ๋ก ์์ฑ๋จ.


7) spa-shop ํด๋ ์์ app.js๋ผ๋ ํ์ผ์ ์๋์ ๊ฐ์ด ๋ง๋ ๋ค.
[ package.json ๋ชจ๋ ๋ณ๊ฒฝํ๊ธฐ ] : ES6 ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ ์ํด package.json ์ ์๋์ ๊ฐ์ด ์์ ํด์ผ ํ๋ค.
{
"name": "spa-shop",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"type": "module" //** type์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
}
[Express.js ์ค์น] : ํฐ๋ฏธ๋๋ก ๋์๊ฐ ์ด๋ฒ์๋ Express.js ํ๋ ์์ํฌ๋ฅผ ์ค์นํ๋ค.
yarn add express
// ** ์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด ์ด์ ์น์๋ฒ๋ฅผ ์์ฑํ ์ค๋น๊ฐ ์๋ฃ๋จ! ** //

[ ๊ธฐ๋ณธ์ ์ธ ๋ฐฑ์๋ ์๋ฒ ์ฝ๋ ์์ฑ] : spa-shop ํด๋ ์์ app.js๋ผ๋ ํ์ผ์ ์์ฑํ๋ค.
- package.json ํ์ผ์ ๋ค์ ์ด์ด๋ดค์ ๋ express ๊ด๋ จ๋ ๋ด์ฉ์ด ๋ค์ด์์ผ๋ฉด ์ ์์ ์ผ๋ก ์ค์น๊ฐ ๋์๋ค.
- yarn.lock์ ์ด๋ค ํจํค์ง๋ค์ด ์ด๋ค ๋ฒ์ ์ผ๋ก ์ค์น๋์๋์ง ๊ธฐ๋กํด ๋์ ํ์ผ์ด๋ค.
๋์ค์ ์ด ํ์ผ์ด ์์ผ๋ฉด ๋ค๋ฅธ ๋๋ฃ๋ค๊ณผ ํ์ ํ ๋ ๊ฐ์ ํ๊ฒฝ์ผ๋ก ๊ฐ๋ฐํ ์ ์๊ฒ ๋์์ค๋ค.
- node_modules ํด๋๋ yarn์ ํตํด ์ค์น๋ ํจํค์ง๋ค์ ๋ํ ํ์ผ์ด ์๋ ํด๋๋ก, ์์ผ๋ก ๊ฐ๋ฐ์ ํ๋ฉด์ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ํ ๋ฐ ์ด์ ๋ํ ๋ชจ๋ ํ์ผ์ด ์ฌ๊ธฐ์ ์ค์น๋๋ค.
// app.js
import express from 'express';
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(PORT, () => {
console.log(PORT, 'ํฌํธ๋ก ์๋ฒ๊ฐ ์ด๋ ธ์ด์!');
});
[ ๋ด๊ฐ ๋ง๋ ์๋ฒ ์คํ ] : app.js๋ฅผ ์คํํ๊ธฐ ์ํด์๋ spa-shop์ ๊ฒฝ๋ก์์ ์๋์ ๊ฐ์ด ์คํํ๋ค.
node app.js


"3000 ํฌํธ๋ก ์๋ฒ๊ฐ ์ด๋ ธ์ด์!” ๋ผ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋์๋ค๋ฉด ์ ์์ ์ผ๋ก ์๋ฒ๊ฐ ์คํ๋ ๊ฒ์ด๋ค.
* ๋ง์ฝ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์์ด ๋๋ค๋ฉด?
Error: listen EADDRINUSE: address already in use :::3000
at Server.setupListenHandle [as _listen2] (net.js:1318:16)
at listenInCluster (net.js:1366:12)
at Server.listen (net.js:1452:7)
// ํน์ ์์๊ฐ์ ์๋ฌ๊ฐ ๋์ค๋์? ์ด๋ฏธ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด ํด๋น ํฌํธ๋ฅผ ์ฌ์ฉ์ค์ผ ์ ์์ด์.
// app.js ํ์ผ์์ 3000 ์ด๋ผ๊ณ ์จ์ ธ์๋ port๋ฅผ 4000์ด๋ ๋ค๋ฅธ ์ซ์๋ก ๋ณ๊ฒฝํด์ ๋ค์ ํด๋ด
์๋ค.
* ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ํฌํธ๋ฅผ ์ฐพ์์ ์ข ๋ฃํ๊ณ ์ถ๋ค๋ฉด?
MAC
ํฐ๋ฏธ๋์ ์ด๊ณ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด์, ์ฐ๋ฆฌ๊ฐ ์ํ๋ ํฌํธ ์ ๋ณด๋ฅผ ์ฐพ๋๋ค.
์๋ฅผ ๋ค์ด์ 3000๋ฒ ํฌํธ๋ฅผ ์ ์ ํ๊ณ ์๋ ํ๋ก์ธ์ค์ ๋ํ ์ ๋ณด๋ฅผ ์ฐพ๊ณ ์ถ๋ค๋ฉด
lsof -i :3000 ์ด๋ผ๊ณ ์ ๋ ฅํ์ฌ ์ฐพ๊ณ , 'kill - 9 < ํฌํธ๋ฅผ ์ ์ ํ๊ณ ์๋ PID>' ๋ฅผ ํตํด ์ข ๋ฃ์์ผ ์ค๋ค.
lsof -i :<์ํ๋ํฌํธ>
kill -9 <ํฌํธ๋ฅผ ์ ์ ํ๊ณ ์๋ PID>
Linux์์ ์ ๊ณตํ๋ killall์ด๋ผ๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ, ํน์ ํ๋ก์ธ์ค ๋ช ์ ๊ฐ์ง๊ณ ์๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ์ ์๋ค.
๋ง์ฝ, 3000 ํฌํธ๋ฟ๋ง ์๋๋ผ, ๋ชจ๋ Node.js ์๋ฒ๋ฅผ ์ข ๋ฃํ๊ณ ์ถ์ ๋ ์๋์ ๊ฐ์ด ์ ๋ ฅํ๋ฉด ๋๋ค.
# ๋ชจ๋ node ํ๋ก์ธ์ค ๋ช
์ ์ข
๋ฃํฉ๋๋ค.
killall node
Windows
// ** ํฌํธ ์ ๋ณด๋ฅผ ์ฐพ๊ธฐ ** //
netstat -ano | find <"์ํ๋ํฌํธ">
// ** ํด๋น ํฌํธ๋ฅผ ์ ์ ํ๊ณ ์๋ PID๋ฅผ ์ฐพ์์ ์ข
๋ฃ ** //
taskkill /f /pid 12952

'3. Node.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [ Node.js ์๋ จ์ฃผ์ฐจ1 (1-1)] ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค (RDB) (3) | 2023.09.01 |
|---|---|
| [ Node.js ์ ๋ฌธ์ฃผ์ฐจ2 (2-0)] ์ ํจ์ฑ ๊ฒ์ฌ๊ฐ ๊ฐ๋ฅํ joi (0) | 2023.08.31 |
| [ Node.js ์ ๋ฌธ์ฃผ์ฐจ2 (2-0)] REST API, RESTful (0) | 2023.08.27 |
| [ Node.js ์ ๋ฌธ์ฃผ์ฐจ2 (2-0)] Express ๋ฏธ๋ค์จ์ด (0) | 2023.08.27 |
| [ Node.js ์ ๋ฌธ์ฃผ์ฐจ1 (1-3)] ์น๊ณผ HTTP์ ๋์ ๋ฐฉ์ (0) | 2023.08.25 |