๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Frontend Dev/๐Ÿฅ ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE ๋ถ€ํŠธ์บ ํ”„

Section2 Unit10 [Web Server] ๊ธฐ์ดˆ - Refactor Express

๋ฐ˜์‘ํ˜•

 

Section2 Unit10 [Web Server] ๊ธฐ์ดˆ - Refactor Express

 

๐Ÿ“Œ Chapter2. Refactor Express

โญ๏ธ ๊ณผ์ œ. Mini-Node Server๋ฅผ Express๋กœ ๋ฆฌํŒฉํ† ๋ง

 

๊ตฌํ˜„๊ณผ์ •

๐Ÿ’ก TIP. ํฌ์ŠคํŠธ๋งจ์„ ํ™œ์šฉํ•ด์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1. express ๋ชจ๋“ˆ ํ•™์Šต 

 ์–ด์ œ node.js ๋ง› ์ข€ ๋ณด๊ณ , ํ•˜๋ฃจ๋งŒ์— express๋กœ ๋„˜์–ด์™”๋‹ค… ์—ฌ์ „ํžˆ ๋ชจ๋ฅด๋Š”๊ฑฐ ํˆฌ์„ฑ์ด์— ๊ฐ๋„ ์•ˆ์žกํ˜€์„œ express๋„ node.js ์ฐ๋จนํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„๋งŒ ๋จผ์ € ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

 express๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ node.js๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„๋“ค์ด ํ›จ์”ฌ ํŽธํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜๋Š” ๊ฒƒ๋“ค์ด ๋ณด์˜€๋‹ค. express๊ฐ€ ํŽธํ•˜๋‹ค๋”๋‹ˆ, ์™œ ๊ทธ๋Ÿฐ์ง€ ์•Œ ๊ฒƒ ๊ฐ™์€ ๋Š๋‚Œ์— ๊ธฐ๋ถ„์ด ์•ฝ๊ฐ„ ์ข‹์•„์ง€๊ธฐ๋Š” ํ–ˆ์—ˆ๋‹ค ๐Ÿ˜‚

 ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„๋“ค์ด๋‚˜, ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•˜๋˜ ๋ถ€๋ถ„๋“ค์„ ์ด๋ฒˆ์—๋Š” ํŽ˜์–ด ํ™œ๋™์„ ํ•˜๋ฉฐ ๋„์›€์„ ๋งŽ์ด ๋ฐ›์•˜์—ˆ๋‹ค. ์–ด์ œ๋Š” ๋‚ด๊ฐ€ ๋ฏธ๋ฆฌ ๊ณผ์ œ๋ฅผ ํ•ด์„œ ๋„ค๋น„๊ฒŒ์ดํ„ฐ ์—ญํ• ์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ์˜ค๋Š˜์€ ํŽ˜์–ด๋ถ„์ด ๋จผ์ € ๊ณผ์ œ๋ฅผ ํ•˜์…”์„œ ๋„ค์ด๊ฒŒ์ดํ„ฐ ์—ญํ• ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป express ๋ชจ๋“ˆ๋กœ ์„œ๋ฒ„ ๋งŒ๋“ค๊ธฐ

// express ๋ชจ๋“ˆ ์‚ฌ์šฉ
const express = require('express');
const app = express();
const port = 3000;

/*
  body-parser: ์š”์ฒญ์˜ ๋ณธ๋ฌธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์„ํ•ด์„œ req.body ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ฏธ๋“ค์›จ์–ด
  ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ์ฝ”๋“œ๋งˆ๋‹ค json parser๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
  strict: false primitive data type๋„ parsing ํ•˜๋„๋ก ์„ค์ •
*/
app.use(express.json({ strict: false }));

// ๋ชจ๋“  ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰
app.use((req, res, next) => {
  console.log("-------------------------------------------");
  console.log(`HTTP METHOD: ${req.method}, URL: ${req.url}`);
  console.log("-------------------------------------------");
  next(); // next: ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๋กœ ๋„˜์–ด๊ฐ€๋Š” ํ•จ์ˆ˜๋กœ next๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. 
})

// GET '/' ์š”์ฒญ์— 'Hello World'๋กœ ์‘๋‹ต
// (๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„œ๋Š” 404 Not Found๋กœ ์‘๋‹ต)
app.get('/', (req, res) => {
  res.send('Hello World');
});

// users๋กœ POST ์š”์ฒญ์ด ์˜ค๋ฉด jsonParser๋ฅผ ํ•˜๊ณ , ๋‚ด์šฉ์„ ์‹คํ–‰ํ•˜๋ผ.
app.post('/users', (req, res) => {
  console.log(req.body)
  res.send(req.body)
})

// ์„œ๋ฒ„ ์—ฐ๊ฒฐ
app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

 

2. express-server๋กœ ๋ฆฌํŒฉํ† ๋ง

const express = require('express');
const app = express();
const port = 4999;
const cors = require('cors');

app.use(cors()); // ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด CORS ํ—ˆ์šฉ
app.use(express.json({ strict: false }));

// GET
app.get('/', (req, res) => {
  console.log("GET");
  res.send("GET ์š”์ฒญ์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.");
})

// POST
app.post('/upper', (req, res) => {
  console.log("REQUEST", req )
  res.status(201).json(req.body.toUpperCase()); // res.json : sendํ•  ๋•Œ jsonํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ธ๋‹ค. 
  console.log("UPPER REQUEST BODY: ", req.body)
})

app.post('/lower', (req, res) => {
  res.status(201).json(req.body.toLowerCase());
  console.log("LOWER REQUEST BODY: ", req.body)
})

// ERROR
app.use((err, req, res, next) => {
  console.error(err)
  res.status(400).send(err.message);
})

app.listen(port, () => {
  console.log(`PORT ${port}`)
})

 

3. Postman ํ™œ์šฉํ•ด์„œ GET, POST ๋ฉ”์„œ๋“œ ํ™•์ธ

 

โœจ ๋ชจ๋“  ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด ์‹คํ–‰ ์˜ˆ์ œ & Error ์ถœ๋ ฅ

 → express์˜ ๋ฏธ๋“ค์›จ์–ด ํ•™์Šต : ๋ชจ๋“  ์š”์ฒญ์—์„œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 ๋ฏธ๋“ค์›จ์–ด๋Š” app.use์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜๊ณ , ์ฃผ์†Œ๋ฅผ ์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ชจ๋“  ์š”์ฒญ์—์„œ ํ—ˆ์šฉ๋œ๋‹ค.

 → GET ์š”์ฒญ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด์„œ๋Š” 404 Error๊ฐ€ ์ถœ๋ ฅ๋˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค. ์—๋Ÿฌ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฑธ ๋ณด๊ณ  ์‹ถ์–ด์„œ ๊ทธ ์˜ˆ์‹œ๋„ ์‹คํ–‰์‹œ์ผœ ๋ณด์•˜๋‹ค.

 

โœจ postman์œผ๋กœ POST 

 → postman์œผ๋กœ POST์š”์ฒญ์„ ๋ณด๋‚ด๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค. JSON ํ˜•ํƒœ๋กœ ๋„ฃ๋Š” ๊ฑด์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ž‘๋™์ด ๋˜์ง€ ์•Š์•„์„œ ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ์š”์ฒญ์˜ request๋ฅผ ๋ฐ›์•„๋ณด๋‹ˆ body๊ฐ€ “text”ํ˜•ํƒœ๋กœ ์ถœ๋ ฅ์ด ๋˜์–ด ์žˆ์—ˆ๋‹ค.

 → ๊ฒฐ๋ก ์€ postman์œผ๋กœ POST ์š”์ฒญ์‹œ body์— JSON ํ˜•ํƒœ๋กœ ๋„ฃ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, text๋กœ ๋„ฃ์–ด์ค˜์•ผ POST๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๋‚ด๋ถ€ ๋กœ์ง์—์„œ ๊ทธ๋ ‡๊ฒŒ ์ฒ˜๋ฆฌํ•œ ๊ฒƒ ๊ฐ™๊ธฐ๋Š” ํ•œ๋ฐ, ์•„์ง ์ •ํ™•ํ•œ ์ด์œ ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๊ณ  ์ถ”์ธกํ•  ๋ฟ…

 


๐ŸŒ™  ์˜ค๋Š˜์˜ ํšŒ๊ณ 

 ์–ด์ œ node.js๋กœ ๋งŒ๋“ค์—ˆ๋˜ ์›น์„œ๋ฒ„๋ฅผ express๋กœ ๋ฐ”๊พธ๋Š” ์‹ค์Šต์„ ํ–ˆ๋‹ค. express๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ํ›จ์”ฌ ํŽธ๋ฆฌํ•ด์„œ node๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค express๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์•„์ฃผ ์ผ๋ถ€๋ถ„์ด์—ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๊ฒฝํ—˜์„ ํ•ด๋ณด๋‹ˆ express์˜ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ์ข‹์€๊ฒƒ์ด ๋ณด์—ฌ์„œ ์‹ ๊ธฐํ–ˆ๋‹ค.

 ์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋Š˜ ํŽ˜์–ด์‹œ๊ฐ„์— ํŽ˜์–ด๋ถ„๊ณผ ๊ฐ™์ด ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , ๊ณผ์ œ ๋‚ด App.js ํŒŒ์ผ์˜ ๋กœ์ง๋„ ์‚ดํŽด๋ณด์•˜๋‹ค. ํ•จ๊ป˜ ํ† ๋ก (?)์„ ํ•˜๊ณ , ๊ณต๋ถ€๋ฅผ ํ•˜๋ฉด์„œ ๋‚ด๊ฐ€ ํ—ท๊ฐˆ๋ ธ๋˜ ๋ถ€๋ถ„๋“ค์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ๋ชจ๋ฅด๋Š” ๋ถ€๋ถ„์„ ๊ฐ™์ด ์ฐพ์•„๋ณด๊ณ , ์•Œ๋ ค์ฃผ๋Š” ์„ค๋ช…์„ ๋“ฃ๋‹ค๋ณด๋‹ˆ ํ™•์‹คํžˆ ๊ธฐ์–ต์— ์˜ค๋ž˜ ๋‚จ๊ณ  ์ดํ•ด๋„ ์ž˜ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์ด๋ฒˆ ํŽ˜์–ด ํ™œ๋™์€ ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›์€ ๊ฒƒ ๊ฐ™์•„ ์˜๋ฏธ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค.

 ๊ทธ๋ž˜๋„ ์—ฌ์ „ํžˆ ์–ด๋ ต๊ณ , ํ—ท๊ฐˆ๋ ค์„œ ๊ณ ๋ฏผ์„ ํ•˜๋‹ค๊ฐ€ node.js + express ๋ฅผ ํ›‘์–ด๋ณด๋Š” ๊ฐ•์˜๋ฅผ ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค. ํ”„๋ก ํŠธ๋ฅผ ํ•ด๋„ ๊ฐ„๋‹จํ•œ ์›น์„œ๋ฒ„ ๊ตฌํ˜„์ •๋„๋Š” ํ• ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋‹ˆ ์ด ๊ธฐํšŒ์— ๋ฐฐ์›Œ๋‘๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์‹œ๊ฐ„์ด ์—†์œผ๋‹ˆ ์ „์ฒด์ ์ธ ํ‹€๊ณผ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ๋ณด๋Š” ๊ฒƒ ์œ„์ฃผ๋กœ ํ•™์Šตํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

 ์ด๋ฒˆ ์ฃผ๋ง๋„ ๊ณต๋ถ€๋กœ ๋ฐ”์˜๊ฒ ๋‹ค… ๐Ÿซ 

๋ฐ˜์‘ํ˜•