[java] 자바 ORM에서의 상속 매핑 전략

소프트웨어 개발에서 객체-관계 매핑(ORM)은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 사이의 데이터를 변환하는 기술이다. 상속 관계를 관리하는 것은 ORM에서 중요한 주제 중 하나이다. 자바에서는 ORM 프레임워크로 Hibernate를 사용할 때 다양한 상속 매핑 전략을 사용할 수 있다. 이번에는 자바 ORM에서의 상속 매핑 전략에 대해 알아보겠다.

테이블 per class 전략

테이블 per class 전략은 각 클래스마다 별도의 테이블을 생성하는 전략이다. 이 방법은 클래스 계층과 동등한 테이블 구조를 가지며 자식 클래스의 특정 필드를 부모 클래스에 매핑하지 않는다. 이 전략은 정규화된 스키마를 가질 수 있고, 각 테이블이 단순하기 때문에 질의 성능이 향상될 수 있다는 장점이 있다.

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

@Entity
public class Car extends Vehicle {
    // ...
}

@Entity
public class Truck extends Vehicle {
    // ...
}

단일 테이블 전략

단일 테이블 전략은 모든 클래스의 필드를 단일 테이블에 통합하는 전략이다. 이 방법은 클래스 계층의 모든 필드가 하나의 테이블에 저장되기 때문에 서브 타입을 구분하기 위한 구분 컬럼이 필요하다. 이 방법은 조인이 필요하지 않아 성능상 이점을 가지지만, 테이블이 커지고 널 값을 허용하므로 정규화 문제와 널 값을 허용하는 문제가 발생할 수 있다.

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

@Entity
@DiscriminatorValue("Car")
public class Car extends Vehicle {
    // ...
}

@Entity
@DiscriminatorValue("Truck")
public class Truck extends Vehicle {
    // ...
}

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

구현 클래스마다 테이블 전략은 자식 클래스마다 테이블을 생성하는 전략이다. 이 방법은 각 자식 클래스에 대한 테이블이 생성되기 때문에 추가 정보를 저장하는데 용이하지만, 조인이 필요하여 성능 저하가 발생할 수 있다.

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

@Entity
public class Car extends Vehicle {
    // ...
}

@Entity
public class Truck extends Vehicle {
    // ...
}

결론

각 상속 전략은 각각의 장단점을 가지고 있으며, 프로젝트의 요구사항 및 데이터 모델에 따라 적합한 전략을 선택해야 한다. 효율적인 데이터 관리 및 검색을 위해 적절한 상속 매핑 전략을 선택하는 것이 중요하다.

자세한 내용은 Hibernate 공식 문서를 참고할 수 있다.

Hibernate Inheritance Mapping

이상으로 자바 ORM에서의 상속 매핑 전략에 대해 알아봤다. 감사합니다.

참고 자료


목차에 나열된 페이지를 클릭하여 내용으로 바로 이동할 수 있다.