일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백준 2164
- SOLID원칙
- k번째큰수
- removeAll
- 참조형 매개변수
- try-catch
- 백준 1935
- TCP/IP 4계층
- www.naver.com치면 발생하는일
- 팩토리패턴
- 싱글톤 패턴
- 스프링 싱글톤
- 스프링
- 리버스 프록시
- 옵저버 패턴
- 포워드 프록시
- 네트워크
- 스프링 빈
- 자바의 면접
- 참조형 반환타입
- 빈 타입 조회
- 후위표기식
- @Tranctional
- 전략 패턴
- 쇠막대기
- 스프링 컨테이너
- mvvm패턴
- Class Loader
- 기본형 매개변수
- 팩토리 패턴
- Today
- Total
스파이더 웹 개발
고급 매핑 본문
상속 관계 매핑
관계형 데이터베이스는 상속 관계가 불가하다
슈퍼타입, 서브타입 관계라는 모델링이 객체 상속과 매우 유사
상속관계 매핑은 객체의 상속과 구조를 DB의 슈퍼타입 서브타입 관계로 매핑한것이다
슈퍼타입 서브타입 논리 모델을 물리 모델로 구현하는 방법으로는 3가지가 있다
- 1. 각각 테이블로 변환 -> 조인전략 (해당 전략으로 권장한다, 단일테이블전략도 상황에따라 같이고려한다)
- 2. 통합 테이블로 변환 -> 단일 테이블 전략
- 3. 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략
예제
Item 이라는 클래스를 Movie, Book, Album 에서 상속받고있다고 가정하자
Item 클래스
@Entity
public class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
Book 클래스
@Entity
public class Book extends Item{
private String author;
private String isbn;
}
Movie 클래스
@Entity
public class Movie extends Item{
private String director;
private String actor;
}
Album 클래스
@Entity
public class Album extends Item{
private String artist;
}
아무런 설정없이 해당내용으로 실행하면 DB는 단일테이블전략을 기본값으로 설정하여 생성되는것을 알수 있다.
이제 각각의 전략을 사용하는 방법을 살펴보자
각각 테이블로 변환 -> 조인전략
@Entity
@Inheritance(strategy = InheritanceType.JOINED )
public class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
기존 코드의 @Inheritance(strategy = InheritanceType.JOINED ) 만 추가해주었다. 실행결과를 보자
create table Movie (
actor varchar(255),
director varchar(255),
id bigint not null,
primary key (id)
)
create table Item (
id bigint not null,
name varchar(255),
price integer not null,
primary key (id)
)
각각 테이블이 생성되었고, movie의 기본키는 item의 기본키로 설정되었다. 이러한 경우 값을 넣어주거나 가져오는 경우 어떻게될까?
try {
Movie movie = new Movie();
movie.setDirector("A");
movie.setActor("B");
movie.setName("고루");
movie.setPrice(1000);
em.persist(movie);
em.flush();
em.clear();
Movie findMovie = em.find(Movie.class, movie.getId());
System.out.println("findMovie = " + findMovie);
tx.commit();
}
테이블의 정상적으로 insert가 되었고, 값은 inner join을 통해 가져온것을 확인할 수 있다.
select
movie0_.id as id1_2_0_,
movie0_1_.name as name2_2_0_,
movie0_1_.price as price3_2_0_,
movie0_.actor as actor1_6_0_,
movie0_.director as director2_6_0_
from
Movie movie0_
inner join
Item movie0_1_
on movie0_.id=movie0_1_.id
where
movie0_.id=?
추가적으로 Item을 조회하는 경우 조회 쿼리 실행시 DB만 두고 확인하였을때는 어떠한 자손객체의 값을 가져왔는지 확인하기 어려운 경우가있다. 이러한 경우 DTYPE을 설정하여 어느 객체의 값인지 확인할 수 있다.
사용 방법은
@Entity
@Inheritance(strategy = InheritanceType.JOINED )
@DiscriminatorColumn
public class Item {
@Id
@GeneratedValue
private Long id;
private String name;
private int price;
}
부모 객체의 @DiscriminatorColumn 어노테이션을 붙여주면 되는데, 이러한 경우 기본값은 Entity명이 된다 확인해보자
DTYPE 컬럼이 생긴것을 확인할 수 있다. 혹시 DTYPE의 이름을 바꾸고싶은 경우 자식객체에서 @DiscriminatorValue("D") 해당 내용을 추가해주면된다
통합 테이블로 변환 -> 단일 테이블 전략
싱글테이블 전략의 경우는 기본전략에서 봤듯이 하나의 테이블이 생성되고 해당 테이블의 모든 컬럼을 넣는다. 그렇기에 객체를 구분할수가없어 DTYPE이 자동으로 설정되어있다.
서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략
Item 테이블은 생성되지않고 자식 클래스들만 생성이된다.
위의 이미지처럼 각 테이블의 Item의 필드와 자기자신의 필드가 합쳐진 테이블이 생성이된다
장단점
조인 전략
장점
- 테이블 정규화
- 외래 키 참조 무결성 조건
단점
- 조회시 조인을 많이 사용하여 성능이 저하될 수 있다.
- 조회 쿼리가 복잡하다
- 데이터 저장시 insert sql이 2번 호출된다
단일 테이블 전략
장점
- 조인이 필요없어 일반적으로 조회 성능이 빠르다
- 조회 쿼리가 단순하다
단점
- 자식 엔티티가 매핑한 컬럼은 모두 null을 허용한다
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상 황에 따라서 조회 성능이 오히려 느려질 수 있다
구현 클래스마다 테이블 전략(사용하면 안된다)
장점
- 서브 타입을 명확하게 구분해서 처리할 때 효과적
- not null 제약조건 사용 가능
단점
- 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
- 자식 테이블을 통합해서 쿼리하기 어려움
@MappedSuperclass
공통 매핑 정보가 필요할 때 사용한다
- 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
- 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통 으로 적용하는 정보를 모을 때 사용
- 상속관계 매핑X
- 엔티티X, 테이블과 매핑X
- 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
- 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
'JPA' 카테고리의 다른 글
값 타입 (0) | 2022.09.16 |
---|---|
프록시와 연관관계 관리 (0) | 2022.09.16 |
다양한 연관관계 매핑 (0) | 2022.09.02 |
연관관계 매핑 (0) | 2022.08.30 |
엔티티 매핑 (0) | 2022.08.28 |