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. 특이사항
'개발 일지' 카테고리의 다른 글
[TIL]이노베이션 캠프 69일차 (0) | 2022.10.08 |
---|---|
[TIL]이노베이션 캠프 68일차 (0) | 2022.10.07 |
[TIL]이노베이션 캠프 66일차 (0) | 2022.10.05 |
[TIL]이노베이션 캠프 65일차 (0) | 2022.10.04 |
[TIL]이노베이션 캠프 64일차 (0) | 2022.10.03 |