Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
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
Archives
Today
Total
관리 메뉴

사고쳤어요

[도서 쇼핑몰] Node.js - 도서 조회 시 좋아요 개수, 여부 함께 보내주기 본문

웹 풀스택

[도서 쇼핑몰] Node.js - 도서 조회 시 좋아요 개수, 여부 함께 보내주기

kevinmj12 2025. 3. 14. 17:41

https://makeaccident.tistory.com/159

 

[도서 쇼핑몰] Node.js - 도서 조회 관련 API 구현하기

도서 전체 조회 (카테고리, 신간 옵션)const books = (req, res) => { let categoryId = req.query.categoryid; let isNew = req.query.isnew; let sql = "SELECT * FROM books;"; // 전체 도서 조회 let values = []; if (categoryId && isNew) { // 카

makeaccident.tistory.com

기존 도서 전체 조회 코드에서는 데이터베이스의 books 테이블 값들을 보여주었다.

여기에 likes 테이블에서의 좋아요 개수를 모두 구해 같이 보여주도록 하자.

도서 좋아요 개수 추가

const books = (req, res) => {
  let categoryId = req.query.categoryid;
  let isNew = req.query.isnew;
  let { limit, page } = req.query;
  limit = parseInt(limit);
  page = parseInt(page);

  let sql = `SELECT *, (SELECT count(*) FROM likes WHERE books.id = liked_book_id) AS likes FROM books`; // 전체 도서 조회
  let values = [];
  if (categoryId && isNew) {
    // 카테고리별 신간 도서 조회
    sql += `WHERE category_id = ? AND
      pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()`;
    values = [categoryId, isNew];
  } else if (categoryId) {
    // 카테고리별 조회
    sql += "WHERE category_id = ?";
    values = [categoryId];
  } else if (isNew) {
    // 신간 조회
    sql += `WHERE pub_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()`;
    values = [isNew];
  }

  sql += ` LIMIT ${limit} OFFSET ${(page - 1) * limit};`;

  conn.query(sql, values, (err, results) => {
    if (err) {
      return res.status(StatusCodes.BAD_REQUEST).json({
        msg: `Error: ${err.code}`,
      });
    }
    return res.status(StatusCodes.OK).json(results);
  });
};

SELECT count(*) FROM likes WHERE books.id = liked_book_id 를 통해 좋아요 개수를 불러왔다.

그리고 불러온 값을 서브쿼리를 활용하여 기존 SELECT * FROM books 에서 * 뒤에 추가하였다.

 

 

사용자가 도서에 좋아요 눌렀는지 여부 추가

const bookDetail = (req, res) => {
  let { id } = req.params;
  let {userId} = req.body;
  id = parseInt(id);
  const values = [userId, id, id];

  const sql = `SELECT * ,
  (SELECT count(*) FROM likes WHERE liked_book_id = books.id) AS likes,
  (SELECT EXISTS (SELECT * FROM likes WHERE user_id = ? AND liked_book_id = ?)) AS liked
  FROM books LEFT JOIN categories
  ON books.category_id = categories.id WHERE books.id=?;`;

  conn.query(sql, values, (err, results) => {
    if (err) {
      return res.status(StatusCodes.BAD_REQUEST).json({
        msg: `Error: ${err.code}`,
      });
    }
    if (results[0]) {
      return res.status(StatusCodes.OK).json(results[0]);
    } else {
      return res.status(StatusCodes.NOT_FOUND).end();
    }
  });
};

먼저 8번 줄에 있는 SELECT count(*) FROM likes WHERE liked_book_id = books.id) AS likes 는 위에서 보았던

도서의 좋아요 개수를 세 리턴하는 SQL문이다.

 

새롭게 추가된 것은 9번 줄의

(SELECT EXISTS (SELECT * FROM likes WHERE user_id=? AND liked_book_id = ?)) AS LIKED 이다.

위 서브쿼리는 SELECT * FROM likes WHERE user_id=? AND liked_book_id = ?

즉 유저 아이디 1인 사람이 1번 도서를 좋아하는지 여부가 존재할 경우 이를 리턴해주는 SQL문이다.

likes 테이블
1번 도서에 1번 유저가 좋아요를 누른 것이 반영되어 나옴
4번 도서에 1번 유저가 좋아요를 누르지 않은 것이 반영되어 나옴