미니프로젝트를 진행하면서 발생한 이슈에 대해 이야기 해보려합니다.
위 사진은 프로젝트에 사용하는 ERD 입니다.
게시글 삭제 기능을 구현하면서 발생한 문제이기 때문에 위 사진을 보여드렸습니다.
연관관계 매핑이 되어있는 entity의 경우 삭제가 발생하였을때 데이터베이스의 참조 무결성 제약조건을 따라야 하는 것을 알게 되었습니다.
즉 저의 경우는 BookReview 라는 데이터베이스를 삭제하기 위해선 자식 테이블인 BoardLike 데이터베이스의 삭제를 하고 BookReview를 삭제를 해야하는 상황이였습니다.
참조 무결성 제약조건을 지키기 위한 방법으로는
-> 2번의 방법을 사용하여 문제를 해결하였다.
@Entity
public class BookReview extends Timestamped {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "REVIEW_ID")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private User user;
@Column(nullable = false)
private String title;
@Column(nullable = false)
private String bookBuyUrl;
@Column
private String bookImageUrl;
@Column(nullable = false)
private String content;
@Column
private Integer likeCount;
@Column(nullable = false)
private Integer ranking;
// 부모 데이터베이스에 영속성전이를 하여 참조 무결성 제약조건을 만족시킴 ( BookReview 삭제 수정시 )
@OneToMany(mappedBy = "bookReview", cascade = CascadeType.ALL)
private List<LikeBookReview> likeBookReviews = new ArrayList<>();
...
@Entity
public class LikeBookReview extends Timestamped{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "USER_BOOKREVIEW_ID")
private Long id;
// 양방향 매핑시 순환참조 방지
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID")
private User user;
@JsonBackReference
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "BOOK_REVIEW_ID")
private BookReview bookReview;
@Column(name = "LIKE_STATUS")
private Boolean likeStatus; // true 일 때가 좋아요를 하지 않은 상태
...
데이터베이스에 저장된 데이터는 결함이 없어야 하며 질의에 대해 신뢰성 있는 답을 제공해야함
따라서 데이터를 저장하는데 있어서 데이터베이스는 일관성을 유지하고 중복을 제거하는 등 데이터의 신뢰도를 유지해야한다. 따라서 삽입, 수정, 삭제 시 여러 가지 제약조건이 따른다.
자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야하며, 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받는다.