티스토리 뷰

728x90

JPA에서 1:N(One-to-Many) 관계는 자주 사용되는 개념 중 하나입니다. 이 관계는 하나의 엔티티가 여러 개의 다른 엔티티와 연결되어 있는 경우를 의미합니다. JPA에서 1:N 관계를 설정하는 방법을 기억하기 쉽게 단계별로 설명하겠습니다.


1. 1:N 관계란?

1:N 관계는 한 엔티티가 여러 개의 다른 엔티티와 연결된 관계를 말합니다.

  • 예시: 한 명의 부모(Parent)가 여러 명의 자식(Child)을 가질 수 있습니다. 이때 부모와 자식은 1:N 관계를 형성합니다.

2. 어노테이션 설정 방법

JPA에서 1:N 관계를 설정하려면 양쪽 엔티티에 적절한 어노테이션을 사용해야 합니다.

2.1 Parent 엔티티에서 @OneToMany 어노테이션 사용

Parent 엔티티는 여러 개의 Child 엔티티를 포함해야 하므로, 컬렉션(리스트 또는 셋) 형태로 자식 엔티티를 관리합니다.

@Entity
public class Parent {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 설정
    private Long id;

    private String name;

    // 자식 엔티티와의 관계 설정 (연관된 자식 엔티티들을 가짐)
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();

    // Getter, Setter 등 추가...
}
  • @OneToMany: 하나의 Parent가 여러 Child 엔티티를 가질 수 있다는 의미입니다.
  • mappedBy: Child 엔티티의 어떤 필드가 관계를 맺고 있는지를 명시합니다. 여기서는 Child 엔티티의 parent 필드가 관계를 정의합니다.
  • cascade = CascadeType.ALL: 부모가 저장, 삭제될 때 자식 엔티티들도 함께 저장 또는 삭제됩니다.
  • orphanRemoval = true: 부모 엔티티에서 자식 엔티티가 제거되면, 데이터베이스에서도 해당 자식 엔티티가 삭제됩니다.

2.2 Child 엔티티에서 @ManyToOne 어노테이션 사용

반대로, 자식 엔티티에서는 여러 자식이 하나의 부모를 가리키기 때문에 @ManyToOne 어노테이션을 사용합니다.

@Entity
public class Child {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 기본 키 설정
    private Long id;

    private String name;

    // 부모 엔티티와의 다대일 관계 설정
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Parent parent;

    // Getter, Setter 등 추가...
}
  • @ManyToOne: 여러 Child 엔티티가 하나의 Parent와 연결될 수 있음을 나타냅니다.
  • fetch = FetchType.LAZY: 부모 엔티티는 실제로 필요할 때만 로딩되도록 설정해 성능을 최적화합니다.
  • @JoinColumn(name = "parent_id"): Child 테이블에서 Parent 엔티티의 외래 키 컬럼을 parent_id로 설정합니다.

3. 설정 요약

  • Parent 엔티티:
    • @OneToMany로 자식 엔티티와의 관계 설정.
    • mappedBy로 자식 엔티티에서 관계를 맺고 있는 필드 지정.
    • cascadeorphanRemoval로 자식 엔티티의 생명 주기를 부모와 함께 관리.
  • Child 엔티티:
    • @ManyToOne으로 부모 엔티티와의 관계 설정.
    • @JoinColumn으로 외래 키를 지정.

4. 기억하기 쉬운 팁

  • Parent 엔티티에서는 "부모가 여러 자식(Children)을 관리한다" → @OneToMany 사용.
  • Child 엔티티에서는 "자식이 하나의 부모(Parent)를 가리킨다" → @ManyToOne 사용.
  • mappedBy는 부모-자식 관계에서 자식 엔티티에서 부모를 참조하는 필드의 이름을 가리킵니다.

5. mappedBy는 무엇인가?

mappedBy양방향 관계에서 어느 엔티티가 관계의 주체(Owner)인지 결정하는 데 사용됩니다. 즉, 양방향 관계에서 외래 키를 관리하는 주체는 한쪽 엔티티에만 있고, 반대쪽 엔티티는 외래 키 필드를 갖고 있지 않습니다.

mappedBy 설정 예시

@Entity
public class Parent {

    @OneToMany(mappedBy = "parent")
    private List<Child> children;
}
@Entity
public class Child {

    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;  // Parent에서 mappedBy로 참조되는 필드
}
  • mappedByDB 테이블의 컬럼이 아니라, 엔티티 클래스의 필드 이름을 사용합니다. 따라서 mappedBy = "parent"Child 엔티티parent 필드를 참조하고 있습니다.

6. 간단 예시

  • 부모(Parent)자식(Child) 관계를 생각해보세요. 부모는 여러 명의 자식을 가지고 있고, 각 자식은 부모를 가리키고 있습니다. 이 관계를 설정할 때, 부모는 자식들을 관리하며, 자식은 자신이 어느 부모에 속해 있는지를 명시합니다.

이렇게 하면 JPA에서 1:N 관계를 쉽게 설정할 수 있습니다. 양방향 관계에서는 항상 관계의 주인과 종속을 고려해야 하며, 성능 최적화와 데이터 무결성을 위해 관계 설정을 신중히 해야 합니다.

블로그 글로 활용하기 위해 중요한 개념들을 간단하고 직관적으로 설명했습니다. 필요에 따라 예시 코드와 설정 방법을 더 구체적으로 추가하거나, 각 상황에 맞는 다양한 설정 옵션을 소개할 수 있습니다.

728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함