Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

자바 ORM 표준 JPA 프로그래밍 CH07 (고급매핑) 본문

공부/백엔드

자바 ORM 표준 JPA 프로그래밍 CH07 (고급매핑)

Hannah0226 2023. 7. 10. 19:11

오늘 다룰 내용

  • 상속 관계 매핑
  • @MappedSuperclass
  • 복합 키와 식별 관계 매핑
  • 조인 테이블
  • 엔티티 하나에 여러 테이블 매핑하기

상속 관계 매핑

조인전략

  • 조인전략이란?
    • 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본키 + 외래키로 사용하는 전략이다. 따라서 조회할 때 조인을 자주 사용한다.

 

  • 사용시 주의사항
    • 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없기 때문에 타입을 구분하는 컬럼을 추가해야 한다.

 

  • 장점
    • 테이블이 정규화된다.
    • 외래 키 참조 무결성 제약조건을 활용할 수 있다.
    • 저장공간을 효율적으로 사용한다.

 

  • 단점
    • 조회할 때 조인이 많이 사용되므로 성능이 저하될 수 있다.
    • 조회 쿼리가 복잡하다.
    • 데이터를 등록할 INSERT SQL을 두번 실행한다.

 

  • 특징
    • JPA 표준 명세는 구분 칼럼을 사용하도록 하지만 하이버네이트를 포함한 몇몇 구현체는 구분 칼럼 없이도 동작한다.

 

  • 관련 어노테이션
    • @PrimaryKeyJoinColumn, @DiscriminatorColumn, @DiscriminatorValue

 

 

단일 테이블 전략

  • 단일 테이블 전략이란?
    • 이름 그대로 테이블을 하나만 사용하고 구분 칼럼으로 어떤 자식 데이터가 저장되었는지 구분한다.  조회할 때 조인을 사용하지 않으므로 가장 빠르다.

 

  • 장점
    • 서브 타입을 구분해서 처리할 때 효과적이다.
    • not null 제약조건을 사용할 수 있다.

 

  • 단점
    • 여러 자식 테이블을 함께 조회할 때 성능이 느리다.
    • 자식 테이블을 통합해서 쿼리하기 어렵다.

 

  • 특징
    • 구분 칼럼을 사용하지 않는다.
    • 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않는 전략이다. 조인이나 단일 테이블 전략을 고려

@MappedSuperclass

  • 특징
    • 테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑정보를 상속하기 위해 사용한다.
    • @MappedSuperclass로 지정한 클래스는 엔티티가 아니므로 em.find()나 JPQL에서 사용할 수 없다.
    • 이 클래스를 직접 생성하여 사용할 일은 거의 없으므로 추상 클래스로 만드는 것을 권장한다.
    • 테이블과는 관계가 없고 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아주는 역할을 한다.
    • 이를 사용하면 등록일자, 수정일자, 등록자, 수정자 같은 여러 엔티티에서 공통으로 사용하는 속성을 효과적으로 관리할 수 있다.

복잡한 키와 식별 관계 매핑

식별 관계 vs 비식별 관계

  • 식별 관계: 부모 테이블의 기본키를 내려받아서 자식 테이블의 기본 키+외래 키로 사용하는 관계이다.
  • 비식별 관계: 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계이다.
    • 필수적 비식별 관계: 외래 키에 NULL을 허용하지 않는다. 연관관계를 필수로 맺어야 한다.
    • 선택적 비식별 관계: 외래 키에 NULL을 허용한다. 연관관계를 맺을지 말지 선택할 수 있다.

 

  • 최근에는 비식별 관계를 주로 사용하고 꼭 필요한 곳에만 식별관계를 사용하는 추세이다.

 

 

복합 키: 비식별 관계 매핑

  • @IdClass
    • 관계형 데이터베이스에 가까운 방법이다.
    • 조건
      • 식별자 클래스의 속성명과 엔티티에서 사용하는 식별자의 속성명이 같아야 한다.
      • Serializable 인터페이스를 구현해야 한다.
      • equals, hashCode를 구현해야 한다.
      • 기본 생성자가 있어야 한다.
      • 식별자 클래스는 public이어야 한다.

 

  • @EmbeddedId
    • 객체지향에 가까운 방법이다.
    • 조건
      • @Embeddable 어노테이션을 붙여주어야 한다.
      • Serializable 인터페이스를 구현해야 한다.
      • equals, hachCode를 구현해야 한다.
      • 기본 생성자가 있어야 한다.
      • 식별자 클래스는 public이어야 한다.

 

 

복합 키: 식별 관계 매핑

  • @IdClass
    • 식별 관계는 기본 키와 외래 키를 같이 매핑해야 한다. 따라서 식별자 매핑인 @Id와 연관관계 매핑인 @ManyToOne을 같이 사용하면 된다.

 

  • @EmbeddedId
    • 식별 관계로 사용할 연관관계의 속성에 @MapsId를 사용하면 된다.
    • @IdClass와 다른 점은 @Id 대신에 @MapsId를 사용한 점이다. @MapsId는 외래 키와 매핑한 연관관계를 기본 키에도 매핑하겠다는 뜻이다.

 

 

식별, 비식별 관계의 장단점

  • 데이터베이스 설계 관점에서 보면 다음과 같은 이유로 비식별 관계를 선호한다.
    • 식별 관계는 부모 테이블의 기본 키를 자식 테이블로 전파하면서 자식 테이블의 기본 키 컬럼이 점점 늘어난다. 
    • 식별 관계는 2개 이상의 컬럼을 합해서 복합 기본 키를 만들어야 하는 경우가 많다.
    • 식별 관계를 사용할 때 기본 키로 비즈니스 의미가 있는 자연 키 칼럼을 조합하는 경우가 많다. 반면 비식별 관계의 기본 키는 비즈니스와 전혀 관계없는 대리 키를 주로 사용한다.
    • 식별 관계는 부모 테이블의 기본 키를 자식 테이블의 기본 키로 사용하므로 비식별 관계보다 테이블 구조가 유연하지 못하다.

 

  • 객체 관계 매핑의 관점에서 보면 다음과 같은 이유로 비식별 관계를 선호한다.
    • 일대일 관계를 제외하고 식별 관계는 2개 이상의 컬럼을 묶은 복합 기본 키를 사용한다.
    • 비식별 관계의 기본 키는 주로 대리 키를 사용하는데 JPA는 @GenerateValue처럼 대리 키를 생성하기 위한 편리한 방법을 제공한다.

 

  • 식별 관계가 가지는 장점도 있긴 하다.
    • 기본 키 인덱스를 활용하기 좋다.
    • 상위 테이블들의 기본 키 칼럼을 자식, 손자 테이블이 가지고 있으므로 특정 상황에 조인 없이 하위 테이블만으로 검색을 완료할 수 있다.

조인 테이블

  • 일대일 조인 테이블: 일대일 관계를 만들려면 조인 테이블의 외래 키 컬럼 각각에 총 2개의 유니크 제약 조건을 걸어야 한다. 
  • 일대다 조인 테이블: 일대다 관계를 만들려면 조인 테이블의 컬럼 중 다와 관련된 컬럼인 CHILD_ID에 유니크 제약 조건을 걸어야 한다.
  • 다대일 조인 테이블: 다대일은 일대다엣서 방향만 반대이므로 조인 테이블 모양은 일대다에서 설명한 모양과 같다.
  • 다대다 조인 테이블: 다대다 관계를 만들려면 조인 테이블의 두 칼럼을 합해서 하나의 복합 유니크 제약조건을 걸어야 한다.

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

  • @SecondaryTable.name: 매핑할 다른 테이블의 이름
  • @SecondaryTable.pkJoinColumns: 매핑할 다른 테이블의 키 컬럼 속성
  • @SecondaryTable을 사용햇서 두 테이블을 하나의 엔티티에 매핑하는 방법보단 테이블당 엔티티를 각각 만들어서 일대일 매핑하는 것을 권장한다.

 

자바 ORM 표준 JPA 프로그래밍 : 네이버 도서

네이버 도서 상세정보를 제공합니다.

search.shopping.naver.com