java 배우기/TIL

Spring 좋아요 중복 방지

checkuu 2024. 9. 3. 22:40

한 유저가 같은 게시글에 좋아요를 중복으로 하지 못하게 만드려고 했으나, 또 작동해도 좋아요가 생성되어 계속 중복되는 현상이 생김

public void likePost(Long postId,AuthUser authUser) {
        User user = userRepository.findById(authUser.getUserId()).orElseThrow(() -> new NullPointerException("해당 유저가 존재 하지 않습니다."));
        Post post = postRepository.findById(postId).orElseThrow(() -> new NullPointerException("해당 게시글이 존재하지 않습니다."));

        //게시글의 유저가 있는지 확인 그리고 해당게시글의 유저id와 좋아요 하려는 유저가 같은 사람인지 확인하는 조건문
        if(post.getUser() != null && ObjectUtils.nullSafeEquals(user.getId(),post.getUser().getId())) {
            throw new NullPointerException("자신이 작성한 게시글에는 좋아요를 누를 수 없습니다.");
        }//같은사람이 아니라면 like를 저장

        likesRepository.save(new Likes(user,post));
        post.increaseLikeCount();
    }

좋아요를 생성하는 메서드코드인데, 코드를 만들 당시 게시글을 만든 유저가 해당게시글에는 좋아요를 못하도록 하는 조건만 주고 좋아요를 중복을 방지하는 조건을 빼먹고 끝냈다.

그래서 코드를 추가해 주었다.

 

public void likePost(Long postId, AuthUser authUser) {
        User user = userRepository.findById(authUser.getUserId()).orElseThrow(() -> new NullPointerException("해당 유저가 존재 하지 않습니다."));
        Post post = postRepository.findById(postId).orElseThrow(() -> new NullPointerException("해당 게시글이 존재하지 않습니다."));

        //게시글의 유저가 있는지 확인 그리고 해당게시글의 유저id와 좋아요 하려는 유저가 같은 사람인지 확인하는 조건문
        if (post.getUser() != null && ObjectUtils.nullSafeEquals(user.getId(), post.getUser().getId())) {
            throw new NullPointerException("자신이 작성한 게시글에는 좋아요를 누를 수 없습니다.");
        }//같은사람이 아니라면 like를 저장

        if (likesRepository.findByUserAndPost(user, post).isPresent()) {
            throw new NullPointerException("이미 좋아요한 게시글 입니다.");
        } //이미 좋아요한 이력이 있는 게시글이면 좋아요 못하게 방지

        likesRepository.save(new Likes(user, post));
        post.increaseLikeCount();
    }

likeRepository에서 user와 post를 찾아서 이미 같은 조건이 있으면 예외를 보내게 하는 조건문을 달아서 해결했다.