JPA 상속관계 매핑

zwon·2023년 10월 3일
0

JPA

목록 보기
6/9

객체는 상속 관계가 있다.
관계형 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;
  ...
}

조인 전략

  • 조인 전략을 선택할 시 부모 클래스에서 다음과 같이 설정해주어야한다.
  • @Inheritance(strategy = InheritanceType.JOINED) // 조인 전략
@Entity
@Inheritance(strategy = InheritanceType.JOINED) // 조인 전략
public abstract class Item {

  @Id
  @GeneratedValue
  private Long id;

  private String name;
  private int price;
  ...
}

단일 테이블 전략

  • default로 설정된 값이다.
  • 단일 테이블 전략을 선택할 시 부모 클래스에서 다음과 같이 설정해주어야한다.
  • @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // 단일 테이블 전략
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 단일 테이블 전략
public abstract class Item {

  @Id
  @GeneratedValue
  private Long id;

  private String name;
  private int price;
  ...
}

구현 클래스마다 테이블 전략

  • Item 클래스에 있던 속성들을 다 밑으로 내리는 것
  • Item 테이블은 생성되지 않고(abstract class로 변경) Item 클래스가 가지고 있던 필드들이 ALBUM, MOVIE, BOOK에 추가됨.
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) // 단일 테이블 전략
public abstract class Item {

  @Id
  @GeneratedValue
  private Long id;

  private String name;
  private int price;
  ...
}
  • 하지만 이 전략은 사용하면 안되는 전략이다.....

@MappedSuperclass

  • 단순하게 생각해서 여러 클래스에서 사용되는 공통적인 속성이 있을 때 사용하는 어노테이션이다.
  • 객체입장에서 속성만 상속받아 사용하고 싶을 때 사용
  • 상속관계 매핑X, 엔티티X, 테이블과 매핑X
  • 단순 자식 클래스에 매핑 정보만 제공하는 클래스로 직접 생성해서 사용할 일이 없기때문에 추상 클래스를 권장한다.

[예시 코드]

@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 프로그래밍-기본편을 학습하면서 정리한 블로그입니다.

profile
Backend 관련 지식을 정리하는 Back과사전

0개의 댓글