Session 18. Express

๊น€๋ฏผ์žฌยท2021๋…„ 9์›” 13์ผ
0

TIL, WeCode, Courseย 

๋ชฉ๋ก ๋ณด๊ธฐ
35/48
post-thumbnail

*๐Ÿ”Study Keyword :

โœ…Node.js์˜ ๐Ÿ”‘Expressํ”„๋ ˆ์ž„ ์›Œํฌ๋ฅผ ์จ๋ณด๋ฉฐ http์™€ ๋ฌด์—‡์ด ๋‹ค๋ฅธ์ง€ ์–ด๋–ค ์žฅ์ ์ด์žˆ๋Š”์ง€ ์ง์ ‘ ๋Š๊ปด๋ณด์ž.

Node.js

  • Node.js๋Š” ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ์ด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ํƒ„์ƒํ–ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์—์„œ๋งŒ ์“ฐ๊ธฐ๋ณด๋‹จ ํ„ฐ๋ฏธ๋„(๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ), ์„œ๋ฒ„ ์ƒ์—์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ๋งŒ๋“  ์–ธ์–ด๊ฐ€ ๋ฐ”๋กœNode.js์ด๋‹ค.

๐ŸŒ“ ) ๋…ธ๋“œ์˜ ์žฅ ๋‹จ์ ?!

  • ๋…ธ๋“œ์˜ ๋‹จ์ ์ด๋ผ๋ฉด ๋ชจ๋“  ์ดˆ๊ธฐ ์„ค์ •์„ ์ผ์ผ์ด ํ•ด์ค˜์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ดˆ๊ธฐ์— node.js ์„ค์น˜ ๋’ค npm init๋ฅผ ํ•ด์ค˜์•ผ node-modules๊ณผ package.json์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฐ˜๋ฉด ์žฅ์ ์€ ์ด๋Ÿฌํ•œ Node.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด 1> ์ž์œ ๋„๊ฐ€ ๋†’๊ณ  2> ๋ฌดํ•œํ•œ ํ™•์žฅ ๊ฐ€๋Šฅ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”๋ฐ Server-side Framework๋“ค์ด ๋‹ค์–‘ํ•˜๊ฒŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋…ธ๋“œ ๊ฐœ๋ฐœ์ž๋Š” npm์— ๋“ฑ๋ก ๋˜์–ด์žˆ๋Š” ๋…ธ๋“œ ํŒจํ‚ค์ง€(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ)์— ๋Œ€ํ•œ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์–ด์•ผ ํ•˜๊ณ  ํ˜„์—…์—์„œ ์–ด๋–ค ํŒจํ‚ค์ง€๋“ค์ด ํ™œ๋ฐœํžˆ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๊ทธ๋ฆฌ๊ณ  ์™œ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๊ด€์‹ฌ์„ ๊ธฐ์šธ์—ฌ์•ผํ•œ๋‹ค.

- Express

  • Express๋Š” Node.js์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ Node.js๊ฐ€ ์›น์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ๋•Œ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค€๋‹ค.
  • Express๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด 1> Node.js์˜ ๋‚ด์žฅ๋ชจ๋“ˆ์ธ http๋ฅผ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ  http ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
    2> ๋ฐ˜๋ฉด ๋…ธ๋“œ ๊ธฐ๋ฐ˜ JavaScript ํŒจํ‚ค์ง€์ธ 2> Express ์‚ฌ์šฉํ•˜๋ฉด ๋ณด๋‹ค ํŽธ๋ฆฌํ•˜๊ฒŒ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

1> Node.js ๋‚ด์žฅ ๋ชจ๋“ˆ http๋กœ ์„œ๋ฒ„ ์ƒ์„ฑ

<script>
const http = require("http"); // 1๋ฒˆ
const server = http.createServer((request, response) => {
  // 2
  console.log("request is received");
  response.setHeader("Content-Types", "application/json"); // 3
  response.end( // 4
    JSON.stringify({ 
      message: `this is minjae's first server`,
    })
  );
});
server.listen(8000, () => { // 5 
  console.log("server is listening on PORT 8000");
});
</script>  
  • 1๋ฒˆ> require์€ Node.js์˜ http ๋‚ด์žฅ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์™€ importํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.
    import ๋ฌธ๋ฒ•์€ Bable์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ธฐ์— Node์—์„œ๋Š” ์ž๋™์œผ๋กœ import ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—(์ดˆ๊ธฐ ์„ธํŒ…์— ์„ค์น˜๋˜์–ด์žˆ์ง€ ์•Š๊ธฐ์—) require ๋ฌธ๋ฒ•์œผ๋กœ ๋ถˆ๋Ÿฌ์™€์•ผํ•œ๋‹ค.
  • 2๋ฒˆ> http์˜ ํ•ต์‹ฌ์€ ์š”์ฒญ๊ณผ ์‘๋‹ต์ด๋‹ค. ์ฆ‰, http์˜ createServer ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด HTTP ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๋ฉฐ createServer ๋ฉ”์„œ๋“œ์˜ ์ธ์ž๋กœ์„œ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ๋ฐ›๋Š”๋‹ค.
  • 3๋ฒˆ> ์„œ๋ฒ„๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์˜ ํ—ค๋”๋ฅผ response์˜ setHeader ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ 
  • 4>๋ฒˆ end ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์— ํ•ด๋‹น๋˜๋Š” ๊ฐ’์„ ๋„˜๊ธฐ๋Š”๋ฐ JSON.stringify() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด JavaScript ๊ฐ’์ด๋‚˜ ๊ฐ์ฒด ํ˜•ํƒœ๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‚ด๋ณด๋‚ด์ค€๋‹ค.
  • 5๋ฒˆ> ์ƒ์„ฑํ•œ ์„œ๋ฒ„์ธ server๋Š” ์ฒซ๋ฒˆ ์งธ ์ธ์ž๋กœ PORT ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›๊ณ  ๋‘๋ฒˆ ์งธ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค.
    PORT๋Š” ๋ฒก์—”๋“œ์—์„œ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฒก์—”๋“œ ์„œ๋ฒ„๋กœ ์ ‘์†ํ•  ์ˆ˜์žˆ๋‹ค. ์ฝœ๋ฐฑํ•จ์ˆ˜ ์•ˆ์—์„  ํฌํŠธ ๋ฒˆํ˜ธ๋กœ ์„œ๋ฒ„๋ฅผ ์—ด์–ด ์‹คํ–‰ํ•  ๋•Œ์˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์ผœ์ ธ์žˆ๋‹ค๋Š” ๋กœ๊ทธ ๋ฉ”์„ธ์ง€๋ฅผ ๋‚จ๊ธฐ๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

1_2> ํ„ฐ๋ฏธ๋„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹

  • httpie ๋ผ๋Š” ํ„ฐ๋ฏธ๋„ ์ „์šฉ http client ํ”„๋กœ๊ทธ๋žจ์„ brew install httpie ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•œ๋‹ค.
  • ์„ค์น˜๊ฐ€ ๋๋‚˜๋ฉด http localhost:8000๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‘๋‹ต์ด ๋œจ๋ฉด์„œ ์„œ๋ฒ„๊ฐ€ ๋™์ž‘ํ•œ๋‹ค.

1_3. ๋‚ด์žฅ ๋ชจ๋“ˆ http๋กœ ๋‹ค์–‘ํ•œ ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ ์„œ๋ฒ„ ์ƒ์„ฑ์‹œ

  • ๋งŒ์•ฝ application์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ 1> ์œ ์ €๋ฅผ ํšŒ์›๊ฐ€์ž…๋„ ์‹œ์ผœ์•ผํ•˜๊ณ , 2> ๋กœ๊ทธ์ธ๋„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ, 3> ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ ์š”๊ตฌํ•˜๋Š” ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด์ค˜์•ผํ•˜๋Š” ๋งŽ์€ ์š”์ฒญ์ด ์žˆ๋‹ค๋ฉด ์–ด๋–จ๊นŒ?

  • ์ด๋ ‡๊ฒŒ ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ํ•จ์ˆ˜(๋กœ์ง)์„ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋ผ์šฐํŒ… ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

//- myServer.js
<script>
const http = require("http");
const { sendDB } = require("./sendDB");
const server = http.createServer((request, response) => {
  const { url, method } = request;
  response.setHeader("Content-Types", "application/json");
  if (url === "/")
    return response.end(JSON.stringify({ message: `end point` }));
  if (url === "/node" && method === "GET")
    return response.end(JSON.stringify({ message: `node is great` }));
  if (url === "/node/express" && method === "GET")
    return response.end(JSON.stringify({ message: `express is more great` }));
  if (url === "/database" && method === "POST") return sendDB(response);
  response.end(
    JSON.stringify({
      message: `this is minjae's first server`,
    })
  );
});
server.listen(8000, () => {
  console.log("server is listening on PORT 8000");
})
</script>
  • handler function sendDB.js
<script>
const sendDB = (res) => {
  res.end(
    JSON.stringify({
      data: [
        { id: 1, name: "Mysql" },
        { id: 2, name: "Oracle DB" },
        { id: 3, name: "Mongo DB" },
      ],
    })
  );
};
module.exports = { sendDB };
</script>
  • ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ผ์šฐํŒ…์„ ์ง์ ‘ request ๊ฐ์ฒด์—์„œ url๊ณผ method์— ๋”ฐ๋ผ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋ถ„๊ธฐํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด ์ค˜์•ผํ•œ๋‹ค.
  • ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜ ์•ˆ์— ๋งŽ์€ ์กฐ๊ฑด๋ฌธ๊ณผ ๋งŽ์€ ๋กœ์ง์„ ๋ชจ๋“ˆํ™” ํ•˜๋Š”๋ฐ ๋„ˆ๋ฌด ๋งŽ์€ ์‹œ๊ฐ„์ด ๋“ค์–ด๊ฐ„๋‹ค.

2_1> Express๋กœ ์„œ๋ฒ„ ์ƒ์„ฑ

  • ๋”ฐ.๋ผ.์„œ! ์ด๋Ÿฐ ๋ถˆํŽธํ•จ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด ํƒ„์ƒํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ Express์ด๋‹ค.
  • Express๊ฐ€ ํ•ด์ฃผ๋Š” ์—ญํ•  2๊ฐ€์ง€

1> url์„ if ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋งค์นญ์„ ์•ˆํ•ด์ค˜๋„๋˜๊ณ  ๋ฆฌ์•กํŠธ์—์„œ ๋ผ์šฐํŒ…ํ•˜๋“ฏ ์ฒซ๋ฒˆ ์งธ ์ธ์ž๋กœ url์„ ์จ์ฃผ๊ณ  ๋‘๋ฒˆ ์งธ ์ธ์ž๋กœ ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ์ง€๋งŒ ๋„ฃ์–ด์ค€๋‹ค.
2> JSON.stringify ๋ฉ”์„œ๋“œ๋กœ ์ผ์ผ์ด ์ฒ˜๋ฆฌ ํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ๋ฒˆ๊ฑฐ๋กœ์šด ๊ณผ์ •์„ ์•ˆํ•ด์ค˜๋„ ๋œ๋‹ค.
Express๊ฐ€ JSON์œผ๋กœ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜์„ ํ•ด์ค˜ ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜์— ๋Œ€ํ•ด response ๊ฐ์ฒด์— json() ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

2_3> Express๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

<script>
const http = require("http");
const express = require("express");
const { sendNode } = require("./sendNode");
const { sendExpress } = require("./sendExpress");
const { sendDB } = require("./sendDB");
const app = express();
app.get("/", (request, response) => {
  response.json({ message: `end point` });
});
app.get("/node", sendNode);
app.get("/node/express", (req, res) => {
  sendExpress(req, res);
});
app.get("/database", sendDB);
app.post((request, response) => {
  response.json({
    message: `this is minjae's first server`,
  });
});
const server = http.createServer(app);
server.listen(8000, () => {
  console.log("server is listening on PORT 8000");
});
</script>
  • Express ๋ชจ๋“ˆ์„ require๋กœ ๋ถˆ๋Ÿฌ์˜จ ํ›„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์„œ app ๋ณ€์ˆ˜์— ๋‹ด์•„์ฃผ๋Š” ๊ฒƒ์ด ์ปจ๋ฒค์…˜์ด๋‹ค.
  • ์ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” http server application์„ ์˜๋ฏธํ•œ๋‹ค.
  1. ์š”์ฒญ์„ ๋ฐ›์„ http method ํ•จ์ˆ˜๋ฅผ app์œผ๋กœ ๋ถ€๋ฅธ
  2. ์š”์ฒญ์„ ๋ฐ›์„ endpoint url์„ string์œผ๋กœ ์ฒซ๋ฒˆ์งธ ์ธ์ž์—
  3. ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ธ์ž๋กœ ๋ฐ›๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋‘๋ฒˆ ์งธ ์ธ ์ž๋กœ ๋„ฃ๋Š”๋‹ค.
    => ์ด๋Š” ๊ฐ๊ฐ์˜ ๋ฉ”์†Œ๋“œ์™€ ์—”๋“œํฌ์ธํŠธ์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•˜๋Š”(ํ•ธ๋“ค๋ง) ํ•จ์ˆ˜์ด๋‹ค.**
<script>
// - sendNode.js
const sendNode = (req, res) => {
  res.json({
    message: "node is great",
  });
};
module.exports = { sendNode };
// - sendExpress.js
const sendExpress = (req, res) => {
  res.json({
    message: "Express is more great",
  });
};
module.exports = { sendExpress };
// - databale.js
const sendDB = (req, res) => {
  res.json({
    data: [
      { id: 1, name: "Mysql" },
      { id: 2, name: "Oracle DB" },
      { id: 3, name: "Mongo DB" },
    ],
  });
};
module.exports = { sendDB };
</script>

๋ฒˆ์™ธ> Node.js ์ž‘์„ฑ ์‹œ ์œ ์˜ํ•  ์ 

  • http.createServer์— ์ „๋‹ฌ๋œ ์‘๋‹ต์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ(= API์— ์ ‘์†ํ•ด์•ผ)์ด ๋“ค์–ด์™€์•ผ ํ˜ธ์ถœ๋œ๋‹ค.
    • ์ฆ‰, ์š”์ฒญ์ด ๋“ค์–ด์™€์•ผ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ  ์ด๋Š” ์„œ๋ฒ„์˜ ์•„์ดํ”ผ ์ฃผ์†Œ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์† ํ–ˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ ์ธ์ž๋กœ res๋ฅผ ๋„˜๊ฒจ์ค˜์•ผํ•˜๋Š” ์ด์œ ๋Š” res์— ๋ฌด์–ธ๊ฐ€๋ฅผ ๋‹ด์•„์„œ ๋ณด๋‚ด์ฃผ๊ธฐ ์œ„ํ•ด res ๊ฐ์ฒด์— ์žˆ๋Š” end ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ ์ธ์ž๋กœ ์–ด๋–ค ๊ฒƒ์„ ๋ณด๋‚ด์ค„ ์ง€ ๋„ฃ์–ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— res๋ฅผ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ๋ฐ›์•„์•ผํ•œ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ์ปฌํ˜ธ์ŠคํŠธ 8000 ,8080๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์†Œ๋Š” ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ํ†ต์‹ ํ•  ๋•Œ ์“ฐ์ด๋Š” url ์ด๊ณ  ์ค‘๋ณต๋˜์„œ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

ํŒจํ‚ค์ง€> nodemon

  • ์ž‘์„ฑํ•œ ์„œ๋ฒ„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ ๋‚˜๊ฐ”๋‹ค๊ฐ€ (์ปจํŠธ๋กค c) ๋‹ค์‹œ ์ ‘์†์„ํ•ด์•ผ ์ˆ˜์ •์ด ์ ์šฉ๋œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ nodemon์ด๋ผ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์ฆ‰์‹œ ์ˆ˜์ •ํ•˜์—ฌ ๋ฐ˜์˜๋˜์–ด, ์„œ๋ฒ„๋ฅผ ๊ป๋‹ค ํ‚ฌ ํ•„์š”๊ฐ€ ์—†์–ด ํŽธ๋ฆฌํ•˜๋‹ค.

*๐Ÿ’กconclusion

  • Express๊ณผ http ๋‚ด์žฅ ๋ชจ๋“ˆ๋กœ ์„œ๋ฒ„๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฌด์—‡์ด ๋‹ค๋ฅด๋ฉฐ ์–ด๋–ค ์žฅ์ ์„ ๊ฐ€์ง€๋Š” ์ง€ ์ž˜ ์•Œ์•„๋‘์ขŒ

#๐Ÿ“‘Study Source

  • ์œ„์ฝ”๋“œ ๋ฒก์—”๋“œ ์†Œํ—Œ๋‹˜์˜ ๋‘๋ฒˆ ์งธ ์—ด๋ค ์„น์…˜ ๊ฐ•์˜ ์ค‘
profile
์ž๊ธฐ ์‹ ๋ขฐ์˜ ํž˜์„ ๋ฏฟ๊ณ  ์‹ค์ฒœํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์žํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€