JPA 연관 관계 설정

coldrice99·2024년 10월 16일
0

TIL: JPA에서 @OneToManyCascadeType을 사용한 연관 관계 설정

오늘은 JPA에서 일대다(1:N) 관계를 설정하는 방법과 Cascade 옵션을 통해 엔티티 간의 연관 관계를 관리하는 방법에 대해 배웠다.

1. @OneToMany@ManyToOne 연관 관계

@OneToMany@ManyToOne은 JPA에서 일대다 관계를 설정할 때 사용한다. 예를 들어, 하나의 Todo가 여러 개의 Comment를 가질 수 있을 때, 두 엔티티는 일대다(1:N) 관계로 연결된다.

  • @OneToMany: 부모 엔티티(여기서는 Todo)에 설정하며, 부모가 여러 자식(Comment)을 가질 수 있음을 의미한다.
  • @ManyToOne: 자식 엔티티(여기서는 Comment)에 설정하며, 여러 자식이 하나의 부모(Todo)와 연결됨을 의미한다.

2. cascade = CascadeType.ALL

Cascade는 부모 엔티티의 작업이 자식 엔티티에 어떻게 전파될지를 설정하는 옵션이다. CascadeType.ALL을 설정하면 부모 엔티티가 저장, 수정, 삭제될 때 자식 엔티티에도 동일한 작업이 자동으로 전파된다.

  • CascadeType.ALL: 부모 엔티티의 작업(저장, 수정, 삭제 등)이 자식 엔티티에 모두 적용된다.
  • orphanRemoval = true: 부모 엔티티가 삭제되면, 자식 엔티티도 함께 삭제된다. 즉, 부모가 없는 자식(고아 객체)을 자동으로 삭제해 준다.

3. 연관 관계 설정 코드 예시

@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에 연결된 고아 댓글(부모 없는 댓글)이 자동으로 삭제된다.

4. 연관 관계 설정의 장점

이러한 연관 관계 설정을 통해 부모와 자식 엔티티 간의 데이터 무결성을 유지할 수 있다. 예를 들어, 일정을 삭제할 때 해당 일정과 연관된 댓글들이 남아 있지 않도록 할 수 있으며, 데이터베이스에 불필요한 데이터가 남지 않는다.

5. 느낀 점

연관 관계 설정은 처음 배울 때 조금 복잡하게 느껴질 수 있지만, 실질적으로 구현해 보니 엔티티 간의 관계를 직관적으로 표현할 수 있다는 점에서 매우 유용했다. 특히, Cascade 옵션을 통해 부모-자식 관계의 엔티티들이 함께 처리될 수 있다는 점이 효율적이었다.


이번에 배운 JPA의 연관 관계 설정은 앞으로 데이터 무결성을 유지하고, 부모-자식 관계의 엔티티 간 작업을 간편하게 처리하는 데 큰 도움이 될 것이다.

profile
서두르지 않으나 쉬지 않고

0개의 댓글