본문 바로가기

데브코스/도서 판매 쇼핑몰

API 구현하기(4): 좋아요 추가, 삭제

1️⃣ 좋아요 추가

const addLike = (req, res) => {
  const {id} = req.params; //book_id
  const {user_id} = req.body;

  let sql=`INSERT INTO likes (user_id, liked_book_id) VALUES (?, ?)`;
  let values = [user_id , id];

  conn.query(sql,values,
    (err, results) => {
      if (err) {
        console.log(err);
        return res.status(StatusCodes.BAD_REQUEST).end();
      }
      return res.status(StatusCodes.OK).json(results);
    }
  )
}

파라미터로 좋아요 할 책의 id 를 받고, body 값으로 user_id 의 값을 받는다. 즉 위의 사진은 id 가 1인 사용자가 id 가 3번인 책을 좋아요를 누른 경우이다.

2️⃣ 좋아요 취소 (삭제)

const removeLike = (req, res) => {
  const {id} = req.params; //book_id
  const {user_id} = req.body;

  let sql=`DELETE FROM likes WHERE user_id= ? AND liked_book_id=?;`;
  let values = [user_id , id];

  conn.query(sql,values,
    (err, results) => {
      if (err) {
        console.log(err);
        return res.status(StatusCodes.BAD_REQUEST).end();
      }
      return res.status(StatusCodes.OK).json(results);
    }
  )
}

파라미터로 좋아요 할 책의 id 를 받고, body 값으로 user_id 의 값을 받는다. 즉 위의 사진은 id 가 1인 사용자가 id 가 2번인 책의 좋아요를 취소한 경우이다. 

 

3️⃣ 좋아요 개수 세서 books 테이블에 컬럼 추가해서 출력하기

SELECT *,
	(SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes
	FROM books;

✨도서 테이블 전체 조회 + 컬럼 1개 추가하기 

더보기

SELECT *,

           ( 각 행마다 likes 테이블에 liked_book_id 로 가지고 있는 행 수) AS 새로 추가할 컬럼명

            FROM books;

✔️ 서브(sub) 쿼리 : 쿼리 안에 쿼리

✔️ count() : 행 개수

✔️ AS: 컬럼 별칭

이제 전체 도서 조회를 할 때 해당 도서의 좋아요 개수도 함께 나오는 것을 확인할 수 있다. 

 

4️⃣ 개별 도서 조회에서 좋아요 여부 알려주기

const bookDetail = (req, res) => {
  let {user_id} = req.body;
  let book_id= req.params.id;
  let 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 category 
                ON books.category_id = category.category_id 
                WHERE books.id=?;`;
  let values = [user_id, book_id, book_id];

  conn.query(sql, values,
    (err, results) => {
      if (err) {
        console.log(err);
        return res.status(StatusCodes.BAD_REQUEST).end();
      }
      if (results.length)
        return res.status(StatusCodes.OK).json(results[0]);
      else
        return res.status(StatusCodes.NOT_FOUND).end();
    }
  )
};

 

위의 sql 문을 분석해보면,

1. 파란색 부분 : category 테이블과의 join을 위함

2. 주황색 부분: likes 라는 이름의 열 추가, 입력 받은 책의 id 의 좋아요 개수를 출력

3. 연두색 부분: liked 라는 이름의 열 추가, 입력 받은 user가 해당 책을 좋아요 했는지 여부를 출력 

 

1번 책의 정보를 조회할 때, user_id 의 값을 4로 전달해줬다. 이 뜻은 1번 책을 4번 사용자가 좋아요를 했나요? 라는 뜻이다. 1번 책의 정보와 함께 likes 라는 이름으로 해당 책의 좋아요 개수가 같이 나오고, 4번 사용자는 1번 책을 좋아요 하지 않았기 때문에 liked 에 존재하지 않는다는 의미의 0이 출력된다. 데이터베이스를 확인해보면, 4번 사용자는 4번 책만 좋아요를 눌렀기 때문에 이와 같은 결과가 나온 것을 확인할 수 있다. 


🌟 배운 점

오늘은 SQL 문이 어제보다 더 복잡해졌다. 서브 쿼리 작성법, COUNT로 행의 개수를 세는 방법, 그리고 존재 여부를 확인하는 EXISTS의 사용법을 배웠다. 강의에서 이해되지 않는 부분이 있었지만, 혼자 복습하며 완전히 이해할 수 있었다. SQL 문이 다소 복잡하게 느껴지긴 했지만, 원하는 대로 데이터를 조작할 수 있다는 점이 흥미로웠다. 앞으로도 더 복잡한 SQL 문을 작성하면서 실력을 키워야겠다고 생각했다.