순서도 그리는 법을 까먹어서 알아볼수있을 정도만...다시 공부해야겠다..
<reply 모델 수정>
package tnut.blogback.model;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Reply { //댓글에 담길 내용: 닉네임(유저), 댓글 내용, 대댓글, 해당 게시글
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Lob
private String content;
@Column(columnDefinition = "boolean default false")
private boolean isDeletable;
@ManyToOne
@JsonIgnore
@JoinColumn(name = "부모댓글 id")
private Reply parentReply;
@OneToMany(mappedBy = "parentReply", fetch = FetchType.LAZY)
@OrderBy("id asc ")
private List<Reply> subReplies = new ArrayList<>();
@ManyToOne //하나의 보드에 여러 댓글
@JsonIgnore //댓글에선 보드의 정보가 필요 없음
@JoinColumn(name = "보드 id")
private Board board;
@CreationTimestamp
private Timestamp createDate;
}
<reply service> : 삭제 서비스
@Transactional
public String replyDelete(Long id) { //댓글 삭제 DeleteMapping
Reply replyEntity = replyRepository.findById(id)
.orElseThrow(() -> new IllegalArgumentException("이미 삭제된 댓글입니다."));
if (!replyEntity.getSubReplies().isEmpty()) { //자식이 있을경우
replyEntity.setContent(null); //내용을 비우고
replyEntity.setDeletable(true); //삭제 가능상태로 업데이트
} else { //자식이 없을 경우
replyRepository.deleteById(id); //삭제 대상은 삭제하고
replyRepository.flush(); //플러쉬 하지 않으면 삭제가 맨 마지막에 DB에서 처리 되기 때문에 부모댓글의 대댓글이 존재한 채로 다음 로직이 먼저 실행
if (replyEntity.getParentReply() == null) {
return "success delete!";
} else {
if (replyEntity.getParentReply().isDeletable()) {
replyDelete(replyEntity.getParentReply().getId()); //부모에 대한 삭제도 진행
}
}
}
return "success delete!";
}
<댓글 삭제 요청 controller>
@DeleteMapping("/api/reply/{id}/delete") //댓글 삭제
public ResponseDto<?> replyDelete (@PathVariable Long id) {
return new ResponseDto<>(HttpStatus.OK.value(), replyService.replyDelete(id));
}
<잘 작동하나 postman에서 확인(꼭 junit test로 할 수 있도록 하자...)>
<부모와 대댓글이 있는 댓글을 지우면?>
<대댓글이 없고 부모가 deletable인데 삭제한다면?>
<부모가 deletable이 false고 대댓글이 없다면?>
<부모와 대댓글이 모두 없다면?>
728x90
반응형
'개인 프로젝트 > 블로그' 카테고리의 다른 글
네이버 카카오 Oauth2.0 로그인 구현 (0) | 2022.08.01 |
---|---|
댓글 수정 구현 + react에서 수정,삭제하기 (0) | 2022.07.31 |
대대ㅅ댓..글 구현(save) (2) | 2022.07.25 |
jpa 대댓글 삭제에 대한 고민 (0) | 2022.07.24 |
react 조건부 렌더링 (0) | 2022.07.23 |