애정코딩 💻

WEB/JPA 2021.05.17 댓글 0 Joana

6. 자바 ORM 표준 JPA 프로그래밍 - 고급매핑

상속관계 매핑

관계형 데이터베이스는 상속 관계가 없다.(슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다)

슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법

 

1. 각각 테이블로 변환 -> 조인 전략 (정석)

- 테이블 정규화

- 외래 키 참조 무결성 제약조건 활용 가능

- 저장공간 효율화

- 조회시 조인을 많이 사용 -> 성능 저하, 조회 쿼리가 복잡함

- 데이터 저장시 INSERT 쿼리가 2번 호출 된다.

비지니스적으로 중요하고 복잡할 때 선택!

 

부모 클래스 설정

@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn

 

자식 클래스 설정 -> dtype에 표시될 이름을 정해 줄 경우

@DiscriminatorValue(name = "book")

 

자바 ORM 표준 JPA 프로그래밍(기본편) - 김영한 / 인프런

 

 

2. 통합 테이블로 변환 -> 단일 테이블 전략

한 테이블에 넣고 DTYPE 로 구분한다. 

한 테이블에서 조인 없이 조회하기 때문에(조회 쿼리가 단순함) 성능이 좋다. 하지만 해당 값이 아닐 때 null이 들어간다.

한 테이블에 저장하기 때문에 데이터가 많아질 경우 조회 성능이 오히려 느려질 수 있다.

* 데이터도 없고 단순할 경우 단일 테이블 선택!

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn	// 필수

자바 ORM 표준 JPA 프로그래밍(기본편) - 김영한 / 인프런

 

 

3. 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 (비추천)

- 부모 클래스가 없는 경우

- 중복 컬럼 전부 나열

- 단순하게 값을 넣고 빼기 좋지만 명확하게 조회할 때 빼고는 조회할 때 union all로 복잡한 쿼리가 생성된다.

- 각각의 테이블을 모두 조회해서 찾아야해서 비효율적이다.

자바 ORM 표준 JPA 프로그래밍(기본편) - 김영한 / 인프런

 

 

Mapped Superclass - 매핑 정보 상속

공통 매핑 정보가 필요할 때 사용한다.

예를 들어 모든 클래스에 등록날짜, 수정날짜 가 있어야 한다고 했을 때 중복으로 선언 하기 보다는 공통 클래스를 만들어 상속받도록 한다.

* 상속관계 매핑은 아니다. 엔티티가 아니므로 테이블과 매핑되지 않는다. 자식 클래스에 매핑 정보만 재공할 뿐이다.

* 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장한다.

@MappedSuperclass
public abstract class BaseEntity {
  private LocalDateTime createdDate;
  private LocalDateTime modifiedDate;
}

그 후에 해당 필드를 사용할 클래스에서 상속을 받는다. 그 후에 JPA를 실행하면 아래와 같이 상속받은 필드를 포함한 테이블을 만든다. 

Hibernate: 
    
    create table Category (
       CETEGORY_ID bigint not null,
        createdDate timestamp,
        modifiedDate timestamp,
        name varchar(255),
        PARENT_ID bigint,
        primary key (CETEGORY_ID)
    )

공통 필드의 이름이 변경되었다고 해도 MappedSuperclass 만 수정해주면 되기 때문에 유용하다.

 

 

반응형