티스토리 뷰
2024.12.16 - [웹 개발 공부하기] - [12.16] 좋아요 API 구현해보기😍
자, 이제 좋아요 기능을 구현해봤으니 좋아요 수를 나타내고 좋아요 여부도 나타내보고자 한다.
💥 좋아요 수 구하기
liked_book_id 가 1인 데이터를 보여줘. 라는 뜻이다.
그럼 총 3개의 행이 나오는 걸 볼 수 있는데, 이 갯수만 보고싶을 땐 어떡해야할까?
바로, count라는 함수를 붙여주면된다.
조건에 만족하는 행의 갯수를 알아서 계산해주는 걸 볼 수 있다. 굿👍
그럼 좋아요 갯수를 세고 books 테이블에 컬럼 추가해서 출력을 해보겠다!
SELECT *, (SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes FROM books;
* 뒤에 컬럼을 하나 추가하고 별칭은 likes 값은 SELECT count(*) FROM likes WHERE liked_book_id=books.id 인 것이다.
즉, likes 테이블에서 liked_book_id랑 books테이블의 id가 같은 행의 갯수를 books테이블에 likes 별칭으로 컬럼을 추가하겠다.
라는 뜻이다.
현재 likes 테이블의 liked_book_id는 위와 같다.
1번 = 3 / 2번 = 2 / 3번 = 2 / 4번 = 1 / 5번 = 1
books 테이블에서도 똑같이 잘 나오는 걸 볼 수 있다.
이렇게 쿼리 안에 쿼리가 들어가는 걸 서브(sub) 쿼리 라고 부른다.
이제 BookController.js에 있는 기본 sql문을 이 구문으로 바꿔주면된다.
let sql = "SELECT *, (SELECT count(*) FROM likes WHERE liked_book_id=books.id) AS likes FROM books ";
그럼 이렇게 likes 컬럼도 잘 나오는 걸 볼 수 있다.
💥 좋아요 여부 나타내기
이번엔 사용자가 해당 도서에 좋아요를 했는 지에 대한 여부를 보여주기 위해 sql 구문을 짜보겠다.
count(*)말고 EXISTS 를 이용해 볼 예정이다.
SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=8)
우선 ( )안의 값을 먼저 확인한다. likes테이블에서 user_id가 1이고 liked_book_id가 8인 데이터를 조회한다. 라는 뜻이다.
그 다음 SELECT EXISTS란, 이 데이터가 존재하니? 라는 뜻으로 보면된다.
즉, likes테이블에서 user_id가 1이고 liked_book_id가 8인 데이터가 존재하니? 라는 것이다.
EXISTS의 값은 0과 1로 구분이된다. 쉽게 말해 true, false와 같은 개념이다.
존재하면 1 , 존재하지않으면 0 으로 데이터가 나온다.
현재 likes 테이블의 liked_book_id는 => 1번 = 3 / 2번 = 2 / 3번 = 2 / 4번 = 1 / 5번 = 1
이렇게 존재하기 때문에, 8번은 0이 나올 것이다. 워크벤치로 확인해보겠다.
이번엔, user_id가 1인 사용자가 1번의 도서에 좋아요를 눌렀으니, 1번으로 확인해보겠다.
SELECT EXISTS (SELECT * FROM likes WHERE user_id=1 AND liked_book_id=1)
존재한다의 의미인 1 이 나타나는 걸 볼 수 있다.
이 구문을 이용해 좋아요의 여부를 확인할 수 있을 것 같다.
💥 좋아요 수 + 좋아요 여부 함께 나타내기
그럼, 위에서 했던 좋아요의 수와 좋아요의 여부를 함께 나타내는 sql구문을 짜보도록 하겠다.
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 WHERE books.id=1;
뭔가 굉장히 복잡해 보이지만 사실은 위와 별반 다를 게 없다.
컬럼이 2개가 추가된 것 뿐이다. 위에서 봤던 좋아요 추가 sql와 좋아요 여부sql을 합친 sql이다.
워크벤치로 확인하니 훨씬 편하게 확인할 수 있다.
추가된 likes컬럼과 liked컬럼 둘 다 잘 나오는 걸 볼 수 있다.
좋아요의 여부와 좋아요의 수는 개별 도서 조회에서 사용할 예정이기 때문에 개별 도서 조회의 sql구문이 바뀔 것 같다.
현재 개별 도서 조회의 기본 sql 구문은 이렇게 되어있다.
let sql = 'SELECT * FROM books LEFT JOIN category ON books.category_id = category.id WHERE books.id=?';
Aㅏ .... 위와 다르게 LEFT JOIN이 되어있다. 이 때 사실 좀 당황스러웠다.
어떻게 이어야하지 싶었는데 자세히 보니까 LEFT JOIN은 FROM절과 WHERE절 사이에 존재한다.
그럼 그냥 그 사이에 아까 그 sql을 넣으면 되는 거 아닐까? 하고 해봤다.
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.id
WHERE books.id=1;
말 그대로 아까 likes,liked 컬럼 추가한 sql에서 FROM 뒤에 LEFT JOIN 을 하고 WHERE절을 써주었다.
워크벤치로 확인해보니 내가 원하는대로 JOIN이 잘 되어서 category_name도 보이는 걸 볼 수 있다.
그럼 저 sql로 수정해서 포스트맨으로 한 번 확인해보겠다.
오 데이터 잘 나오네~ 라고 할 수 있지만..... 옥의 티가 하나 있다.
어린왕자들은 워크벤치에서 분명 id 가 1 이라고 나왔다. 근데 포스트맨으로 확인하니 띠용.. 갑자기 0 이라고 뜬다.
그 이유는, JOIN해서 나타난 category테이블에서 id로 컬럼명을 지었기 때문에 books테이블의 id가 1에서 0 으로
덧붙여져서 나오기 때문이었다.
즉, id가 2개여서 1 -> 0 으로 바뀐 것이다. 그럼 어떻게 해야 되는데???
간단하다. SELECT 할 때 * 가 아닌 뿌려주고싶은 데이터의 컬럼명을 다 쓰는거다.
id, title, img, category_id, form, ... 이렇게........... 굉장히 간단하지 않는가😁.......
장난이고...
가장 쉬운 방법은 category 테이블에서 id 컬럼명을 category_id로 바꾸면 된다.
가장 쉬운 방법이다. 진짜 real true 진심!!!!
워크벤치에서 category_id로 바꾸고, LEFT JOIN 할 때 category.id 를 category.category_id로 변경해주면된다.
그럼 내가 원하는대로 잘 나오는 걸 볼 수 있다. 굿👏👏
오늘은 가장 궁금했던 기능인 좋아요 API를 마무리했다.
어느 사이트에서나 쉽게 쓰는 기능이어서 굉장히 궁금했다.
나중에 나도 써보고싶기도 하고.. 가장 많이 보이는 기능이라 어떤 식으로 해야할까? 라는 고민도 들었다.
SQL에 대해 엄청난 지식을 갖고 있는 사람은 아니라 중간중간 많이 헷갈리기도 했다.
컬럼이 추가 될 때마다 뭔가 굉장히 다닥다닥 복잡해보이고, 뜻을 푸는데 조금 시간이 걸리기도 했다.
하지만 생각보다 sql만 고치면 되는 부분이라 좀 괜찮았던 것 같다.
생각해보면 좋아요 API만 마무리하는데 되게 시간이 오래 걸린 것 같기도 하고.... 뭔가 싱숭생숭😦
그래도 꼭 배워보고 싶었던 기능이기도 해서 꽤나 흥미롭게 시간 가는 줄 모르고 강의 들었던 것 같다.
중간중간 오류가 날 때 당황하긴했지만, 무엇보다 오류없이 돌아가는 것에도 많이 당황했다.
엥 진짜 이게 된다고..? 나 진짜 틀린 게 없다고..? 약간 이런 느낌..?
근데 아니나다를까 id 컬럼 때문에 또 당황x1000000 ....
주변 지인 개발자들이 항상 그랬다.. '어라 이게 왜 되지?' '이게 된다고?' 이걸 나도 느낄 줄이야...
오늘도 새로운 지식 습득하면서 뭔가 더 뿌듯한 하루가 되어버렸다. 프로젝트도 얼른 마무리하자 👏
'웹 개발 공부하기' 카테고리의 다른 글
[12.18] 결제(주문)하기 API 구현해보기🤔 (5) | 2024.12.18 |
---|---|
[12.17] 장바구니 API 구현하기😏 (1) | 2024.12.17 |
[12.16] 좋아요 API 구현해보기😍 (0) | 2024.12.16 |
[12.13] 도서 목록 조회 페이징구현과 신간 뽑아보기🧐 (2) | 2024.12.15 |
[12.12] 회원가입을 했으니 도서API도 구현해보자🤩 (2) | 2024.12.12 |