김영한님의 인프런 강의 '자바 ORM 표준 JPA 프로그래밍'을 참고했습니다.
🤔 상속 관계 매핑 : 데이터베이스의 슈퍼타입 서브타입 관계 모델을 객체의 상속 구조와 매핑하는 것.
👆 데이터베이스의 슈퍼타입 서브타입 논리 모델
@Inheritance(strategy=InheritanceType.XXX)
: 부모 클래스에서 매핑 전략을 지정한다.
JOINED : 조인 전략
SINGLE_TABLE : 단일 테이블 전략
TABLE_PER_CLASS : 구현 클래스마다 테이블 전략
@DiscriminatorColumn(name=“DTYPE”)
: 부모 클래스에 구분 컬럼을 지정한다. 이 컬럼으로 저장된 자식 테이블을 구분할 수 있다. 기본값이 DTYPE이므로 @DiscriminatorColumn
으로 줄여 사용해도 된다.
@DiscriminatorValue(“XXX”)
: 엔티티를 저장할 때 구분 컬럼에 입력할 값을 지정한다. 만약 영화 엔티티를 저장하면 구분 컬럼인 DTYPE에 값 XXX가 저장된다.
조인 전략은 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다.
단일 테이블 전략은 이름 그대로 테이블을 하나만 사용한다. 그리고 구분 컬럼(DTYPE)으로 어떤 자식 데이터가 저장되었는지 구분한다.
구현 클래스마다 테이블 전략은 자식 엔티티마다 테이블을 만든다. 그리고 자식 테이블 각각에 필요한 컬럼이 모두 있다.
구현 클래스마다 테이블 전략은 쓰지 말자!! 이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천하지 않는다.❌❌
조인 전략과 단일 테이블 전략을 가지고 무엇을 쓸지 결정하자. 보통 조인 전략을 기본으로 깔고
@MappedSuperclass
는 데이터베이스랑은 상관없고 그냥 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모아준다.
@MappedSuperclass
public abstract class BaseEntity {
@Id @GeneratedValue
private Long id;
private String name;
...
}
@Entity
public class Member extends BaseEntity {
//ID 상속
//NAME 상속
private String email;
...
}
@Entity
public class Seller extends BaseEntity {
//ID 상속
//NAME 상속
private String shopName;
...
}
✔️ 참고
@Entity
클래스는 엔티티나 @MappedSuperclass
로 지
정한 클래스만 상속 가능.
@MappedSuperclass
는 실무에서 많이 사용함.