백엔드 실습(7)

wltjd1688·2025년 3월 17일

풀사이클

목록 보기
34/74

오늘은 좋아요 테이블을 만들고, 책을 조회할때 마다 해당 정보를 보여줄 수 있도록 만들어 주는것을 했다.

좋아요 디비 설계

먼저 좋아요 db를 설계한다.
user_id와 liked_book_id로 만들어 주고, 각각을 user테이블의 id와 book테이블의 id와 연결해준다.

나중에 JWT 토큰을 통해 user_id를 확인하고 그에 맞는 정보들을 꺼내어 책을 좋아요 눌렀는지 등을 확인해줄려고 한다.

좋아요 추가, 삭제 구현

좋아요 API의 핸들러 파일을 만들어서 추가와 삭제를 구현해준다.

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

    let sql = "INSERT INTO likes (user_id, liked_book_id) VALUES (1, 3)";
    let values= [user_id, id];
    db.query(sql, values, (err, results)=>{
        if (err){
            console.log(err);
            return res.status(StatusCodes.BAD_REQUEST).end();
        }

        return res.status(StatusCodes.OK).json(results)
    })                                              
}

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

    let sql = "DELETE FROM likes WHERE user_id = ? AND liked_book_id = ?;";
    let values= [user_id, id];
    db.query(sql, values, (err, results)=>{
        if (err){
            console.log(err);
            return res.status(StatusCodes.BAD_REQUEST).end();
        }

        return res.status(StatusCodes.OK).json(results)
    })         
}

count(), AS, 서브쿼리 사용하기

  • count()
    count는 말 그대로 특정 조건에 만족하는 데이터의 갯수를 출력해주는 명령어이다.
    다음과 같이 likes테이블에서 liked_book_id가 2인 데이터의 갯수를 출력해줄 수 있다.

    해당 기능은 책에 대한 정보를 불러올때 사용할것이다.

  • AS
    AS는 컬럼명이 아닌 별명을 붙여줄 수 있게 해주는 명령어로, 다음과 같이 서브쿼리를 불러왔을 때, 새 컬럼명을 지정해줄 수 있다.

  • 서브쿼리
    서브쿼리는 쿼리문 안에 들어가는 쿼리로 AS에 나온것 처럼 퀄리안에 (SELECT * ...)와 같이 표현해줄 수 있다.

해당 명령어들을 통해서 책 정보를 조회할 때, like를 표시해줄 수 있다.
bookContoreller.js파일의 책 정보를 조회하는 SQL에 다음과 같이 수정해주면 된다.

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

EXISTS 사용하기.

결과값이 존재하는지 확인하는 sql로 EXISTS를 통해서 유저가 좋아요을 눌렀는지 확인할 수 있다.

해당 sql코드를 들거와서 개별 도서에 적용했을때, 다음과 같이 잘 적용되는 것을 알 수 있다.

  • Q. 근데 id가 나오는게 쫌 이상하다. 책에 대한 id가 나오지 않는 문제가 발생했다.
    A.이건 카테고리의 id가 나오는건데, 이걸 해결하기 위해서는 카테고리테이블의 id 이름을 바꾸거나, SELECT할때 * 대신 테이블 컬럼명을 하나하나 다 적어주는 방법이 있다.
profile
일단 해!!!!

0개의 댓글