[스프링부트] @OneToMany, mappedBy, cascade, orphanRemoval

원서연·2023년 12월 20일
0

Member 엔티티에서는 @OneToMany, Post 엔티티에서는 @ManyToOne을 지정
(각각 일대다, 다대일 연관관계 설정)

@OneToMany(mappedBy = "author", cascade = CascadeType.REMOVE, orphanRemoval = true)

👉mappedBy

  • 연관관계를 양방향 관계로 설정한다.
  • 만약 mappedBy 속성을 설정하지 않으면, 단방향 관계가 된다.
    이러면 양쪽에서 서로 외래키를 갖고 있게 되고, 데이터베이스 설계가 복잡해진다.
  • 일대다 단방향 매핑은 보통 권장되지 않는다. 가능하면 양방향 매핑을 사용한다.
  • mappedBy 속성을 사용하여 연관관계의 주인을 명시하는 것이 좋다.
    (외래키를 갖고 있는 엔티티를 연관관계의 주인이라고 표현)
  • ManyToOne 필드를 갖고 있는 엔티티(Post)에서 외래키를 갖고 있기 때문에
    Post 엔티티가 연관관계의 주인이라고 할 수 있다.

👉cascade = CascadeType.REMOVE

  • cascade = CascadeType.REMOVE(삭제)Member 엔티티(부모)가 삭제될 경우, 연관된 Post 엔티티(자식)들도 삭제된다.
  • CascadeType은 PERSIST(저장), ALL(전체) 등 여러가지가 더 있다.
  • 그 중에서 ALL은 모든 걸 포함하게 한다.
  • 따라서 ALL을 지정하면 REMOVE를 지정한 기능도 갖게 된다.

👉orphanRemoval = true

  • orphan은 '고아'라는 의미
  • orphanRemoval은 Cascade.Type과 다르다.
  • Member 엔티티와 연관관계가 끊어진 Post 엔티티를 자동으로 삭제하는 기능을 수행한다.
  • 예를 들면 Member 엔티티의 Post 목록에서 특정 Post를 제거하면, 그 Post는 Member와의 연관관계가 끊어진 상태가 된다. 이 때 orphanRemoval 옵션 설정으로 인해 해당 Post는 자동으로 삭제된다.
profile
웹 백엔드 프로그래밍 Today I Learned

0개의 댓글