[스프링] JPA 상속 매핑

이번에는 JPA에서 상속 매핑에 대해 알아보겠습니다. 상속 관계를 매핑하는 방법은 JPA에서 매우 강력하고 다양한데, 이를테면 매핑 전략, 엔티티 클래스 설계 시 주의할 점 등을 포함합니다.

테이블 퍼 시스턴스 클래스 매핑

JPA 상속 매핑은 테이블 간 상속엔티티 간 상속으로 나뉩니다. 테이블 간 상속은 단일 테이블 전략, 조인드 전략, 구별된 전략으로 나눌 수 있습니다. 엔티티 간 상속은 부모 클래스와 자식 클래스가 다른 테이블을 사용하는 전략입니다.

단일 테이블 전략

단일 테이블 전략은 여러 엔티티를 하나의 테이블에 매핑하는 전략입니다. 부모 클래스와 자식 클래스의 구분은 구분 컬럼을 통해 이루어집니다. 자식 클래스 매핑은 @DiscriminatorValue 어노테이션을 사용하여 지정합니다.

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="employee_type", discriminatorType=DiscriminatorType.STRING)
public class Employee {
    ...
}

@Entity
@DiscriminatorValue("F")
public class FullTimeEmployee extends Employee {
    ...
}

조인드 전략

조인드 전략은 엔티티마다 테이블을 만들고, 부모 클래스 테이블과 자식 클래스 테이블을 조인하는 전략입니다. 자식 클래스 매핑은 @PrimaryKeyJoinColumn 어노테이션을 사용하여 지정합니다.

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Employee {
    ...
}

@Entity
@PrimaryKeyJoinColumn(name="employee_id")
public class PartTimeEmployee extends Employee {
    ...
}

구별된 전략

구별된 전략은 엔티티마다 별도의 테이블을 만들며, 자식 클래스의 테이블에는 부모 클래스의 속성까지 복제합니다. 구별된 전략은 서브 타입의 특정 필드나 메서드가 별도로 필요한 경우에 유용합니다.

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Employee {
    ...
}

@Entity
public class ContractEmployee extends Employee {
    ...
}

Upcasting과 Downcasting

상속 매핑에서 엔티티를 부모 클래스 타입으로 조회하는 것을 Upcasting, 반대로 자식 클래스 타입으로 조회하는 것을 Downcasting이라고 합니다. Upcasting과 Downcasting을 사용할 때에는 주의가 필요하며, 이에 따른 Fetch 방법, SQL을 통한 조회 방법 등이 달라질 수 있습니다.

결론

JPA에서 상속 매핑은 다양한 전략과 목적에 따라 유연하게 적용될 수 있습니다. 각 전략별 특징과 장단점을 고려하여 올바르게 적용하는 것이 중요합니다.

이상으로 JPA 상속 매핑에 대한 내용을 마치도록 하겠습니다. 감사합니다.

참고 링크 - 스프링 공식 문서