Sparta 내일배움캠프 Java 5기/[최종 프로젝트] 커뮤니티 서비스 Team Project ✓
(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()를 각각 사용
'Sparta 내일배움캠프 Java 5기 > [최종 프로젝트] 커뮤니티 서비스 Team Project ✓' 카테고리의 다른 글
(24.07.26) CI/CD 파이프 라인 구상 및 테스트 코드 점검 (0) | 2024.07.26 |
---|---|
(24.07.26) 코드 리뷰 기능(게시글, 댓글, 좋아요) 테스트 코드 작성 (0) | 2024.07.26 |
(24.07.24) 코드 리뷰 게시글 조회 & 카테고리 검색 기능 구현 (1) | 2024.07.24 |
(24.07.22) 코드 리뷰 게시글 생성 기능 구현 (1) | 2024.07.23 |
(24.07.19) Project S.A. 작성 (0) | 2024.07.19 |