RDB는 상속관계가 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하지만 상속이라 볼 수는 없다. 객체의 상속을 슈퍼타입 서브타입 관계로 매핑해주는 무언가가 있어야한다.
상속 관계 매핑을 통해서 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑할 수 있다.
슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 3가지가 있다.
하나씩 알아보자.
Item
-> Movie
)name
속성으로 바꿀 수 있다.@DiscriminatorColumn
이 없어도 작동한다.@DiscriminatorColumn
이 반드시 있어야 한다.null
을 허용해야 한다. JPA의 기본 전략은 단일 테이블 전략이다.
@DiscriminatorColumn
이 의미가 없다. 객체의 관점에서 보면 조인 전략이 가장 적합하고, 테이블 정규화도 잘 되있으며 설계 입장에서 깔끔하게 설계가 된다.
따라서, 조인 전략이 정석이라고 생각하면 된다.
기본적으로 조인 전략을 깔고, 정말 단순하고 확장 가능성이 없는 것들은 단일 테이블 전략을 사용한다.
비지니스 전략에서 매우 중요한 역할을 하면 조인 전략을 사용한다.
구현 클래스마다 테이블 전략은 그냥 생각도 하지말자. 나중에 엄청 후회하게 된다..
전략은 부모 클래스에서 어노테이션으로 설정한다.
만약 JPA를 사용하지 않으면 전략을 바꿀 때 엄청 많은 소스 코드(쿼리) 수정이 필요하지만, JPA를 사용하여 어노테이션 하나만으로 이를 매우 편리하게 바꿀 수 있다.
이를 통해 객체지향의 다형성을 활용하여 다양한 비즈니스를 쉽게 구현할 수 있다.
@Entity
사용 X)@MappedSuperclass
는 객체 입장에서 데이터만 상속하고 실제 테이블을 손대지 않는다.참고
@Entity
클래스는 엔티티나@MappedSuperclass
로 지 정한 클래스만 상속 가능하다.
참고
@MappedSuperclass
는 인터페이스로 사용할 수 없다.
혹시 된다고 하더라도 인터페이스에는 필드를 정의할 수 없기 때문에 무의미하다.
(이는 자바의 인터페이스와 추상 클래스의 차이점을 알면 당연하다.)이미 상속을 받고 있을 때 추상 클래스 상속이 안되는 것은 자바 언어에서 막아두었기 때문에 새로운 추상 클래스를 만들어서 새로운 추상 클래스가 기존 추상 클래스를 상속 받는 식으로 구현해야 한다.