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는 자동으로 삭제된다.