고급 매핑

Timo·2021년 4월 19일
0
post-thumbnail

김영한님의 <자바 ORM 표준 JPA 프로그래밍> 책을 정리한 내용입니다.

상속 관계 매핑

슈퍼타입 서브타입 논리 모델을 실제 물리 모델인 테이블로 구현할 때는 3가지 방법을 선택할 수 있다.

  • 조인 전략: 각각의 테이블로 변환
  • 단일 테이블 전략: 통합 테이블로 변환
  • 구현 클래스마다 테이블 전략: 서브타입 테이블로 변환

상속 관계를 매핑할 때는 @Inheritance 어노테이션을 사용하고 속성으로 취하려는 전략을 명시해준다.

조인 전략(Joined Strategy)

엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다.

이 전략을 사용할 때 주의할 점은 객체는 타입으로 구분할 수 있지만 테이블은 타입의 개념이 없으므로 타입을 구분하는 컬럼(DTYPE)을 추가해야 한다.

장점

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

단점

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

단일 테이블 전략(Single-Table Strategy)

이름 그대로 테이블을 하나만 사용한다.
구분 컬럼(DTYPE)으로 어떤 자식 데이터가 저장되었는지 구분한다.

이 전략을 사용할 때 주의점은 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다는 점이다.

InheritanceType.SINGLE_TABLE로 전략을 사용한다.

장점

  • 조인이 필요 없으므로 일반적으로 조회 성능이 빠르다.
  • 조회 쿼리가 단순하다.

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 한다.
  • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다.
그러므로 상황에 따라서는 조회 성능이 오히려 느려질 수 있다.

구현 클래스마다 테이블 전략(Table-Per-Concrete-Class Strategy)

자식 엔티티마다 테이블을 만든다.
자식 테이블에 각각 필요한 컬럼이 모두 있는 형태다.

InhritanceType.TABLE_PER_CLASS를 선택하여 전략을 사용한다.

장점

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

단점

  • 여러 자식 테이블을 함께 조회할 때 성능이 느리다(SQL에 UNION을 사용해야 한다).
  • 자식 테이블을 통합해서 쿼리하기 어렵다.

@MappedSuperclass

테이블과 매핑되지 않고 자식 클래스에 엔티티의 매핑 정보를 상속하기 위해 사용한다.

등록일, 수정일 같이 여러 엔티티에서 공통으로 사용하는 매핑 정보만 상속받고 싶을 때 사용하는 기능이다.

부모로부터 물려받은 매핑 정보를 재정의하려면 @AttributeOverrides나 @AttributeOverride를 사용하면 된다.

이 클래스를 직접 생성해서 사용할 일은 거의 없으므로 추상 클래스로 만드는 것이 좋다.

복합 키와 식별 관계 매핑

데이터베이스의 식별자가 하나 이상일 때 매핑하는 방법

  • 식별 관계(Identifying Relationship): 부모 테이블의 기본 키를 내려받아서 자식 테이블의 기본 키 + 외래 키로 사용하는 관계
  • 비식별 관계(Non-Identifying Relationship): 부모 테이블의 기본 키를 받아서 자식 테이블의 외래 키로만 사용하는 관계

복합 키
JPA는 복합 키를 지원하기 위해 @IdClass와 @EmbeddedId 2가지 방법을 제공한다.

조인 테이블

데이터베이스에서 테이블은 외래 키 하나로 연관관계를 맺을 수 있지만 연관관계를 관리하는 연결 테이블을 두는 방법도 있다.

  • 객체와 테이블을 매핑할 때 조인 컬럼은 @JoinColumn으로 매핑하고 조인 테이블은 @JoinTable로 매핑한다.
  • 조인 테이블은 주로 다대다 관계를 일대다, 다대일 관계로 풀어내기 위해 사용한다.

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

보통 엔티티 하나에 테이블 하나를 매핑하지만 엔티티 하나에 여러 테이블을 매핑하는 방법도 있다.

@SecondaryTable 어노테이션을 사용하여 매핑하면 된다.

profile
나는 매일 성장하는 사람

0개의 댓글