공hannah부
자바 ORM 표준 JPA 프로그래밍 CH07 (고급매핑) 본문
오늘 다룰 내용
- 상속 관계 매핑
- @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
'공부 > 백엔드' 카테고리의 다른 글
싱글톤 (Singleton) (0) | 2023.09.16 |
---|---|
자바 ORM 표준 JPA 프로그래밍 CH08 (프록시와 연관관계 관리) (0) | 2023.07.17 |
자바 ORM 표준 JPA 프로그래밍 CH06 (다양한 연관관계 매핑) (0) | 2023.07.03 |
자바 ORM 표준 JPA 프로그래밍 CH05 (연관관계 매핑 기초) (0) | 2023.06.26 |
자바 ORM 표준 JPA 프로그래밍 CH04 (엔티티 매핑) (0) | 2023.06.26 |