@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) //상속 클래스 객체들 모두 한 테이블에 때려박음
@Getter @Setter
public abstract class Item {
@Id
@GeneratedValue // db에 자동 생성(개발자가 안 지정해줘도 됌)
@Column(name = "item_id")
private Long id;
private String name;//이름
private int price;//가격
private int stockQuantity;//현재 재고량
}
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)의 기능이 뭐야?
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)은 JPA(Java Persistence API)에서 사용되는 어노테이션으로, 상속 관계에 있는 엔티티 클래스들을 하나의 테이블에 매핑하는 전략을 지정하는 역할을 합니다.
위에서 주어진 코드에서 Item 클래스에 @Inheritance(strategy = InheritanceType.SINGLE_TABLE)이 적용되었습니다. 이것은 Item 클래스를 상속하는 모든 하위 클래스들이 하나의 테이블에 저장되도록 설정한다는 의미입니다. 이런 전략을 "단일 테이블 전략(Single Table Strategy)"이라고 합니다.
단일 테이블 전략은 상속 구조의 엔티티를 하나의 테이블에 모두 통합하여 저장합니다. 이렇게 하면 각각의 엔티티마다 별도의 테이블을 생성하지 않고, 하나의 테이블에 모든 필드를 포함하여 데이터를 저장할 수 있습니다. 각 엔티티의 특정 타입은 @DiscriminatorColumn을 사용하여 구분되며, 이 컬럼을 통해 어떤 하위 클래스의 데이터인지 구분할 수 있습니다.
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)를 사용하면 다음과 같은 장점이 있습니다:
단일 테이블로 인해 테이블 구조가 간단해집니다.
하위 클래스들을 하나의 테이블에 저장하므로 조인이 필요 없어 조회 성능이 향상됩니다.
테이블 간의 관계를 설정할 필요 없이 상속 구조를 구현할 수 있습니다.
하지만 단일 테이블에 모든 엔티티를 저장하므로, 상속 구조의 엔티티가 많아질 경우 테이블의 크기가 커질 수 있고, 논리적으로 분리된 데이터가 한 테이블에 저장되어 관리가 복잡해질 수도 있습니다. 이러한 경우에는 다른 상속 전략을 고려해야 할 수 있습니다.