🍃이 글은 inflearn에서 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵을 학습하고 작성한 것입니다.🍃
관계형 데이터베이스는 상속 관계 개념이 없다.
대신 슈퍼타입 서브타입 관계라는 모델링 기법이 객체의 상속과 유사하다.
상속관계 매핑이란 객체의 상속 구조와 DB의 슈퍼타입 서브타입 관계를 매핑한다.
@Inheritance(strategy=InheritanceType.XXX)
@DiscriminatorColumn(name=“DTYPE”)
@DiscriminatorValue(“XXX”)
@Entity
@Inheritance(strategy = InheritanceType.XXX) // 상속 구현 전략 선택
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int price;
}
@Entity
public class Album extends Item {
private String artist;
}
@Entity
public class Movie extends Item {
private String director;
private String actor;
}
@Entity
public class Book extends Item {
private String author;
private String isbn;
}
기본 전략을 조인 전략으로 하되 두 전략의 장단점을 비교해서 선택하자.
- 비즈니스적으로 단순하고 확장 가능성이 작으면 단일 테이블 전략을 사용하자.
- 비즈니스적으로 복잡하고 확장 가능성이 크면 조인 전략을 사용하자.
등록일, 수정일, 등록자, 수정자 등을 모든 엔티티에 공통으로 적용해야 한다면 많은 중복이 발생하는 문제가 생긴다. 어떻게 해결할까?
객체의 입장에서 공통 매핑 정보가 필요할 때 사용한다.
id, name은 객체의 입장에서 볼 때 계속 나온다.
이렇게 공통 매핑 정보가 필요할 때, 부모 클래스에 선언하고 속성만 상속받아서 사용하고 싶을 때 @MappedSuperclass를 사용한다.
DB 테이블과는 상관없다. 단지 객체의 입장이다.
@Getter
@Setter
@MappedSuperclass
public abstract class BaseEntity {
private String createdBy;
private LocalDateTime createdDate;
private String lastModifiedBy;
private LocalDateTime lastModifiedDate;
}
위와 같이 BaseEntity를 정의해서 활용할 수 있다.
매핑 정보만 상속받는 Superclass라는 의미의 @MappedSuperclass 어노테이션 선언
@Entity
public class Member extends BaseEntity {
...
}
@Entity
public class Team extends BaseEntity {
...
}
정리
공통 매핑 정보가 필요할 때 사용한다.
상속관계 매핑이 아니다.
엔티티가 아니다.
테이블과 매핑되지 않는다.
부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공한다.
따라서 조회, 검색이 불가하다.
직접 생성해서 사용할 일이 없으므로 추상 클래스로 정의하자.
JPA에서 @Entity 클래스는 @Entity나 @MappedSuperclass로 지정한 클래스만 상속할 수 있다.