[ Intro ]
RDB
에는상속관계
가 없다- 객체의 상속과 유사한 관계가 바로
슈퍼타입-서브타입
모델링 기법슈퍼타입-서브타입
모델을 실제 물리 모델로 구현하는 3가지 방법이 존재
조인 전략
: 각각 테이블로 변환단일 테이블 전략
: 하나의 통합 테이블로 변환구현 클래스마다 테이블 전략
: 서브타입 테이블로 변환
[ 설명 ]
- 하위 Table을 구별하는 Column(
DTYPE
)을 두고, 사용시해당 Column
으로JOIN
하는 방법- 실제 객체의 상속과 가장 유사
- 정규화를 통해
디테일한 구조
를 만들 수 있음
[ 사용 ]
(Item.java)
- 슈퍼타입에 해당하는 Item객체를 추상화 클래스로 만든다
(TABLE_PER_CLASS
전략에서는 필수지만 다른 전략은 필수는 아님)
--> 추상화 클래스로 한다는 것은 단독적으로 쓰지 않는다는 것을 의미!@Inheritance
를 사용해서stategy
를JOINED
로 설정- 자동으로 하위 Table을 구분하기 위한
DTYPE
라는Column
이 생성됨@DiscriminatorColumn
옵션으로DTYPE
말고 이름을 지정할 수 있음@DiscriminatorValue
로DTYPE
에 들어가는Value
를 바꿀 수 있음
(하위Table
에 해당하는Entity
에 추가해야 함)/* 하위 테이블을 구분하는 컬럼을 DTYPE으로 설정 */ @DiscriminatorColumn(name = "DTYPE") /* DTYPE의 Value가 ALBUM으로 설정 -- Album.java에 추가해야 함 */ @DiscriminatorValue("ALBUM")
(Album.java)
- 서브타입에 해당하는
Entity
에서extends
로 상속받는다
[ 장&단점 ]
- 장점
- 테이블 정규화
- 외래키 참조 무결성 제약조건 활용 가능
--> 외래키를 통한 쿼리 등 사용 가능- 저장공간 효율화
- 단점
- 조회시 조인을 많이 사용, 성능 저하
--> 실무에서는 이러한 저하보다 장점의 이득이 많은 경우가 많음- 조회 쿼리가 복잡
- 데이터 저장시 INSERT SQL 2번 호출
[ 설명 ]
- 슈퍼타입을 기준으로 하나의 Table로 통합해버리는 방식
- 하위 객체임을 구분하는
DTYPE
이 기본적으로 들어감
(@DiscriminatorColumn
할 필요가 없음)
--> 그래야 하위 객체를 구분하기 때문@Inheritance
의기본전략
[ 사용 ]
JOIN
전략에서strategy
만 바꾸어주면 됨/* Default가 SINGLE TABLE 전략이라서 생략해도 된다 */ @Inheritance @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
[ 장&단점 ]
- 장점
- 조인이 필요없음 --> 조회 성능이 빠름
- 조회 쿼리가 단순
- 단점
- 자식 Entity가 매핑한 컬럼은 모두
null 허용
해야 함
-->데이터 무결성
입장에서 볼때
null이 허용되는 컬럼이 많으면 좋지 않을 수 있음- 하나에 모든것을 저장하므로, 상황에 따라 조회성능이 오히려 느려질 수 있음
--> 보통 이러한임계값
을 넘기지 않아서 괜찮다
[ 설명 ]
서브타입
을 기준으로슈퍼타입
의속성
을 모두 삽입해주는 방식
[ 사용 ]
- 슈퍼타입에 해당하는 객체를 반드시 추상클래스로 생성(필수)
abstract class
JOIN
전략에서strategy
만 바꾸어주면 됨@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
[ 장&단점 ]
- 장점
- 서브타입을 명확하게 구분해서 처리할때 효과적
not null
제약조건 사용 가능- 단점
- 여러 자식 테이블 함께 조회시 성능이 느리다
--> 모든 테이블을union
해서 가져오기 때문에 비효율적- 자식 테이블을 통합해서 쿼리하기 어렵다
- 결과적으로 이 방법은 실무에서 절대 사용하지 않는 것을 권장
[ 설명 ]
- DB와 상관없이 중복되는 속성들을 상속받아 편리하게 사용하기 위한 것
- 중요한 것은 DB 연관관계에 영향을 주지 않는다는 것
- 단순 정보 제공 목적
- 직접 생성해서 사용할 일이 없으므로
추상클래스
권장- 주로
등록일
/수정일
/등록자
/수정자
같은 전체 엔티티 공통 정보를 모을 때 사용- 참고 :
@Entity
는@Entity
나@Mappedsuperclass
만 상속 가능
[ 사용 ]
(BaseEntity.java)
- 보통
BaseEntity
라는 이름으로 추상 클래스를 생성- 필요한 속성 정의
(Member.java)
- 필요한 객체에서
extends
로 상속
[ 결과 ]
- 이런식으로
공통된 속성
들이Column
으로 들어간다
- RDB에는 상속이 없으므로, 이와 비슷한
슈퍼타입-서브타입
모델링을 사용
슈퍼타입-서브타입
을 실제 물리 모델로 구현하는 방법은 3가지
조인 전략
: 각각 테이블로 변환단일 테이블 전략
: 하나의 통합 테이블로 변환구현 클래스마다 테이블 전략
: 서브타입 테이블로 변환
- 보통
조인 전략
을 기본으로 사용
--> 객체의 상속과 가장 유사한 논리로 구성할 수 있음- 필요에 따라
단일 테이블 전략
을 사용해 성능을 올리기도 함구현 클래스마다 테이블 전략
은 절대 사용하지 않는 것을 권장!