🧬 @Inheritance

정의

@InheritanceJPA에서 상속 관계에 있는 엔티티를 데이터베이스 테이블에 어떻게 매핑할지 지정하는 애너테이션이다. 보통 부모 엔티티에 선언하며, 자식 엔티티들과의 저장 구조를 결정한다.

객체 지향의 상속 개념을 테이블 구조에 반영할 때 사용한다.

🧩 역할

  • 상속 엔티티의 테이블 매핑 전략을 정의한다
  • 부모와 자식 엔티티의 저장 구조를 결정한다
  • 정규화, 조회 성능, 테이블 수 사이의 균형을 조절한다

🛠 상속 전략

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 중 상황에 맞게 선택한다.
  • 성능과 구조의 균형을 고려해서 결정하는 것이 중요하다.

연결문서

태그: ,

카테고리:

업데이트:

댓글남기기