TIL ... day 32 6주차 - day 4. 참조 무결성 제약조건 … 22.06.15

BYEONGMIN CHOI·2022년 6월 14일
0

TIL(Today I Learned)

목록 보기
20/24

미니프로젝트를 진행하면서 발생한 이슈에 대해 이야기 해보려합니다.

위 사진은 프로젝트에 사용하는 ERD 입니다.

게시글 삭제 기능을 구현하면서 발생한 문제이기 때문에 위 사진을 보여드렸습니다.

연관관계 매핑이 되어있는 entity의 경우 삭제가 발생하였을때 데이터베이스의 참조 무결성 제약조건을 따라야 하는 것을 알게 되었습니다.

즉 저의 경우는 BookReview 라는 데이터베이스를 삭제하기 위해선 자식 테이블인 BoardLike 데이터베이스의 삭제를 하고 BookReview를 삭제를 해야하는 상황이였습니다.

참조 무결성 제약조건을 지키기 위한 방법으로는

1. 자식테이블인 BoardLike가 가지고 있는 BookReview 의 PK 값을 제거하고 부모테이블인 BookReview를 delete 하는 방법

2. 부모테이블인 BookReview에 영속성전이를 부여하여 부모가 삭제되면 자식의 FK를 같이 삭제하는 방법

-> 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 일 때가 좋아요를 하지 않은 상태
    
    ...

무결성 제약조건

데이터베이스에 저장된 데이터는 결함이 없어야 하며 질의에 대해 신뢰성 있는 답을 제공해야함
따라서 데이터를 저장하는데 있어서 데이터베이스는 일관성을 유지하고 중복을 제거하는 등 데이터의 신뢰도를 유지해야한다. 따라서 삽입, 수정, 삭제 시 여러 가지 제약조건이 따른다.

  • 데이터 무결성(integrity)은 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말한다.

도메인 무결성 제약 조건(Domain Integrity Constraint)

  • 도메인 제약이라고도 하며, 릴레이션 내의 투플들이 각 속성의 도메인에 지정된 값만을 가져야 한다는 제약조건
  • 속성 값과 관련된 무결성으로, SQL 문에서 데이터 형식(type), 널(null/not null), 기본 값(default), 체크(check) 등을 사용하여 지정

개체 무결성 제약조건(Entity Integrity Constraint)

  • 기본키 제약(primary constraint)이라고도 한다.
  • 릴레이션은 기본키를 지정하고 그에 따른 무결성 원칙인 기본키는 NULL값을 가져서는 안된다.
  • 릴레이션 내에 오직 하나의 값만 존재해야한다는 제약조건

참조 무결성 제약조건 (Referential Integrity Constraint)

  • 외래키 제약 (foreign key constraint)이라고도 한다.
  • 릴레이션 간의 참조 관계를 선언하는 제약조건
  • 부모 릴레이션(기본키가 참조되는 릴레이션) 과 자식 릴레이션(기본키를 참조하는 릴레이션)의 관계에서 참조 무결성 제약조건은 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야하며, 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받는다.
  • 부모 릴레이션의 도메인과 다른 값으로 삽입, 수정될 때 거부되고, 반대로 자식 릴레이션에서 참조하고 있는 값을 부모 릴레이션에서 삭제하거나 다른 값으로 변경하려고 하면 거부된다.
profile
스스로 성장하는 개발자가 되겠습니다.

0개의 댓글