Home [JPA] JPA 기본 5
Post
Cancel

[JPA] JPA 기본 5

JPA 기본 5

연관 관계 매핑

용어 설명

  • 방향(Direction) : 단방향, 양방향
  • 다중성(Multiplicity) : 다대일, 일대다, 일대일, 다대다
  • 연관관계 주인(Owner) : 객체 양방향 연관관계는 관리 주인 필요

테이블과 객체의 차이

  • 테이블은 외래 키로 조인해서 연관 테이블 서칭
  • 객체는 참조를 통해 연관 객체를 서칭

객체 지향 모델링

  • 객체의 참조와 테이블의 외래 키를 매핑하여 해결한다.
    • @ManyToOne, @OneToMany 등의 어노테이션을 통해 매핑 가능하다.

단방향 / 양방향 참조

  • 단방향 참조는 두 객체 사이에 하나의 객체에서만 참조용 필드를 갖고 참조하는 관계를 말한다.
  • 양방향 참조는 두 객체 모두가 각각 참조용 필드를 갖고 참조하는 관계를 말한다.

양방향 연관관계와 연관관계의 주인

mappedBy

  • 객체와 테이블이 관계를 맺는 것의 차이를 알아야 이해하기 쉽다.
  • 객체의 연관관계는 2가지.
    • Member -> Team
    • Team -> Member
  • 테이블 연관관계는 1가지.
    • FK 키 하나로 join 걸어서 찾으면 두 테이블 모두에서 같은 결과를 추출할 수 있다.
    • 즉, Member <-> Team의 양방향 연관관계 하나를 가진다.

양방향 연관관계

  • 객체의 양방향 연관관계는 사실 서로 다른 단방향 연관관계 2개의 합이다.
  • 테이블의 양방향 연관관계는 외래 키 하나로 두 테이블의 연관관계를 관리한다.

연관관계의 주인

  • 양방향에서 어떤 객체의 참조값을 변경해야하는지 결정이 필요하다.
    • 이를 위해 객체의 두 관계 중 하나를 연관관계의 주인으로 지정한다.
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)한다.
  • 주인이 아닌 쪽은 읽기만 가능하다.
  • 주인은 mappedBy 속성을 사용하지 않는다.
  • 주인이 아니라면 mappedBy 속성으로 주인을 지정한다.

주인을 정하는 팁

  • 외래 키가 있는 곳을 주인으로 정하자.
  • 다대일이면 다 쪽이 연관관계의 주인이 되어야 효율적이다.
  • 비즈니즈 로직을 기준으로 연관관계의 주인을 선택해서는 안된다.

양방향 연관관계 주의할 점

  • 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정해야 한다.
  • 연관관계 편의 메서드를 생성한다.
    • 변경 시 객체 하나가 아니라 다른 객체도 같이 변경되도록 편의를 주는 메서드를 정의하여 사용한다.
    • 두 객체 중 하나에서만 정의해 사용하는 것이 무한루프 방지 등 효율적인 모습을 보인다.
  • 양방향 매핑 시 무한 루프를 조심해야 한다.
    • toString(), lombok, JSON 생성 라이브러리 등

양방향 매핑 정리

  • 단방향 매핑만으로 이미 설계를 완료했어야 한다. 즉, 양방향을 사용하지 않는 설계를 먼저 해야한다.
    • 양방향 매핑은 그저 반대 방향으로 조회하는 기능만이 추가된 것이다.
    • 객체 입장에서는 양방향 매핑을 사용할 때 이점이 없다.
  • 실무에서는 JPQL에서 역방향으로 탐색할 일이 생각보다 많다.
  • 단방향 매핑을 잘 하고 양방향 매핑은 필요 시 추가해서 사용하자. (테이블에 영향 미치지 않음)
This post is licensed under younghwani by the author.

[JPA] JPA 기본 4

[JPA] JPA 기본 6

Comments powered by Disqus.