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 문을 작성하면서 실력을 키워야겠다고 생각했다.
'데브코스 > 도서 판매 쇼핑몰' 카테고리의 다른 글
API 구현하기(6): 주문하기(1) (1) | 2024.10.11 |
---|---|
API 구현하기(5): 장바구니 담기, 조회, 삭제 (3) | 2024.10.10 |
API 구현하기(3): 신간 도서 조회, 도서 목록 조회 페이징 (0) | 2024.10.07 |
API 구현하기(2): 도서 조회 (0) | 2024.10.06 |
API 구현하기(1) : 회원 가입, 로그인, 비밀번호 초기화 (0) | 2024.10.04 |