본문 바로가기

개발 일지

[TIL]이노베이션 캠프 67일차

1. 개발 진행 상황

post 찜하기 기능  코드 리팩토링

 

기존 코드

 

// Post
    @ColumnDefault("0")
    @Min(0)
    private int heart;
    
    // 코스(게시글) 찜하기
    public void addHeart() {
        this.heart += 1;
    }

    // 코스(게시글) 찜하기 취소
    public void deleteHeart() {
        this.heart -= 1;
    }
    
    
 // Service   
    // 코스(게시글) 찜하기
    @Transactional
    public CourseHeartResponseDto addPostHeart(Long courseId, Member member) {
        Post post = postRepository.findById(courseId).orElseThrow(
                () -> new BusinessException("존재하지 않는 course id 입니다.", ErrorCode.POST_NOT_EXIST)
        );

        if (courseHeartRepository.findByPostAndMember(post, member).isPresent()) {
            throw new BusinessException("이미 찜한 course 입니다.", ErrorCode.ALREADY_HEARTED);
        }

        courseHeartRepository.save(new CourseHeart(post, member));

        post.addHeart();
        postRepository.save(post);

        return new CourseHeartResponseDto(post, member);

    }

    // 코스(게시글) 찜하기 취소
    @Transactional
    public void deletePostHeart(Long courseId, Member member) {
        Post post = postRepository.findById(courseId).orElseThrow(
                () -> new BusinessException("존재하지 않는 course id 입니다.", ErrorCode.POST_NOT_EXIST)
        );
        Optional<CourseHeart> heartOptional = courseHeartRepository.findByPostAndMember(post, member);

        if (heartOptional.isEmpty()) {
            throw new BusinessException("찜하지 않은 course 입니다.", ErrorCode.HEART_NOT_FOUND);
        }

        courseHeartRepository.delete(heartOptional.get());

        post.deleteHeart();
        postRepository.save(post);
    }

 

❗️문제점 1. 좋아요 기능을 누르면 좋아요한 post, member정보를 heartRepository에 저장하고 post에 heart개수를 1씩 늘려서 총 합계를 반영(삭제도 마찬가지)

 

✅ 해결

  count()를 이용해서 직접 1씩증가하지않고 저장된 개수를 구해서 post의 좋아요 총 개수를 나타냄

 

✅  코드 수정하면서 추가로 수정한 것

add, delete 후 Repository를 추가로 save했었는데, 따로 save없이 add, delete동작만으로도 데이터가 저장되므로 save삭제

 

수정한 코드

// Post
// 코스(게시글) 찜하기 합계 저장
    public void addCountHeart(int countHeart) {
        this.heart = countHeart;
    }
    
// Service
// 코스(게시글) 찜하기
    @Transactional
    public CourseHeartResponseDto addPostHeart(Long courseId, Member member) {
        Post post = postRepository.findById(courseId).orElseThrow(
                () -> new BusinessException("존재하지 않는 course id 입니다.", ErrorCode.POST_NOT_EXIST)
        );

        if (courseHeartRepository.findByPostAndMember(post, member).isPresent()) {
            throw new BusinessException("이미 찜한 course 입니다.", ErrorCode.ALREADY_HEARTED);
        }

        courseHeartRepository.save(new CourseHeart(post, member));
        int countHeart = courseHeartRepository.findCountHeart(courseId);

        post.addCountHeart(countHeart);

        return new CourseHeartResponseDto(post, member);

    }

    // 코스(게시글) 찜하기 취소
    @Transactional
    public void deletePostHeart(Long courseId, Member member) {
        Post post = postRepository.findById(courseId).orElseThrow(
                () -> new BusinessException("존재하지 않는 course id 입니다.", ErrorCode.POST_NOT_EXIST)
        );
        Optional<CourseHeart> heartOptional = courseHeartRepository.findByPostAndMember(post, member);

        if (heartOptional.isEmpty()) {
            throw new BusinessException("찜하지 않은 course 입니다.", ErrorCode.HEART_NOT_FOUND);
        }

        courseHeartRepository.delete(heartOptional.get());
        int countHeart = courseHeartRepository.findCountHeart(courseId);

        post.addCountHeart(countHeart);

    }
    

// Repository
    // Heart Count 구하기
    @Query(value = "SELECT COUNT(c.heart) FROM CourseHeart c WHERE c.post.id = :CourseId")
    int findCountHeart(Long CourseId);

 

2. 개발 중 발생한 이슈와 해결

3. 새로 배운 것

4. 참고 레퍼런스

5. 오늘 한 일 / 회고

6. TO-DO LIST

7. 특이사항