객체는 상속 관계가 있다.
관계형 DB에는 상속 관계가 없다. 하지만 슈퍼타입 서브타입 관계라는 모델링 기법을 통해 상속 관계를 유사하게 표현할 수 있다.

이런식으로 구조를 구성해야지 하면 DB는 3가지 방법을 사용해서 구현할 수 있다.
1. 각각의 테이블을 생성 = 조인 전략
2. 하나의 통합 테이블로 표현 = 단일 테이블 전략
3. 서브타입 테이블로 변환 (물품으로 묶이는 공통 속성(ex. name, price 등)들을 음반, 영화, 책에 각각 필드로 생성해주는 것, 쉽게 얘기하면 물품 테이블을 없애고 음반, 영화, 책 테이블만 만드는 것) = 구현 클래스마다 테이블 전략
@Entity
public abstract class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private int price;
  ...
}
@Entity
public class Album extends Item{
  private String artist;
  ...
}
@Entity
public class Book extends Item{
  private String author;
  private String isbn;
  ...
}
@Entity
public class Movie extends Item{
  private String director;
  private String actor;
  ...
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED) // 조인 전략
public abstract class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private int price;
  ...
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 단일 테이블 전략
public abstract class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private int price;
  ...
}
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // 단일 테이블 전략
public abstract class Item {
  @Id
  @GeneratedValue
  private Long id;
  private String name;
  private int price;
  ...
}
[예시 코드]
@MappedSuperclass
public abstract class BaseEntity {
  private String createBy;
  private LocalDateTime createdDate;
  private String lastModifiedBy;
  private LocalDateTime lastModifiedDate;
  ...
}
@Entity
public class Member extends BaseEntity {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "MEMBER_ID")
  private Long id;
  ...
}
자바 ORM 표준 JPA 프로그래밍-기본편을 학습하면서 정리한 블로그입니다.