본문 바로가기
Book

자바 ORM 표준 JPA 프로그래밍 - JPA 정리하기 (7-2) 고급매핑

by devLog by Ronnie's 2022. 8. 24.

들어가며


7강은 1편과 2편으로 나눠 진행하였다. 

 

7.4 조인 테이블

  • 디비 테이블의 연관관계를 설계하는 방법 크게 2가지
    • 조인 컬럼 사용 (외래 키)
    • 조인 테이블 사용 (테이블 사용)
  • 조인 컬럼 사용
    • 테이블 간에 관계는 주로 조인 컬럼이라 부르는 외래 키 컬럼을 사용해서 관리
    • 예를 들어 회원과 사물함이 있을 때 회원이 사물함을 사용하기 전까지는 외래 키에 null을 입력해두어야 하고 이러한 외래 키에 null을 허용하는 관계를 선택적 비식별 관계라 함
    • 선택적 비식별 관계는 외래 키에 null을 허용하므로 조인 시 외부 조인을 사용해야 한다.
    • 실수로 내부 조인을 하면 사물함과 관계가 없는 회원은 조회되지 않는다.
    • 그리고 회원과 사물함이 아주 가끔 관계를 맺는다면 외래 키 값 대부분이 null로 저장되는 단점 존재
  • 조인 테이블 사용
    • 조인 테이블이라는 별도의 테이블을 사용해서 연관관계 관리
    • 조인 컬럼 방법은 단순 히 외래 키 컬럼만 추가해서 연관관계를 맺지만 조인 테이블을 사용하는 방법은 연관관계를 관리하는 조인 테이블을 추가하고 여기서 두 테이블의 외래 키를 가지고 연관관계를 관리한다
    • 회원과 사물함 테이블에는 외래키가 존재하지 않는다.
    • 조인 테이블을 방법을 사용하게 되면 테이블이 하나 더 생기므로 관리해야 되는 테이블이 늘어나고 조인 시 조인 테이블까지 추가로 조인해야한다.
    • 객체와 테으블을 매핑할 때 조인 컬럼은 @JoinColumn으로 매핑하고 조인테이블은 @JoinTable로 매핑한다.
    • 조인 테이블은 주로 다대다 관계를 일대다, 다대일 관계로 풀어내기 위해 사용
    • 그렇지만 일대일, 일대다, 다대일 관계에서도 사용하기도 함

7.4.1 일대일 조인 테이블

  • 일대일 관계를 만들려면 조인 테이블의 외래 키 컬럼 각각에 총 2개의 유니크 제약 조건을 걸어야 한다.
  • 부모 엔티티에 @JoinColumn 대신 @JoinTable 사용
  • @JoinTable 속성
    • name : 매핑할 조인 테이블 이름
    • joinColumns : 현재 엔티티를 참조하는 외래키
    • inverseJoinColumns : 반대방향 엔티티를 참조하는 외래 키
    • 양방향 매핑 원할 시 자식 엔티티에 @OneToOne(mappedBy = “child”) 추가

 

7.4.2 일대다 조인 테이블

  • 일대다 관계를 만들려면 조인 테이블의 컬럼 중 다와 관련된 컬럼인 자식_ID에 유니크 제약 조건을 걸어야 한다.
  • 일대다 단방향 조인 테이블 매핑

 

7.4.3 다대일 조인 테이블

  • 다대일은 일대다에서 방향만 반대이므로 조인 테이블 모양은 일대다에서의 테이블과 동일하다.

7.4.4 다대다 조인 테이블

  • 다대다 관계를 만들려면 조인 테이블의 두 컬럼을 합해서 하나의 복합 유니크 제약조건을 걸어야 한다.
  • 조인 테이블에 컬럼을 추가하면 @JoinTable 전략을 사용할 수 없다. 대신에 새로운 엔티티를 만들어서 조인 테이블과 매핑해야 한다.

7.5 엔티티 하나에 여러 테이블 매핑

  • 잘 사용하지 않지만 사용하기 위해서 @SecondaryTable을 사용하면 된다
  • 보드 엔티티는 @Table을 사용해서 매핑
  • 보드 디테일은 @SecondaryTable을 사용해서 추가로 매핑
  • @SecondaryTable 속성
    • @SecondaryTable.name : 매핑할 다른 테이블의 이름
    • @SecondaryTable.pkJoinColumns : 매핑할 다른 테이블의 기본 키 컬럼 속성
    • 더 많은 테이블을 매핑할때는 @SecondaryTables 사용
  • 추가적으로 @SecondaryTable을 사용해서 두 테이블을 하나의 엔티티에 매핑하는 것 보다 테이블당 엔티티를 각각 만들어서 일대일 매핑하는 것을 권장

댓글