๐ŸŽฏ Postman์„ ํ™œ์šฉํ•˜์—ฌ Express์˜ CRUD ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.


๐Ÿ“™ Today I Learned

postman

API๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋žซํผ์œผ๋กœ API ๋ผ์ดํ”„์‚ฌ์ดํด์˜ ๊ฐ ๋‹จ๊ณ„๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜์—ฌ ๋” ๋‚˜์€ API๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์ถœ์ฒ˜: postman

๐Ÿง ์™œ postman์„ ์‚ฌ์šฉํ• ๊นŒ?

API ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. (๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” POST, PUT, DELETE ์š”์ฒญ์„ ์‰ฝ๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ)


API์—์„œ ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ๋ฒ• 3๊ฐ€์ง€

  • URL ํŒŒ๋ผ๋ฏธํ„ฐ (Path Parameter)

    • ์˜ˆ์‹œ: /youtubers/:id
  • URL ์ฟผ๋ฆฌ ์ŠคํŠธ๋ง (Query String)

    • ์˜ˆ์‹œ: /movies?genre=horror
  • HTTP ๋ฐ”๋”” (Request Body)

    • POST, PUT ์š”์ฒญ์—์„œ JSON์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„์„œ API ์˜ˆ์ œ

// express ๋ชจ๋“ˆ ์…‹ํŒ…
const express = require('express');
const app = express();
app.listen(3000);

// ๋ฐ์ดํ„ฐ ์…‹ํŒ…
let book1 = {
  title: '๋ชจ์ˆœ',
  author: '์–‘๊ท€์ž',
  pages: 320,
};

let book2 = {
  title: '๋ฐ๋ฏธ์•ˆ',
  author: 'ํ—ค๋ฅด๋งŒ ํ—ค์„ธ',
  pages: 270,
};

let book3 = {
  title: '์–ด๋ฆฐ ์™•์ž',
  author: '์ƒํ…์ฅํŽ˜๋ฆฌ',
  pages: 120,
};

let db = new Map(); // key-value
let id = 1;
db.set(id++, book1);
db.set(id++, book2);
db.set(id++, book3);

// REST API ์„ค๊ณ„

// ์ „์ฒด ์กฐํšŒ
app.get('/books', (req, res) => {
  res.json({
    message: '์ฑ… ์ „์ฒด ์กฐํšŒ',
  });
});

// ๊ฐœ๋ณ„ ์กฐํšŒ
app.get('/books/:id', (req, res) => {
  let { id } = req.params;
  id = parseInt(id);
  // console.log(id);
  const book = db.get(id);
  if (!book) {
    res.json({
      message: '์—†๋Š” ์ฑ…์ž…๋‹ˆ๋‹ค.',
    });
  } else {
    book.id = id; // book['id'] = id;
    res.json(book);
  }
});

// JSON ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฏธ๋“ค์›จ์–ด
app.use(express.json());

// POST ์š”์ฒญ (์ฑ… ์ถ”๊ฐ€)
app.post('/books', (req, res) => {
  // body์— ์ˆจ๊ฒจ์ ธ์„œ ๋“ค์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅ
  db.set(id++, req.body);
  res.json({
    message: `${db.get(id - 1).title} ์ฑ…์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`,
  });
});

์ฑ… ๋ฐ์ดํ„ฐ ์ €์žฅ

  • db.set(id++, book) โ†’ ์ฑ… ๋ฐ์ดํ„ฐ๋ฅผ id์™€ ํ•จ๊ป˜ Map์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด ์„ค์ •

  • express.json() โ†’ POST ์š”์ฒญ์—์„œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์œผ๋กœ req.body ์˜ ๊ฐ’์ด undefined ์—์„œ JSON์œผ๋กœ ๋ณ€ํ˜•๋ฉ๋‹ˆ๋‹ค.

    ๋ฏธ๋“ค์›จ์–ด(Middleware)๋ž€?

    ์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ค‘๊ฐ„ ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋กœ API ์ „์ฒ˜๋ฆฌ ์ž‘์—…(๋กœ๊ทธ, ๋ณด์•ˆ, ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜, ์š”์ฒญ ์ฐจ๋‹จ) ๋“ฑ์„ ํ•ด์ค๋‹ˆ๋‹ค.

    ๐Ÿง ์™œ ํ•„์š”ํ•œ๊ฑธ๊นŒ?

    ์ผ์ผ์ด ๊ฐ API์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žก์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๊ฐ„ ์ฒ˜๋ฆฌ ๊ณผ์ •์ด ํ•„์š”ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


์ƒˆ๋กœ์šด ์ฑ… ์ถ”๊ฐ€

  • db.set(id++, req.body); โ†’ ์ฑ… ์ •๋ณด๋ฅผ ์ƒˆ๋กœ์šด id์™€ ํ•จ๊ป˜ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

postman์—์„œ POST๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ฑ…์„ ์ถ”๊ฐ€ํ•œ ๊ฒฐ๊ณผ ํ™”๋ฉด


์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ฑ…์„ GET์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆ๋Ÿฌ์˜จ ๊ฒฐ๊ณผ ํ™”๋ฉด




โœ๏ธ ํ•œ ์ค„ ํšŒ๊ณ 

๋ฏธ๋“ค์›จ์–ด์˜ ์—ญํ• ๋กœ JSON์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์‹ ๊ธฐํ–ˆ๊ณ , postman์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” ํ™•์ธํ•  ์ˆ˜ ์—†๋Š” post ๋“ฑ์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด ํŽธ๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

profile
๐ŸŒฑ๊ฐœ๋ฐœ ๊ธฐ๋ก์žฅ

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