포스트

2024.05.23 프로그래머스-북끼오 (bookkio) 도서 API 코드 작성

Bookkio 도서 관련 API 작업

books 테이블 생성

  • mysql workbench 내 bookkio DB에 books 테이블 생성

    books-table

전체 도서 조회 API 스크립트

  • books.controller.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
        let sqlQuery = `SELECT * FROM books`;
        dbConnection.query(sqlQuery, (err, results) => {
          if (err) {
            console.log(err);
            return res.status(StatusCodes.BAD_REQUEST).end();
          }
        
          if (results[0]) {
            const books = results.map((book) => {
              const resultBook = {
                id: book.id,
                title: book.title,
                summary: book.summary,
                author: book.author,
                price: book.price,
                pub_date: book.pub_date,
              };
              return resultBook;
            });
            return res.status(StatusCodes.OK).json(books);
          }
        });
      };
    

개별 도서 조회 API 스크립트

  • books.controller.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
      /**
       * 개별 도서 조회 로직
       * @param {import("express").Request} req
       * @param {import("express").Response} res
       * @param {import("express").NextFunction} next
       */
      const searchOneBook = (req, res, next) => {
        const { bookId } = req.params;
        let sqlQuery = `
          SELECT * FROM books
          WHERE id=?
        `;
        dbConnection.query(sqlQuery, [+bookId], (err, results) => {
          if (err) {
            console.log(err);
            return res.status(StatusCodes.BAD_REQUEST).end();
          }
        
          const book = results[0];
          if (book) {
            return res.status(StatusCodes.OK).json(book);
          } else {
            return res.status(StatusCodes.NOT_FOUND).end();
          }
        });
      };
    

도서 이미지 정보

  • Lorem Picsum
  • 위의 사이트에서 제공하는 무료 이미지를 사용
  • https://picsum.photos/id/{image}/width/height
    • {image} 부분에 INT형 특정 아이디 값을 넣으면 사진주소를 얻을 수 있으므로, 테이블에는 INT형으로 img 정보를 저장

카테고리별 도서 조회 API 스크립트

  • 카테고리별 도서 조회를 위해 Table 자체를 생성한다.
  • 카테코리별 도서 조회 API는 URL이 books의 root로 향해 쿼리만 다르기 때문에, 전체 도서 조회의 API 코드에 합쳐 작성해야 한다.

category-table

  • books.contoller.js 의 전체도서 조회 함수 searchBooks에 카테고리 검색 발생 시, 카테고리별로 검색하는 로직을 추가 하였다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    
      /**
       * 전체 도서 조회 Or 카테고리별 도서 조회
       * @param {import("express").Request} req
       * @param {import("express").Response} res
       * @param {import("express").NextFunction} next
       */
      const searchBooks = (req, res, next) => {
        const { category_id } = req.query;
        
        //카테고리 검색
        if (category_id) {
          let sqlQuery = `
          SELECT * FROM books LEFT 
          JOIN category ON books.category_id = category.id
          WHERE books.category_id = ?
          `;
        
          dbConnection.query(sqlQuery, [+category_id], (err, results) => {
            if (err) {
              console.log(err);
              return res.status(StatusCodes.BAD_REQUEST);
            }
        
            if (results.length > 0) {
              return res.status(StatusCodes.OK).json(results);
            } else {
              return res.status(StatusCodes.NOT_FOUND).end();
            }
          });
        } else {
          // 전체 도서 조회
          let sqlQuery = `SELECT * FROM books`;
          dbConnection.query(sqlQuery, (err, results) => {
            if (err) {
              console.log(err);
              return res.status(StatusCodes.BAD_REQUEST).end();
            }
        
            if (results[0]) {
              const books = results.map((book) => {
                const resultBook = {
                  id: book.id,
                  title: book.title,
                  summary: book.summary,
                  author: book.author,
                  price: book.price,
                  pub_date: book.pub_date,
                };
                return resultBook;
              });
              return res.status(StatusCodes.OK).json(books);
            }
          });
        }
      };
    
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.