@Inheritance
🧬 @Inheritance
정의
@Inheritance는 JPA에서 상속 관계에 있는 엔티티를 데이터베이스 테이블에 어떻게 매핑할지 지정하는 애너테이션이다. 보통 부모 엔티티에 선언하며, 자식 엔티티들과의 저장 구조를 결정한다.
객체 지향의 상속 개념을 테이블 구조에 반영할 때 사용한다.
🧩 역할
- 상속 엔티티의 테이블 매핑 전략을 정의한다
- 부모와 자식 엔티티의 저장 구조를 결정한다
- 정규화, 조회 성능, 테이블 수 사이의 균형을 조절한다
🛠 상속 전략
SINGLE_TABLE
- 모든 엔티티를 하나의 테이블에 저장한다
- 구분용 컬럼이 필요하다
- 조회가 단순하고 조인이 없어 빠를 수 있다
- 테이블에
NULL컬럼이 많아질 수 있다
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
JOINED
- 부모 테이블과 자식 테이블을 분리한다
- 공통 필드는 부모 테이블에, 자식 고유 필드는 자식 테이블에 저장한다
- 정규화에는 유리하지만 조회 시 조인이 필요하다
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
TABLE_PER_CLASS
- 각 클래스마다 별도 테이블을 생성한다
- 부모 필드가 자식 테이블에 함께 포함된다
- 조인이 적은 대신 데이터 중복이 생길 수 있다
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
}
⚠️ 주의사항
@Inheritance는 보통 부모 엔티티에 선언한다.- 상속 전략은 한 번 정하면 변경 비용이 크므로 초기에 신중히 선택해야 한다.
SINGLE_TABLE은 단순하지만 컬럼이 많아질 수 있다.JOINED는 정규화에 유리하지만 조회 비용이 늘 수 있다.TABLE_PER_CLASS는 구조는 단순해도 중복 저장이 발생할 수 있다.
📌 정리
@Inheritance는 JPA 상속 매핑 전략을 정하는 애너테이션이다.SINGLE_TABLE,JOINED,TABLE_PER_CLASS중 상황에 맞게 선택한다.- 성능과 구조의 균형을 고려해서 결정하는 것이 중요하다.
댓글남기기