상세 컨텐츠

본문 제목

연관 관계(OneToMany, ManyToOne)

JPA

by 코코코차 2024. 6. 1. 18:02

본문

728x90

1. 단방향 관계
단방향 관계는 한쪽 엔티티만 다른 엔티티를 참조하는 관계를 말한 다. 즉, A 엔티티가 B 엔티티를 참조하지만, B 엔티티는 A 엔티티를 참조하지 않는 경우를 뜻한 다.

단방향 OneToMany 예시:

@Entity
public class Parent {
    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "parent_id") // FK가 자식 테이블에 생성됨
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

 

  • Parent 엔티티가 OneToMany 관계를 정의
  • @JoinColumn(name = "parent_id")를 통해 Child 테이블에 parent_id라는 외래 키(FK)가 생성
  • cascade = CascadeType.ALL 설정으로 Parent 엔티티의 변경이 Child 엔티티에도 전파
  • orphanRemoval = true 설정으로 Parent 엔티티에서 Child 엔티티가 제거되면, 해당 Child 엔티티도 자동으로 삭제
  • 이 예시에서 Parent 엔티티가 관계의 주인이며, 외래 키는 Child 테이블에 존재

 


단방향 ManyToOne 예시:

@Entity
public class Child {
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

@Entity
public class Parent {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
}

 

  • Child 엔티티가 ManyToOne 관계를 정의
  • @JoinColumn(name = "parent_id")를 통해 Child 테이블에 parent_id라는 외래 키(FK)가 생성
  • Child 엔티티는 Parent 엔티티를 참조하지만, Parent 엔티티는 Child 엔티티를 참조하지 않는다.
  • 이 예시에서 Child 엔티티가 관계의 주인이며, 외래 키는 Child 테이블에 존재

 

 

 

 

Cascade Type에 대해 잘 모른다면 참고하세요

https://cococotea.tistory.com/14

 

JPA에서 Cascade Type을 지정하지 않으면?

Cascade Type이란?JPA에서의 Cascade Type은 엔티티 간의 연관 관계에서 특정 작업(저장, 삭제 등)이 연관된 엔티티에도 전파되도록 설정하는 옵션 Cascade Type을 통해 부모 엔티티에 대한 작업이 자식 엔

cococotea.tistory.com

 


2. 양방향 관계

 

양방향 관계는 두 엔티티가 서로를 참조하는 관계를 말한다.

 

즉, A 엔티티가 B 엔티티를 참조하고, 동시에 B 엔티티도 A 엔티티를 참조하는 경우를 뜻한다.

 

사실 양방향 관계라는 것은 없고 단방향이 서로를 마주보고 있는것이다.

 

양방향 관계는 양쪽 엔티티에서 서로를 참조할 수 있어 더 복잡한 관계를 표현할 수 있 다.

양방향 OneToMany 예시:

@Entity
public class Parent {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}


여기서 `mappedBy` 속성은 자식 엔티티에서 부모 엔티티를 참조하는 필드를 지정한 다. 이를 통해 양방향 관계가 형성된 다.

 

양방향 관계의 장단점

  • 장점 : 데이터베이스 조회 시 양쪽 엔티티에서 쉽게 접근할 수 있어 편리하다. 예를 들어, 부모 엔티티에서 자식 엔티티를 조회할 수 있고, 자식 엔티티에서 부모 엔티티를 조회할 수 있다.
  • 단점: 양방향 관계는 설정과 관리가 단방향보다 복잡하다. 특히 순환 참조 문제가 발생할 수 있어 주의해야 한다. 

 

3.  단방향과 양방향 관계 선택 기준

  • 단방향 관계는 간단한 관계에서 유용하다. 특정 엔티티만 참조하면 되는 경우 사용한다. 코드가 단순해지고 관리가 용이하다.
  • 양방향 관계는 복잡한 관계에서 유용하다. 양쪽 엔티티 모두에서 서로를 참조할 필요가 있는 경우 사용한다. 데이터 접근성이 향상된다.

 

 

4. 관계의 주인?

외래 키는 항상 관계의 주인 쪽에 위치하게 된다.

mappedBy:  JPA에서 양방향 연관 관계를 설정할 때 사용하는 속성이다. 이는 관계의 주인을 정의하고, 주인의 필드명을 명시한다. 이를 통해 두 엔티티 간의 관계에서 외래 키(FK)를 어느 테이블에 둘 것인지, 어느 엔티티가 관계를 관리할 것인지 결정할 수 있다.

양방향 관계에서 `mappedBy` 설정
양방향 `OneToMany` 예시

@Entity
public class Parent {
    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> children = new ArrayList<>();
}

@Entity
public class Child {
    @ManyToOne
    @JoinColumn(name = "parent_id")
    private Parent parent;
}
  • `Parent` 엔티티는 `@OneToMany` 관계를 정의하면서 `mappedBy = "parent"`를 사용하여 `Child` 엔티티의 `parent` 필드가 관계의 주인임을 명시
  • `Child` 엔티티는 `@ManyToOne` 관계를 정의하고 있으며, `@JoinColumn(name = "parent_id")`를 통해 외래 키가 `Child` 테이블에 위치

이 설정으로 인해 `Child` 엔티티의 `parent` 필드가 관계의 주인이 되며, `Parent` 엔티티는 이 관계를 단순히 참조하게 된다.

 


mappedBy의 역할: 주인 엔티티 설정: `mappedBy` 속성은 주인이 아닌 엔티티에서 사용되며, 주인 엔티티의 필드명을 지정합니다.

728x90
반응형

관련글 더보기