본문 바로가기
💻 뚝딱뚝딱/북북클럽

[개발일지 #025] 좋아요(Like) 토글 기능으로 변경하기

by 뚜루리 2025. 5. 1.
728x90
320x100

🎯 오늘의 목표

  • 좋아요 기능을 토글기능으로 변경하기

⚙️ 진행한 작업

  • LikeService 수정
  • LikeController 수정

🛠️ 개발 내용

  • 기존 좋아요 누르기/좋아요 취소로 나뉘어져 있던 좋아요 기능을 하나로 합쳐 토글기능으로 변경할 예정

왜 변경하나요?

  • 기존에는 두 개의 엔드포인트가 필요했는데 토글 방식으로 전환하면 API 인터페이스가 단순해짐
  • 기존 방식에는 좋아요 상태를 먼저 조회한 후, 상태에 따라 API 호출이 필요했는데, 토글 방식은 내부에서 상태를 확인하고, 처리하기 때문에 클라이언트가 별도의 상태를 확인없이 호출 할수 있어 로직이 명확함

 

📌 LikeService 수정

    /**
     * 좋아요 토글 기능
     * - 이미 좋아요 되어 있으면 삭제 (취소)
     * - 좋아요 안 되어 있으면 생성
     *
     * @param user 사용자
     * @param feedId 피드 ID
     * @return 토글 후 상태 (true: 좋아요됨, false: 좋아요 취소됨)
     */
    @Transactional
    public boolean toggleLike(User user, Long feedId) {
        // 피드 존재 여부 확인
        Feed feed = feedRepository.findById(feedId)
                .orElseThrow(() -> new LikeException(ErrorCode.FEED_NOT_FOUND));

        // 좋아요가 이미 존재하면 삭제, 없으면 생성
        return likeRepository.findByUserIdAndFeedId(user.getId(), feedId)
                .map(existingLike -> {
                    likeRepository.delete(existingLike);
                    return false;
                })
                .orElseGet(() -> {
                    likeRepository.save(Like.create(user, feed));
                    return true;
                });
    }

 

📌 LikeController 수정

@PostMapping("/{feedId}/likes")
public ResponseEntity<ApiResponse<String>> toggleLike(@PathVariable Long feedId,
                                                      @AuthenticationPrincipal CustomUserDetails userDetails) {
    User user = userDetails.getUser();
    boolean liked = likeService.toggleLike(user, feedId);
    String message = liked ? "좋아요를 눌렀습니다." : "좋아요를 취소했습니다.";
    return ResponseEntity.ok(ApiResponse.success(message));
}
728x90
320x100