고급 매핑

고급 매핑

상속관계 매핑

관계형 데이터베이스는 상속 관계가 없다.

슈퍼 타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사하다

상속관계 매핑 : 객체의 상속과 구조와 DB의 슈퍼 타입 서브타입 관계를 매핑

슈퍼 타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법은 다음과 같다.

1. 각각 테이블로 변환 -> 조인 전략

2. 통합 테이블로 변환 -> 단일 테이블 전략

3. 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략

일반적으로 클래스에서 상속을 받은 객체들로 매핑을 하게 되면 하나의 테이블에 모든 컬럼이 생기게 된다.

여기서 부모 클래스에 아래의 코드와 같이 어노테이션을 추가하면 조인 전략으로 테이블을 설계할 수 있다.

조인 전략

조인전략

조인전략 DB

위의 DB의 테이블을 보면 단일 테이블 전략 같은 경우 ITEM테이블에 모든 칼럼들이 들어가 있는 걸 볼 수 있는데, 조인 전략에서는 Item클래스와 상속받은 클래스의 테이블이 생성되고 PK이자 FK로 ITEM_ID를 가지고 있으며, 마치 자바의 상속과 매우 유사한 모습이다.

값을 저장한 결과

실제로 값을 넣어보았다. 위의 결과에서 보이는 MOVIE의 ID와 ITEM의 ID는 같다. 그 이유는 MOVIE에서 ID는 PK이자 FK이기 때문이다.(조인 전략)

단일 테이블 전략

단일 테이블전략 매핑

단일 테이블 DB

위의 코드를 보면 JOIN전략에서 -> SINGLE_TABLE 전략으로 바꾸어서 매핑을 하였다. 이 경우 테이블 하나에 모든 컬럼들이 들어가게 되는데 여기서 DTYPE이라는 컬럼이 자동으로 들어가게 되고 DTYPE컬럼은 어떤 곳에서 매핑이 되었는지 보여주며 값을 넣은 곳을 제외한 컬럼들은 null값이 들어가게 된다.

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

구현 클래스마다 테이블 전략은 TABLE_PER_CLASS로 어노테이션을 지정하면 된다.

위의 경우 Item클래스는 추상 클래스로 선언해야 하며, 실제 동작시 Item클래스의 DB 테이블은 만들어지지 않고, ITem클래스의 필드 컬럼들이 이 Item클래스를 상속받은 하위 클래스들의 DB 테이블의 컬럼으로 들어가게 된다.

조인 전략

- 조인 전략 장점

테이블 정규화 외래 키 참조 무결성 제약조건 활용 가능 저장공간 효율화

- 조인 전략 단점

조회 시 조인을 많이 사용(성능 저하) 조회 쿼리가 복잡함 테이터 저장 시 insert 쿼리 2번 호출

단일 테이블 전략

- 단일 테이블 전략 장점

조인이 필요 없으므로 일반적으로 조회 성능이 빠름 조회 쿼리가 단순함

- 단일 테이블 전략 단점

자식 엔티티가 매핑한 컬럼은 모두 null 허용 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있고 상황에 따라서 조회 성능이 더 느려질 수 있다.

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

쓰지 말자.

정리 : 조인 전략을 기본으로 하되 단순한 설계 같은 경우 단일 테이블 전략을 사용하자.

@MappedSuperclass

상속관계 매핑x 엔티티x, 테이블과 매핑x 부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공 조회, 검색 불가

@MappedSuperclass는 상속관계 매핑과 관계없이 속성을 같이 사용하고 싶을 때 다음과 같이 사용한다.

위의 코드를 보면 @MappedSuperclass로 공통적으로 사용할 클래스의 필드를 지정해주고 , 그 필드를 사용할 클래스에 상속을 해주었다.

그 후 값을 넣고 실행결과 MEMBER테이블에 Superclass를 지정한 필드의 컬럼들이 생성된 모습이다.

출처 : https://www.inflearn.com/course/ORM-JPA-Basic#

from http://dobi852.tistory.com/27 by ccl(A) rewrite - 2021-10-10 01:01:39