본문 바로가기
Sparta 내일배움캠프 Java 5기/[최종 프로젝트] 커뮤니티 서비스 Team Project ✓ 2024. 7. 24.

(24.07.23) 코드 리뷰 게시글 수정/삭제 기능 구현 + 코드 리뷰 댓글 생성/수정/삭제 기능 구현 + 댓글 좋아요 추가/삭제 기능 구현

코드 리뷰 CodeReview

코드 리뷰 CodeReviews 게시글 수정 기능

// CodeReviews 엔터티
...
@Column(nullable = false)
  private String title;

  @Column(nullable = false)
  private String category;

  @Column(nullable = false)
  private String contents;

  @Column
  private String code;
...
public void updateCodeReview(CodeReviewsRequestDto codeReviewsRequestDto) {
    this.title = codeReviewsRequestDto.getTitle();
    this.contents = codeReviewsRequestDto.getContents();
  }

  public void updateCategory(String category) {
    this.category = category;
  }

  public void updateCode(String code) {
    this.code = code;
  }
  • 엔터티 자체에 Request DTO로 받은 수정된 제목/내용(Contents) 지정하는 update 메서드를 사용
  • category는 Service 단에서 소문자로, 빈칸 없게끔 하는 Arrange 로직이 있기 때문에 따로 빼서 update 메서드를 생성
  • code역시 S3 ( 개발상 MinIO) 에서 새롭게 수정된 코드가 파일로 올라가 기본적으로 덮어쓰기가 될 수 있고, 기본적으로 생성시 이 코드 파일의 이름으로 저장을 했지만 -> 추후 코드의 분류에 따라 확장자가 달라질 수 있을 것이라고 기능이 확장할 가능성을 두고 파일 이름=code 필드값도 따로 update 메서드로 수정할수 있도록 분리를 했음

코드 리뷰 CodeReviews 게시글 삭제 기능

@Transactional
public void deleteCodeReview(Long codeReviewsId, Users user) {

    ...

    foundCodeReviews.delete();
  }
// CodeReviews 엔터티
@Table(name = "codereviews")
public class CodeReviews extends Timestamped {
...
@Enumerated(EnumType.STRING)
  @Column(nullable = false)
  private Status status;
...
public enum Status {
    ACTIVE,
    DELETED;
  }

  public void delete() {
    this.status = Status.DELETED;
  }
...
  • DB 자체에서 데이터를 완전히 삭제를 하는 것이 아니라 엔터티에 상태 Status Enum 필드를 지정을 해서 delete() 메서드를 통해서 상태를 변경할 수 있도록 함
    • 따라서, 조회나 수정할시 Status가 DELTED 된 상태의 게시글은 제외하고 불러오는 쿼리를 사용할 수 있도록 해야함

코드 리뷰 댓글 CodeReviewComment

코드 리뷰 댓글 CodeReviewComments 생성/수정/삭제

  • 코드 리뷰 댓글은 따로 조회하는 API 없이 코드 리뷰 게시글 단건 조회시 리스트로 부여될 수 있도록 설정
  • 수정/삭제 역시 22일, 23일 과 같이 동일한 CRUD 형식으로 제작

댓글 좋아요 추가/삭제 기능 구현 

@PostMapping("/codereviews/{codeReviewsId}/comments/{codeReviewCommentsId}/like")
  public ResponseEntity<MessageResponse> setLike(...) {

    String responseMessage = likesService.setLike(...);

    return ResponseEntity.status(HttpStatus.OK)
        .body(new MessageResponse(200, responseMessage));
  }
  • FE 단에서 사용자가 댓글 오른쪽에 위치해있는 좋아요 버튼을 누를 때 마다 좋아요가 추가/삭제 되는 토글 형식으로 진행되기 때문에 API를 통합하여 Toggle 형태의 API를 작성
@Transactional
  public String setLike(Long codeReviewsId, Long codeReviewCommentsId, Users user) {

   ...
   
    Likes foundLike = likesRepository.findByUserIdAndCodeReviewCommentId(foundUser.getId(),
        codeReviewCommentsId);

    if (foundLike == null) {
      Likes like = Likes.builder()
          .status(Likes.Status.LIKED)
          .user(foundUser)
          .codeReviewComment(foundCodeReviewComments)
          .build();

      likesRepository.save(like);

      return "코드 리뷰 댓글 좋아요 추가 완료";
    } else if (foundLike.getStatus().equals(Likes.Status.LIKED)) {
      foundLike.removeLike();
      return "코드 리뷰 댓글 좋아요 삭제 완료";
    } else {
      foundLike.addLike();
      return "코드 리뷰 댓글 좋아요 추가 완료";
    }
  }

...
public class Likes {
..
  @Enumerated(EnumType.STRING)
  @Column(nullable = false)
  private Status status;
 ...
  public enum Status {
    LIKED,
    UNLIKED;
  }

  public void addLike() {
    this.status = Status.LIKED;
  }

  public void removeLike() {
    this.status = Status.UNLIKED;
  }
}
  • 따라서 Likes 객체에서 로그인 한 사용자가 특정 댓글에 대해서 URL을 통한 요청이 들어올 때,
    • 객체가 없을 경우 : 새롭게 만들어서 저장 - CodeReviews 와 마찬가지로 Status Enum 필드에서 LIKED
    • 객체가 있을 경우 :  저장되어있던 Likes상태에 따라서 Status를 변경하는 removeLike(), addLike()를 각각 사용