상세 컨텐츠

본문 제목

[SPRING] JPA 프로그래밍 기본 | 상속

JAVA/기본 & 강의복습

by ranlan 2021. 3. 9. 23:21

본문

728x90

상속관계 매핑

상속할 테이블

@Entity
@Inheritance(strategy = InheritanceType.XXX) // 상속 구현 전략 선택
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private int price;
}

Item을 상속받은 테이블

@Entity
public class Album extends Item {

    private String artist;
}

 

 

1) 조인전략

각각을 테이블로 전환하여 슈퍼타입의 ID를 서브타입의 PK, FK로 연결

@Inheritance(strategy=InheritanceType.JOINED)

장점 : 테이블 정규화 / 외래키 참조 무결성 제약조건 활용 가능 / 저장공간 효율화

단점 : 조회 시 조인 연산이 많아 쿼리가 복잡해지고 성능 저하 / 데이터 저장 시 insert SQL 2번 호출

 

 

2) 단일 테이블 전략

하나의 테이블로 구현하여 슈퍼, 서브타입의 모든 속성을 한 테이블의 컬럼으로 지님

@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

장점 : 조인이 필요없어 쿼리가 단순해짐 / 일반적으로 조회 성능이 빠름

단점 : 자식 엔티티가 매핑한 컬럼에 모두 null 허용이 적용됨 / 테이블이 커질 경우 오히려 조회 성능 저하될 수 있음

 

 

3) 구현 클래스마다 테이블 전략

서브타입마다 각각의 테이블로 구현하여 슈퍼타입의 속성 모두 포함

* 각각의 테이블을 하나로 묶을 수 없어 사용 지양

@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

장점 : 서브 타입을 명확하게 구분해서 이를 처리할 때 효과적 / not null 제약조건 사용 가능

단점 : 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL 필수) / 자식 테이블을 통합해서 쿼리하기 어려움

 

 

4) Discriminator

두 테이블 join해서 사용

// 슈퍼타입 엔티티
@DiscriminaterColumn(name = "DTYPE")

// 서브타입 엔티티
@DiscriminatorValue("entity_name") //default=entity_name

 

 

MappedSuperClass

상속이 아닌 공통 매핑 정보가 필요할 때 사용하며 주로 전체 엔티티에 대해 공통으로 지닌 속성에 대해 정의 예) 등록 수정일, 등록자, 수정자 등

 

슈퍼 클래스는 직접 생성해 사용할 일이 없음으로 추상 클래스로 권장

서브타입에 속성 정보만 제공함으로 슈퍼타입으로 조회, 검색 불가

 

슈퍼클래스

@Getter
@Setter
@MappedSuperclass
public abstract class BaseEntity {

    private String createdBy;
    private LocalDateTime createdDate;

    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;
}

서브 클래스

@Entity
public class Member extends BaseEntity {

}
728x90

관련글 더보기

댓글 영역