객체는 상속을 지원하므로 모델링과 구현이 똑같지만, DB 는 상속을 지원하지 않으므로 논리 모델을 물리 모델로 구현할 방법이 필요하다.
DB 의 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 세가지 있다.
중요한 건, DB입장에서 세가지로 구현하지만, JPA 에서는 어떤 방식을 선택하던 매핑이 가능하다
JPA 가 이 세가지 방식
일반적으로 관계형 데이터 베이스는 슈퍼타입 서브타입 관계라는 모델링 기법을 갖고 있습니다.

JPA 에서는 슈퍼타입 서브관계를 상속을 활용하여 구현이 가능합니다.

@Inheritance 어노테이션의 strategy 속성을 통해 전략을 선택 할 수 있습니다.
@DisdcriminatorColumn 어노테이션은 부모 클래스에 선언합니다. 하위클래스를 구분하는 용도의 칼럼을 사용합니다. name 속성을 통해 이름을 설정할 수 있습니다. default 의 값은 DTYPE 입니다.

하위 클래스는 상위 클래스를 상속 받습니다. 이때 @DiscriminatorValue 어노테이션으로 엔티티를 저장할때 슈퍼타입의 구분 칼럼에 저장할 값을 지정합니다. 선언하지 않으면 클래스 이름이 기본 값으로 들어가게 됩니다.



@Inheritance(strategy = InheritanceType.JOINED)

일반적인 정규화 된 방법으로 구현하는 전략입니다. @DiscriminatorColumn 을 선언해야만 DTYPE 칼럼이 생성됩니다. 조인을 통해 어떤 하위 클래스인지 확인을 할 수 있으나 명확한 구분을 위해 DTYPE 을 선언해주는게 좋습니다.
다만, 조회시 조인을 많이 사용하게 되고 쿼리가 복잡해질 수 있어 성능저하가 올 수 있습니다. 추가로 테이블에 저장시 INSERT SQL을 2번 호출하게 됩니다.
@Inheritance(strategy = InheritanceType.SIGNLE_TABLE)

하나의 테이블에 모두 저장하고 DTYPE 으로 구분하는 전략입니다. 하나의 테이블에 모두 저장하기 때문에 DTYPE 없이는 구분을 할 수 없어 @DiscriminatorColumn 을 선언하지 않아도 DTYPE 칼럼이 생성됩니다.
INSERT SQL 이 1번만 호출하게 됩니다. 자식 엔티티가 매핑한 컬럼은 모두 null 사용을 하게 됩니다, 하나의 테이블에 모든 데이터를 저장하므로 테이블이 커질 수 있습니다. 때문에 상황에 따라서 조회 성능이 오히려 느려질 수 있습니다.
@Inheritance(strategy = InheritanceType.TABLE_PER.CLASS)
@Joined 전략과 유사하지만 슈퍼타입(여기서는 Item) 칼럼들을 서브타입으로 내리는 전략입니다.
각각의 구현 클래스마다 테이블 생성 전략을 적용 할 수 있으며, NOT_NULL 제약조건을 사용할 수 있습니다. 그러나 여러 자식 테이블을 함께 조회하기 위해서는 UNION SQL 을 사용해야 합니다. 때문에 SQL 조회 성능이 떨어지게되고 여러자식 테이블을 통합해서 SQL 을 사용하기가 어렵습니다.