๐ŸŽฏ ๋„์„œ API์™€ ์นดํ…Œ๊ณ ๋ฆฌ API๋ฅผ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“™ Today I Learned

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ •

TABLE books

Table books {
  id integer [primary key]
  title varchar
  img integer
  category_id integer
  form varchar
  isbn varchar
  summary text
  detail text
  author varchar
  pages integer
  contents text
  price integer
  likes integer
  pub_date date
}

๐Ÿค” ๋„์„œ ์ด๋ฏธ์ง€ ๋งํฌ๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ›์„๊นŒ?

Lorem Picsum(์ƒ˜ํ”Œ ์ด๋ฏธ์ง€๐Ÿ–ผ๏ธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ URL ๊ธฐ๋ฐ˜ ์š”์ฒญ์œผ๋กœ ๋ฌด๋ฃŒ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค)์„ ํ™œ์šฉํ•ด์„œ ์ด๋ฏธ์ง€์˜ ์ฃผ์†Œ๊ฐ’์„ int๊ฐ’์œผ๋กœ ํ™œ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
๐Ÿ‘‰ Lorem Picsum ์‚ฌ์ดํŠธ

  • https://picsum.photos/200/300 โ†’ 200x300 ํฌ๊ธฐ์˜ ๋žœ๋ค ์ด๋ฏธ์ง€ ์ œ๊ณต

TABLE categories

Table categories {
  id integer [primary key]
  category_name varchar
}



๋„์„œ API ์„ค๊ณ„

์ „์ฒด ๋„์„œ ์กฐํšŒ

  • Method : GET

  • URL : /books

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "img" : ์ด๋ฏธ์ง€ id,
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pub_date" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "img" : ์ด๋ฏธ์ง€ id,
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pub_date" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  ...
]
  • TODO : ๋ฐ์ดํ„ฐ๋ฅผ 8๊ฐœ์”ฉ ๋ณด์—ฌ์ฃผ๊ธฐ๋Š” ์ถ”ํ›„์— ๊ณ ๋„ํ™”ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๊ฐœ๋ณ„ ๋„์„œ ์กฐํšŒ

  • Method : GET

  • URL : /books/:id

  • HTTP Status Code : 200 Ok

  • Request Body

{
  "email": "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฉ”์ผ",
  "password" : "์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ"
}
  • Response Body :
{
  "id" : ๋„์„œ id,
  "title": "๋„์„œ ์ œ๋ชฉ",
  "img" : ์ด๋ฏธ์ง€ id,
  "category" : ์นดํ…Œ๊ณ ๋ฆฌ,
  "format" : "ํฌ๋งท",
  "isbn" : "isbn",  
  "summary" : "์š”์•ฝ ์„ค๋ช…",
  "author" : "๋„์„œ ์ž‘๊ฐ€",
  "pages" : ์ชฝ ์ˆ˜,
  "index" : "๋ชฉ์ฐจ",
  "price" : ๊ฐ€๊ฒฉ,
  "likes" : ์ข‹์•„์š” ์ˆ˜,
  "liked" : boolean,
  "pub_date" : "์ถœ๊ฐ„ ๋‚ ์งœ"
}

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์‹ ๊ฐ„ ๋„์„œ ์กฐํšŒ

  • Method : GET

  • URL : /books?categoryId=:categoryId&new={boolean}

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "img" : ์ด๋ฏธ์ง€ id,
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pub_date" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  {
    "id" : ๋„์„œ id,
    "title": "๋„์„œ ์ œ๋ชฉ",
    "img" : ์ด๋ฏธ์ง€ id,
    "summary" : "์š”์•ฝ ์„ค๋ช…",
    "author" : "๋„์„œ ์ž‘๊ฐ€",
    "price" : ๊ฐ€๊ฒฉ,
    "likes" : ์ข‹์•„์š” ์ˆ˜,
    "pub_date" : "์ถœ๊ฐ„ ๋‚ ์งœ"
  },
  ...
]
  • TODO : ๋ฐ์ดํ„ฐ๋ฅผ 8๊ฐœ์”ฉ ๋ณด์—ฌ์ฃผ๊ธฐ๋Š” ์ถ”ํ›„์— ๊ณ ๋„ํ™”ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

  • ์ฐธ๊ณ ์‚ฌํ•ญ : new๊ฐ€ true์ผ ๋•Œ ์‹ ๊ฐ„ ์กฐํšŒ ๊ธฐ์ค€์€ ์ถœ๊ฐ„์ผ๋กœ๋ถ€ํ„ฐ 30์ผ ์ด๋‚ด




์นดํ…Œ๊ณ ๋ฆฌ API ์„ค๊ณ„

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ „์ฒด ์กฐํšŒ

  • Method : GET

  • URL : /category

  • HTTP Status Code : 200 Ok

  • Request Body : x

  • Response Body :

[
  {
    "id" : ์นดํ…Œ๊ณ ๋ฆฌ id,
    "name": "์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„",  
  },
  {
    "id" : ์นดํ…Œ๊ณ ๋ฆฌ id,
    "name": "์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ฆ„",
  },
  ...
]



BookController.js

const conn = require('../mariadb');
const { StatusCodes } = require('http-status-codes');

const allBooks = (req, res) => {
  const { categoryId } = req.query;

  if (categoryId) {
    const sql = 'SELECT * FROM books WHERE category_id = ?';
    conn.query(sql, categoryId, (err, result) => {
      if (err) {
        return res.status(StatusCodes.BAD_REQUEST).end();
      }
      if (result.length) {
        return res.status(StatusCodes.OK).json(result);
      } else {
        return res.status(StatusCodes.NOT_FOUND).end();
      }
    });
  } else {
    const sql = 'SELECT * FROM books';
    conn.query(sql, (err, result) => {
      if (err) {
        return res.status(StatusCodes.BAD_REQUEST).end();
      }

      return res.status(StatusCodes.OK).json(result);
    });
  }
};

const bookDetail = (req, res) => {
  const id = parseInt(req.params.id);

  const sql = 'SELECT * FROM books WHERE id = ?';
  conn.query(sql, id, (err, result) => {
    if (err) {
      console.log(err);
      return res.status(StatusCodes.BAD_REQUEST).end();
    }

    if (result[0]) {
      return res.status(StatusCodes.OK).json(result);
    } else {
      return res.status(StatusCodes.NOT_FOUND).end();
    }
  });
};

module.exports = {
  allBooks,
  bookDetail,
};
  • allBooks : categoryId๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํŠน์ • ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋„์„œ ์กฐํšŒํ•˜๊ณ , ์—†์œผ๋ฉด ์ „์ฒด ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

  • bookDetail : ํŠน์ • ๋„์„œ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.




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

๊ฐ™์€ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์—ฌ๋Ÿฌ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋‚˜๋ˆ„๊ธฐ๋ณด๋‹ค ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ categoryId ์กด์žฌ ์—ฌ๋ถ€์— ๋”ฐ๋ผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ๋” ๊น”๋”ํ•˜๊ณ  ์ž˜ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

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

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