[ Node.js ์ž…๋ฌธ์ฃผ์ฐจ1 (1-12)] Express.js ํ”„๋ ˆ์ž„์›Œํฌ

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 ๋ช…๋ น ์‹คํ–‰์‹œ ์›๋ž˜๋Š” ํ”„๋กœ์ ํŠธ๋ช…์ด๋‚˜ ๋ฒ„์ „ ๋“ฑ์„ ๋ฌผ์–ด๋ณด๋Š”๋ฐ
// ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ๋ฌผ์–ด๋ณด์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์•Œ์•„์„œ ๋ฐ”๋กœ ์„ค์ •ํ•ด์ฃผ๋Š” ์˜ต์…˜! ๋ฐ”๋กœ ์ƒ์„ฑ๋จ.

(์˜ค๋ฅธ์ชฝ)  ์ƒ์„ฑ๋œ package.json ํŒŒ์ผ์„ ๋ณด๋ฉด,  ์„ค์ •ํ•œ name ‘spa-shop’ ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ์ ์ธ index.js๋กœ ์•คํŠธ๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์œผ๋กœ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. 

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

์™ผ์ชฝ) ์ƒ๋‹จ ์ฝ”๋“œ์Šค๋‹ˆํŽซ ์ž…๋ ฅ ํ›„ ํ„ฐ๋ฏธ๋„์— node app.js ์ž…๋ ฅ ์˜ค๋ฅธ์ชฝ) localhost:3000 ์ ‘์†์‹œ "hello world"์ถœ๋ ฅ๋จ

"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