기본 LikesController.js
const conn = require('../mariadb'); //db 모듈
const {StatusCodes} = require('http-status-codes'); //status code 모듈
const addLike = (req, res) => {
// 좋아요 추가
const {id} = req.params;
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);
})
}
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];
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);
})
}
module.exports = {
addLike,
removeLike
}
COUNT()
: 행의 갯수를 세주는 집계 함수
SELECT count(*) FROM likes WHERE liked_book_id=1
좋아요 테이블에서, liked_book_id = 1 인 행의 갯수를 count(*) 칼럼을 만들어서 출력해줌

서브쿼리
: 쿼리 안에 쿼리
SELECT *,
값 AS 새로 추가할 컬럼명
FROM 테이블;
SELECT *,
(SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes
FROM books;
books 테이블안에서 liked_book_id = books.id인 행의 갯수를 넣은 likes칼럼을 만들고, 이를 books 뒤에 붙여줌

좋아요 개수가 포함된 books 테이블 조회
books.js에 서브 쿼리 추가해주면, likes 컬럼도 같이 가져와줌

SELECT EXISTS
SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=1);
괄호 안에 SELECT값이 존재하는지 알려줌 -> 존재하면 1, 없으면 0

개별 도서 조회 시 사용자가 좋아요를 했는지 여부를 포함
SELECT *,
(SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=1)) AS liked
FROM books WHERE books.id=1;

최종 books 개별 도서 조회 시 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.id
WHERE books.id = ?;

⚠️ LEFT JOIN 시의 id 중복 -> 덮여쓰기 되어 출력됨

id가 두개이므로 category id인 0으로 결과가 나옴.
category 테이블의 id 이름 변경해주자.
SELECT *,
(SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes
(SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=1)) AS liked
FROM books
LEFT JOIN category ON books.category_id = category.category_id
WHERE books.id = 1;

'Devcourse > BookShop 사이드 프로젝트' 카테고리의 다른 글
| [BookShop 프로젝트] 주문 API - LAST_INSERT_ID(), MAX()로 최신 데이터 가져오기, insertId, 벌크 INSERT (0) | 2026.02.20 |
|---|---|
| [BookShop 프로젝트] 장바구니 API - fk제약조건, in(~, ~) (0) | 2026.02.19 |
| [BookShop 프로젝트] Books API 구현 - picsum (0) | 2026.02.14 |
| [BookShop 프로젝트] Users API 구현 - http-status-codes 모듈, 컨트롤러, crypto 모듈(비밀번호 암호화) (0) | 2026.02.13 |
| [BookShop 프로젝트] API 설계, dbdiagram (0) | 2026.02.09 |