getNewHeart
메서드를 처음엔 이렇게 구현하였다.
public NewsHeartResponseDto getNewsHeart(Long newsId, String userEmail) {
User loginUser = userRepository.findByUserEmail(userEmail).orElseThrow(
() -> new IllegalArgumentException("존재하지 않는 사용자입니다."));
News news = newsRepository.findById(newsId).orElseThrow(
() -> new IllegalArgumentException("존재하지 않는 뉴스입니다.")
);
NewsHeart existHeart = newsHeartRepository.findByHeartUserAndHeartNews(loginUser, news);
if(existHeart == null) {
NewsHeart newsHeart = new NewsHeart(loginUser, news);
news.increaseHeartCount();
newsHeartRepository.save(newsHeart);
} else {
NewsHeart newsHeart = new NewsHeart(loginUser, news);
news.decreaseHeartCount();
newsHeartRepository.delete(newsHeart);
}
return new NewsHeartResponseDto(news.getHeartCount());
}
Postman으로 테스트를 해보았다.
내가 의도한 것은 계속 요청을 보내면 0 ➡️ 1 ➡️ 0 ➡️ 1 ➡️ 0 ...
이렇게 좋아요 count가 하는 것이다.
좋아요를 눌렀다가 취소했다가 눌렀다가 취소했다가 이렇게 된다면 0과 1이 반복되어야 한다.
하지만 테스트 결과 0 ➡️ 1 ➡️ 0 ➡️ -1 ➡️ -2 ➡️ -3 ...
이렇게 되었다..
내 코드를 다시 자세히 살펴보았다....
어디서 잘못되었는가...
else
구문에서는 if
구문에서 save()
를 delete()
로만 바꾸면 될 줄 알았다.
💡💡 유 레 카 💡💡
좋아요를 취소하려면 이미 존재하는 NewsHeart
를 찾아 삭제해야하지만, 위에 코드에서는 새로운 NewsHeart
를 만들어서 삭제한다....
이렇게 되면 삭제되지 않은 기존 '좋아요'가 남아있어서, 실제 좋아요 개수가 이상하게 나온 것 같다..
else
구문에서
NewsHeart newsHeart = new NewsHeart(loginUser, news);
다시 생성을 한다. 그리고는 새로 생성한 것을 지운다........
착각했던 것 같다.
if (existHeart == null) {
NewsHeart newsHeart = new NewsHeart(loginUser, news);
news.increaseHeartCount();
newsHeartRepository.save(newsHeart);
} else {
news.decreaseHeartCount();
newsHeartRepository.delete(existHeart);
}
위 코드와 같이 수정해주었더니 내가 원하는 결과가 나왔다.
0 ➡️ 1 ➡️ 0 ➡️ 1 ➡️ 0 ...