본문 바로가기

Study/JPA

[JPA] 양방향 매핑

양방향 매핑

객체에 양방향 연관관계를 적용시키려면 위와 같이 구성해야한다.

하지만 RDB에서는 처음부터 양방향으로 접근해 조회할 수 있다.

이를 구성하려면 Team객체를 아래와 같이 변경하면 된다.

@Entity
public class Team{
    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "team")
    // Collection 추가
    List<Member> members = new ArrayList<>();
    ...
}
// 조회
Team findTeam = em.find(Team.class, team.getId());
// 역방향 조회
int memberSize = findTeam.getMembers().size();

연관관계의 주인과 mappedBy

  • mappedBy는 처음에는 이해하기 어렵다.
  • 객체와 테이블 간 연관관계를 맺는 차이를 이해해야 한다.

객체와 테이블 간 연관관계를 맺는 차이

  1. 객체 연관관계
  • 회원 -> 팀 연관관계 1개(단방향)
  • 팀 -> 회원 연관관계 1개(단방향)
  1. 테이블 연관관계
  • 회원 <--> 팀의 연관관계 1개(양방향)

객체의 양방향 연관관계

  • 실제로 객체의 방향은 무조건 단방향이다.
  • 따라서, 양방향으로 조회를 하기 위해선 서로다른 단방향 관계 2개가 필여하다.

테이블의 양방향 연관관계

테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.


이러한 차이를 해결하기 위해서는?

  • 두 객체중 하나를 연관관계의 주인으로 설정한다.
  • 연관관계를 외래키로 관리한다

연관 관계의 주인(Owner)

양방향 매핑 규칙
  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌 쪽은 읽기만 가능
  • 주인은 mappedBy 속성 사용 x
  • 주인이 아니면 mappedBy 속성으로 주인 지정


누구를 주인으로 해야할까?

  • 외래 키가 있는 곳을 주인으로 정해라.(다른 테이블의 키를 참조하는 곳)

설계 시 양방향을 고려하지 않고 설계할 수 있게 된다.

  • 단방향으로 설계해 둔 후 양방향이 필요할 경우 연관관계를 매핑만 하면 된다.
  • DB는 어차피 양방향 조회가 가능하므로 영향을 끼치지 않는다.

양방향 매핑의 장점

  • 단방향 매핑만으로도 이미 연관관계 매핑 완료
  • 양방향 매핑은 반대 방향으로 조회(객체 그래프 탐색) 기능이 추가된 것 뿐
  • JPQL에서 역방향으로 탐색할 일이 많다.
  • 단방향 매핑을 잘 해두기만 하면 양방향은 필요할 때 추가하면 된다.(테이블에 영향 x)

연관관계 매핑 어노테이션

  • @ManyToOne - 다대일
  • @OneToMany - 일대다
  • @OneToOne - 일대일
  • @ManyToMany - 다대다
  • @JoinColumn, @JoinTable

상속 관계 매핑 어노테이션

  • @Inheritance
  • @DiscriminatorColumn
  • @DiscriminatorValue
  • @MappedSuperclass(매핑 속성만 상속)

복합 키 어노테이션

  • @IdClass
  • @EmbeddedId
  • @Embeddable
  • @MapsId

'Study > JPA' 카테고리의 다른 글

[JPA] 객체 지향 쿼리  (0) 2022.01.13
[JPA] JPA 내부 구조  (0) 2022.01.12
[JPA] 연관관계 매핑  (0) 2022.01.11
[JPA] JPA 필드와 컬럼 매핑  (0) 2022.01.10
[JPA] JPA 기본과 매핑  (0) 2022.01.10