728x90
들어가기 전
관계형 데이터베이스에는 객체지향 언어에서 다루는 상속이란 개념이 없다. 슈퍼타입 서브타입 관계라는 모델링 기법이 상속과 가장 유사하다.
ORM에서 말하는 상속 관계 매핑은 객체의 상속 구조와 데이터베이스의 슈퍼타입 서브타입 관계를 매핑하는 것이다
@Inheritance(strategy=InheritanceType.XXX)와 같이 설정할 수 있다.
📌 조인 전략_Joined Strategy
@Inheritance(strategy=InheritanceType.JOINED)
엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 키를 받아서 사용하는 전략
1) @DiscriminatorColumn / @DiscriminatorValue
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Item {
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item{
}
@Entity
@DiscriminatorValue("B")
public class Book extends Item{
}
- 객체는 타입으로 구분할 수 있지만 테이블은 타입으로 구분하지 못하기에 선언한 타입 구분 어노테이션
- JOINED 전략에서 사용된다
- @DiscriminatorColumn(name= " ")
: 부모 클래스에서 사용 / name 으로 컬럼명 지정 가능 - @DiscriminatorValue(" ")
: 하위 클래스에서 사용 / " " 안은 엔티티를 저장할 때 구분 컬럼에 입력될 값
2) @PrimaryKeyJoinColumn
@Entity
@DiscriminatorValue("B")
@PrimaryKeyJoinColumn(name = "BOOK_ID")// Book 테이블의 ITEM_ID 기본 키 컬럼명을 BOOK_ID로 변경
public class Book extends Item{
}
- 자식 테이블의 기본 키 컬럼명을 변경할 때 사용
3) 조인 전략의 장단점
장점 | 단점 |
외래 키 참조 무결성 제약조건 활용 가능 | 조회시 조인이 많이 사용되므로 성능 저하 발생 |
저장공간 효율적 사용 가능 | 조회 쿼리가 복잡함 |
테이블 정규화 | 데이터 저장 시 INSERT SQL 2번 호출 |
📌 단일 테이블 전략_Single-Table Strategy
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
테이블을 하나만 사용하는 전략
1) null 허용 특징
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DTYPE")
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item{
private String artist;
}
- 자식 엔티티가 매핑한 컬럼은 모두 null 허용 해야 한다.
- ITEM 의 모든 컬럼은 사용했지만 Album의 artist 컬럼을 사용하지 않을 시 DB에 null 값으로 들어간다.
2) 단일 테이블 전략의 장단점
장점 | 단점 |
조인이 필요 없으므로 조회 성능이 빠름 | 자식 엔티티가 매핑한 컬럼은 모두 null 허용 |
조회 쿼리 단순 | 단일테이블에 모든 것을 저장하므로, 테이블이 커질 가능성 O -> 성능 저하 |
📌 구현 클래스마다 테이블 전략_Table-per-Concrete-Class Strategy
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
각각의 자식 클래스에 필요한 컬럼이 모두 존재하는 것
1) 권장하지 않는 클래스
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item{
private String artist;
}
- 구현 클래스마다 테이블 전략을 사용하므로 자식 엔티티마다 테이블을 만든다
- 실무에서 권장하지 않는 방식이다
- 아주 간단한 경우에는 사용할 수도 있다
- 구분 컬럼을 사용하지 않는다
2) 구현 클래스마다 테이블 전략의 장단점
장점 | 단점 |
서브 타입을 명확하게 구분해서 처리할 때 효과적 | 여러 자식 테이블 함께 조회할 때 성능 저하 |
not null 제약조건 사용 가능 | 여러 자식 테이블 통합해서 쿼리하기에 어려움 |
🐾 관련 코드 보기
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Item {
@Id @GeneratedValue
private Long id;
private String name;
private int price;
}
부모 클래스를 추상 클래스로 만들 시, 상속 받는 자식 클래스만 테이블이 생성되고 부모클래스인 Item 은 테이블이 생성되지 않는다.
<참고자료>
https://product.kyobobook.co.kr/detail/S000000935744
자바 ORM 표준 JPA 프로그래밍 | 김영한 - 교보문고
자바 ORM 표준 JPA 프로그래밍 | 자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA
product.kyobobook.co.kr
728x90
'LANGUAGE > Java' 카테고리의 다른 글
[JPA] 프록시와 즉시/지연 로딩 전략 (0) | 2024.01.22 |
---|---|
[JPA] @MappedSuperclass (0) | 2024.01.01 |
[JPA] 기본적인 매핑 어노테이션 (4) | 2023.12.17 |