개인 프로젝트/블로그

댓글 삭제 구현 로직 생각 및 구현

공주맛밤 2022. 7. 29. 16:59

순서도 그리는 법을 까먹어서 알아볼수있을 정도만...다시 공부해야겠다..

<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로 할 수 있도록 하자...)>

게시글 1의 댓글들

<부모와 대댓글이 있는 댓글을 지우면?>

부모와 대댓글이 있는 댓글을 지우면?
content가 날라가고 deletable이 true가됨

<대댓글이 없고 부모가 deletable인데 삭제한다면?>

대댓글이 없고 부모가 deletable인데 삭제한다면?
부모와 함께 삭제됨

<부모가 deletable이 false고 대댓글이 없다면?>

부모가 deletable이 false고 대댓글이 없다면?
본인만 삭제

<부모와 대댓글이 모두 없다면?>

부모와 대댓글이 모두 없다면?

728x90
반응형