Programming/JPA & Spring Data JPA 기초

14. 엔티티 간 1-1 단방향 연관 매핑

JKROH 2023. 3. 27. 21:40
반응형
해당 강의는 코드 위주로 진행됩니다. 실질적인 객체 처리를 담당하는 코드는 링크에서 확인하시길 바랍니다.

* 주의사항

  • 연관 매핑은 진짜 필요할 때만 사용할 것
    • 연관된 객체 탐색이 쉽다는 이유로 사용하지 말 것
    • 조회 기능은 별도 모델을 만들어 구현(CQRS)
  • Embeddable 매핑이 가능하다면 Embeddable 매핑 사용할 것

 

* 참조키 방식 1-1 단방향 연관 매핑

  • 참조키를 이용한 1-1 매핑 관계이다.
  • membership_card테이블은 user_email 칼럼을 이용해서 user테이블을 참조하는 구조다.
  • memeber_ship 카드의 pk(식별자)는 card_no다.
  • 이를 오른쪽처럼 매핑하고 싶을 때, MembershipCard 객체의 owner가 User가 된다. User는 email값을 이용해서 해당하는 User객체를 참조한다.

 

* @OneToOne, @JoinColumn 사용

  • MembershipCard 클래스에서 확인할 수 있다.
  • 단방향 참조할 대상을 담고 있는 필드에 @OneToOne 애너테이션을 붙이고 User타임을 참조할 때 사용할 join column을 @JoinColumn(name = "user_email")로 지정한다

 

* 저장

  • MembershipCard 객체 인스턴스를 생성할 때, onwer에 할당 될 User 인스턴스를 넣어준다.
  • 테이블의 user_email 칼럼에는 User 인스턴스 email값이 들어간다.
  • 만약 MembershipCard 객체 인스턴스를 생성할 때, null 값을 넣어준다면, user_email칼럼에도 null이 할당된다.

 

* 조회

  • 만들어진 MembershipCard 인스턴스에서 getOwner();를 통해 User 인스턴스를 읽어올 수 있다.
  •  MembershipCard 인스턴스를 em.find();를 통해 가져오면 join이 적용되어 select 된다.
  • 이 때, select되는 칼럼은 membership_card 테이블의 칼럼과 user 테이블의 칼럼을 모두 조회한다.
  • 이는 OneToOne의 기본 fetch 방식이 EAGER이기 때문이다.
  • 만약 이를 LAZY로 설정하면, 멤버십 카드를 조회할 때는 카드만 조회하고 getOwner();를 통해 User 객체를 가져와서 User객체를 실제로 사용하려는 시점에 다시 user 테이블에서 select를 해온다.

 

* 식별자 공유 방식 1-1 단방향 연관 매핑

  • best_pick 테이블은 user_email을 pk로 갖는 테이블이다. 즉, 두 테이블은 같은 값을 갖는 email이 모두 pk이다.
  • BestPick 클래스에는 email필드가 존재한다. 이는 email이 id에 매핑되는 식별자이기 때문이다.
  • User와 연관 매핑하기 위해 사용되는 user 필드도 존재한다.
  • @OneToOne과 @PrimaryKetJoinColumn(name = "user_email"(best_pick 테이블에서 user테이블을 참조할 때 사용할 칼럼)을 사용하면 된다.

 

* 저장

  • BestPick 객체 인스턴스를 생성할 때 User 객체를 넘겨주면 된다.

 

* 조회

  • 참조키 방식과 같다.

 

반응형