[DevCamp] 스프린트 프로젝트 2 - 도서 좋아요 기능

동건·2025년 3월 14일

DevCamp

목록 보기
28/85

스프린트 프로젝트 2 - 도서 좋아요 기능 추가

오늘은 도서별로 좋아요를 추가하는 기능과
좋아요 수를 확인하고, 유저에 따라서 좋아요 여부를 확인 할 수 있는 기능을 구현하였다.


LikeController.js

addLike

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

    const sql = "INSERT INTO likes (user_id, liked_book_id) VALUES (?, ?)";
    const values = [user_id, bookId];

    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);
    })
};

removeLike

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

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

    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);
    })
};

추후에는 user_id를 토큰으로 받아오는 것을 추가할 것이라
지금은 임시로 body 에 받아오기로 했고
기존에 다른 코드들과 유사해 코드를 짜는데 어렵지 않았다.


좋아요 개수

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

좋아요 개수는 SQL에서 제공하는 COUNT() 를 사용해서 구할 수 있었다.

위 코드를 활용해서 전체 도서 조회를 구현한 BookController 를 수정했다.

전체 조회할 때 좋아요 개수도 같이 조회

const allBooks = (req, res) => {

    ...
  
    let sql = `SELECT * ,
				(SELECT COUNT(*) FROM likes WHERE liked_book_id = books.id)
				AS likes FROM books`
    let values =[];
  
    ...

};

이렇게 likes 로 좋아요 개수도 정상적으로 보이는 모습이다.


좋아요 여부 확인

SELECT EXISTS(SELECT * FROM likes WHERE likes.user_id=? AND likes.liked_book_id=?)

좋아요 여부는 SQL에서 제공하는 EXISTS() 를 사용해 조건에 맞는 컬럼이 존재하면 1, 아니면 0을 반환하는
기능으로 구현하였다.

개별 조회할 때 좋아요 여부도 같이 조회

const bookDetail = (req, res) => {
    const {bookId} = req.params;
    const {userId} = req.body;

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

    const values = [userId, bookId, bookId];
	
  	...
};

위에서 언급했듯이 userId아직은 body 에서 직접 받았고
좋아요 개수와 함께 좋아요를 눌렀는지도 확인할 수 있게끔 작성을 했다.

제일 아래에 likesliked 로 정상적으로 조회가 가능하다.


🔨 TIL

오늘은 제일 궁금했던 좋아요 기능을 구현하였다.
좋아요를 하고, 삭제하는 것은 어렵지 않았지만
좋아요를 눌렀는지 여부를 확인하는 것은
COUNT() 로도 할 수 있어서 혼자 코드를 작성할 때는
COUNT() 로 조회했을 때 0과 1이 반환되게 했지만
EXISTS() 라는 새로운 개념도 알 수 있어서 유익한 시간이였다.

profile
배고픈 개발자

0개의 댓글