Spring JPA[상속관계]
상속관계 매핑
객체지향 프로그래밍에서 객체 간의 상속 관계를 데이터베이스 테이블 간의 관계로 매핑하는 것을 말합니다.
즉, 객체지향 프로그래밍에서 사용되는 클래스(객체)간의 상속 관계를 데이터베이스의 테이블 간의 관계로 어떻게 옮겨지는지를 나타내는 개념입니다.
주요 어노테이션
- @Inheritance(strategy=InheritanceType.XXX)
- JOINED: 조인 전략
- SINGLE_TABLE: 단일 테이블 전략
- TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
- @DiscriminatorColumn(name=“DTYPE”) [ 단일 ]
- 각 객체가 어떤 클래스인지 식별하는 컬럼을 지정합니다.
- DYPE는 기본 값 입니다.
- @DiscriminatorValue(“XXX”) [ 단일 ]
- 각 객체를 식별하는데 사용되는 값을 지정합니다.
- XXX는 특정 클래스에 대한 식별값입니다.
매핑 방법
상속관계를 매핑하는 방법은 총 3가지가 있습니다.
- 조인 전략 ( STI )
- 단일 테이블 전략 ( STI )
- 구현 클래스마다 테이블 전략 ( CTI )
조인 전략
클래스 각각을 별도의 테이블로 변환하고, 공통 속성을 단일 테이블에 모두 포함시키는 전략입니다.
서브 클래스의 특정 속성은 해당 테이블에 저장됩니다.
- 장점
- 테이블 정규화가 가능합니다.
- 외래 키 참조 무결성 제약조건을 활용 가능합니다.
- 저장공간이 효율적입니다.
- 단점
- 장점
- 조인이 필요없어, 조회 성능이 빠릅니다.
- 조회 쿼리가 단순합니다.
- 단점
- 이 전략은 추천하지 않습니다.
@MappedSuperclass
클래스에 공통된 데이터가 많이 있다면, 이 어노테이션을 사용하여 매핑 정보를 모으는 역할로 사용됩니다. 이 어노테이션을 사용하면 해당 클래스의 필드들을 상속받는 하위 클래스들에서 공통된 매핑 정보를 재사용할 수 있습니다.
부모 클래스를 상속 받는 자식클래스에 매핑 정보만 제공해줍니다.
또한, 조회, 검색이 불가합니다.
직접 생성해서 사용할 일이 없으므로 추상 클래스를 권장합니다. ### 코드 예시 #### BaseEntity.class
1
2
3
4
5
6
7
8
@MappedSuperclass
public class BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 다른 공통된 매핑 정보나 필드들...
}
#### Other.class
1
2
3
4
5
6
7
8
9
10
11
12
13
@Entity
public class User extends BaseEntity {
private String username;
// 다른 필드들...
}
@Entity
public class Product extends BaseEntity {
private String productName;
// 다른 필드들...
}
이런식으로 상속을 받아, 부모 클래스 안에있는 공통된 매핑 정보를 사용 할 수 있습니다. 주로 등록일, 수정일, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용합니다.
## 결론 상속관계 매핑에서는 세 가지 전략을 사용할 수 있습니다.
조인 전략(STI), 단일 테이블 전략(STI), 그리고 구현 클래스마다 테이블 전략(CTI)입니다.
각 전략에는 장단점이 있어 상황에 따라 선택되어야 합니다.
@MappedSuperclass 어노테이션은 공통된 데이터를 모아 부모 클래스로 만들어 매핑 정보를 상속받을 때 사용됩니다.
부모 클래스는 직접적으로 테이블로 매핑되지 않고, 자식 클래스에 매핑 정보만을 제공합니다.
주로 등록일, 수정일, 수정자 등과 같이 전체 엔티티에서 공통으로 적용하는 정보를 부모 클래스에 모을 때 사용하며, 추상 클래스로 선언하여 직접 생성하거나 조회, 검색이 불가능하게끔 권장됩니다.