@OneToMany
와 CascadeType
을 사용한 연관 관계 설정오늘은 JPA에서 일대다(1:N) 관계를 설정하는 방법과 Cascade 옵션을 통해 엔티티 간의 연관 관계를 관리하는 방법에 대해 배웠다.
@OneToMany
와 @ManyToOne
연관 관계@OneToMany
와 @ManyToOne
은 JPA에서 일대다 관계를 설정할 때 사용한다. 예를 들어, 하나의 Todo
가 여러 개의 Comment
를 가질 수 있을 때, 두 엔티티는 일대다(1:N) 관계로 연결된다.
@OneToMany
: 부모 엔티티(여기서는 Todo
)에 설정하며, 부모가 여러 자식(Comment
)을 가질 수 있음을 의미한다.@ManyToOne
: 자식 엔티티(여기서는 Comment
)에 설정하며, 여러 자식이 하나의 부모(Todo
)와 연결됨을 의미한다.cascade = CascadeType.ALL
Cascade는 부모 엔티티의 작업이 자식 엔티티에 어떻게 전파될지를 설정하는 옵션이다. CascadeType.ALL
을 설정하면 부모 엔티티가 저장, 수정, 삭제될 때 자식 엔티티에도 동일한 작업이 자동으로 전파된다.
CascadeType.ALL
: 부모 엔티티의 작업(저장, 수정, 삭제 등)이 자식 엔티티에 모두 적용된다.orphanRemoval = true
: 부모 엔티티가 삭제되면, 자식 엔티티도 함께 삭제된다. 즉, 부모가 없는 자식(고아 객체)을 자동으로 삭제해 준다.@Entity
public class Todo extends Timestamped {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "todo", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Comment> comments;
// 기타 필드 및 메서드 생략
}
mappedBy = "todo"
: Comment
엔티티에 있는 todo
필드와 매핑되었음을 나타낸다.cascade = CascadeType.ALL
: Todo
가 삭제되면 관련된 모든 Comment
도 함께 삭제된다.orphanRemoval = true
: Todo
가 삭제되면 해당 Todo
에 연결된 고아 댓글(부모 없는 댓글)이 자동으로 삭제된다.이러한 연관 관계 설정을 통해 부모와 자식 엔티티 간의 데이터 무결성을 유지할 수 있다. 예를 들어, 일정을 삭제할 때 해당 일정과 연관된 댓글들이 남아 있지 않도록 할 수 있으며, 데이터베이스에 불필요한 데이터가 남지 않는다.
연관 관계 설정은 처음 배울 때 조금 복잡하게 느껴질 수 있지만, 실질적으로 구현해 보니 엔티티 간의 관계를 직관적으로 표현할 수 있다는 점에서 매우 유용했다. 특히, Cascade 옵션을 통해 부모-자식 관계의 엔티티들이 함께 처리될 수 있다는 점이 효율적이었다.
이번에 배운 JPA의 연관 관계 설정은 앞으로 데이터 무결성을 유지하고, 부모-자식 관계의 엔티티 간 작업을 간편하게 처리하는 데 큰 도움이 될 것이다.