Spring boot

2024.10.17 Blog 프로젝트 만들기(JPA) 게시글 삭제 오류 해결 (미완성)

정훈5 2024. 10. 17. 10:13

 

마이콜로 로그인 후 삭제 요청 해보기

 

 

오류 발생 확인

 

 

 

 

 

fk 제약 조건 때문에 게시글을 삭제하면 댓글이 참조하는 게시글이 사라지기 때문에 삭제가 될 수 없음.

 

  • 어노테이션을 이용해서 도움 받기
  • 댓글의 FK에 값을 NULL로 변경하고 게시글 삭제
  • 댓글을 먼저 삭제하고, 게시글 삭제

cascade 설정 하기

Board.java 수정

// 해당 게시글이 삭제되면 종속되어 있던 댓글들을 먼저 삭제해라.
@OneToMany(mappedBy = "board", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)

private List<Reply> replies = new ArrayList<Reply>();

더보기
package com.tenco.blog_v1.board;

import com.tenco.blog_v1.reply.Reply;
import com.tenco.blog_v1.user.User;
import jakarta.persistence.*;
import lombok.*;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "board_tb")
public class Board {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 전략, DB 위임
    // 데이터베이스가 기본 키 값을 직접 관리하도록 위임
    private Integer id;
    private String title;

    @Lob // 대용량 데이터 저장 가능
    private String content;

    @ManyToOne(fetch = FetchType.LAZY) // EAGER 즉시 전략
    @JoinColumn(name = "user_id")
    private User user; // 게시글 작성자 정보

    // created_at 컬럼과 매핑하여, 이 필드는 데이터 저장시 자동으로 설정 됨
    @Column(name = "created_at", insertable = false, updatable = false)
    private Timestamp createdAt;

    // 코드 추가
    @Transient // 해당 테이블에 컬럼을 만들지 마 (테이블에 만들지 않음)
            // 즉, JPA 메모리 상에서만 활용 가능한 필드 메서드 이다.
    boolean isBoardOwner;

    // 해당 게시글이 삭제되면 종속되어 있던 댓글들을 먼저 삭제해라.
    @OneToMany(mappedBy = "board", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
    // 댓글 엔티티를 넣어서 관계 설정하면 -- 양방향
    private List<Reply> replies = new ArrayList<Reply>(); // 빠른 초기화

    @Builder
    public Board(Integer id, String title, String content, User user, Timestamp createdAt) {
        this.id = id;
        this.title = title;
        this.content = content;
        this.user = user;
        this.createdAt = createdAt;
    }

}

 

마이콜로 로그인

마이콜이 작성한 페이지 에서 삭제 댓글도 같이 삭제 된다.