어제는 오랜만에 일찍 체크아웃을 했습니다. 주특기인 스프링을 배우는 3주동안 거의 계속 새벽 2시, 3시 심하면 5시에 잠들었었거든요. 자바를 접한지 한달, 스프링을 접한지 3주동안 쉼없이 계속 달렸습니다. 일찍이라고 해봤자 사실 11시 반쯤 맥북프로를 닫았던 것 같습니다. 내일은 제 생일이라 오늘은 9시 칼퇴 예정입니다.
저는 이번에 진행하는 첫 미니프로젝트에서 좋아요 기능을 담당하고 있습니다. 고수분들(왜 취직 안하고 부트캠프에 온건지 심히 의문이 드는)이 많아서 조금 걱정이 되긴 합니다만 그래도 좋아요 기능 오늘 완성 했습니다.
그랬더니 조장님이 다른 미션을 던져 주셨네요.
게시판과 댓글을 연관관계 설정 하고 나서 게시글을 지우면 댓글도 다 같이 지워지게 CASCADE.REMOVE 를 사용했었는데 이를 사용하면 위험(?) 하다고 하니 다른 방법으로 DELETE 요청을 구현하라는 미션입니다. 일단 왜 CASCADE.REMOVE가 위험한지를 알아야겠네요. 다음주의 미션이고 일단은 어제 밤에 진행됐던 프론트앤드, 백앤드 간의 서버 통신 및 배포에 관한 세션을 복습 할 예정입니다.
아래는 오늘 구현 완료한 좋아요 기능 입니다. @Service 부분만 공유할게요.
LikeService
package com.hanghae99.catsanddogs.service;
import com.hanghae99.catsanddogs.dto.LikePostResponseDto;
import com.hanghae99.catsanddogs.dto.ResponseMessage;
import com.hanghae99.catsanddogs.entity.*;
import com.hanghae99.catsanddogs.exception.CustomException;
import com.hanghae99.catsanddogs.exception.ErrorCode;
import com.hanghae99.catsanddogs.repository.CommentRepository;
import com.hanghae99.catsanddogs.repository.LikeCommentRepository;
import com.hanghae99.catsanddogs.repository.LikePostRepository;
import com.hanghae99.catsanddogs.repository.PostRepository;
import com.hanghae99.catsanddogs.security.UserDetails.UserDetailsImpl;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Optional;
@Getter
@RequiredArgsConstructor
@Service
public class LikeService {
private final PostRepository postRepository;
private final CommentRepository commentRepository;
private final LikePostRepository likePostRepository;
private final LikeCommentRepository likeCommentRepository;
@Transactional
public boolean likePost(Long postId, User user) {
Post post = postRepository.findById(postId).orElseThrow(
() -> new CustomException(ErrorCode.CONTENT_NOT_FOUND)
);
Long userId = user.getId();
//좋아요 했는지 확인
Optional <LikePost> likePost = likePostRepository.findByPostIdAndUserId(postId, userId);
if (likePost.isPresent()) {
LikePost like = likePost.get();
likePostRepository.delete(like);
return false;
} else{
LikePost like = new LikePost(postId, userId);
likePostRepository.save(like);
return true;
}
}
public boolean likeComment(Long commentId, User user) {
Comment comment = commentRepository.findById(commentId).orElseThrow(
() -> new CustomException(ErrorCode.COMMENT_NOT_FOUND)
);
Long userId = user.getId();
Optional<LikeComment> likeComment = likeCommentRepository.findByCommentIdAndUserId(commentId, userId);
if(likeComment.isPresent()){
LikeComment like = likeComment.get();
likeCommentRepository.delete(like);
return false;
} else{
LikeComment like = new LikeComment(commentId, userId);
likeCommentRepository.save(like);
return true;
}
}
}
'TIL' 카테고리의 다른 글
TIL 스프링 좋아요 수 세기와 게시물 삭제 CASCADE 영속성 전이 221219 (0) | 2022.12.19 |
---|---|
TIL/WIL CORS 221218 (0) | 2022.12.19 |
TIL 첫 포트폴리오 프로젝트 시작 221216 (0) | 2022.12.17 |
TIL JPA 마스터의 길 게시글 댓글 연관 관계 만들기 221215 (0) | 2022.12.15 |
TIL CRUD 마스터의 길 3 게시판 댓글 기능 구현 221214 (0) | 2022.12.14 |