Search
Duplicate

[Spring JPA] 고급 맵핑

날짜
2022/04/29 05:20
상태
스프링 JPA 기본
속성 1
Spring
JAVA
JPA
담당자

상속관계 매핑

관계형 데이터베이스는 상속 관계가 없음
슈퍼 타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
상속관계 매핑: 객체의 상속 구조와 DB의 슈퍼 타입 서브타입 관계를 매핑

상속관계 매핑

슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법
각각 테이블로 변환 > 조인 전략
통합 테이블로 변환 > 단일 테이블 전략
서브타입 테이블로 변환 > 구현 클래스마다 테이블 전략
1) 조인 전략
Join을 할 때 @DiscriminatorColumn을 넣지 않으면 DTYPE이 안 들어가게 된다. 이렇게 될 시 객체적으로 볼 때는 문제가 안되지만 DB만을 보게 될 시 어떻게 값이 들어오는지 찾기가 어려워진다. 때문에 조인 전략을 사용 할때@DiscriminatorColumn을 써주자.
장점
테이블 정규화
외래 키 참조 물경성 제약조건 활용 가능
저장공간 효율화
단점
조회 시 조인을 많이 사용, 서능 저하
조회 쿼리가 복잡함
데이터 저장 시 INSERT SQL 2번 호출
2) 단일 테이블 전략
단일 테이블 전략은 @DiscriminatorColumn이 없어도 DTYPE이 생성된다.
단일 테이블 전략은 내가 앨범, 무비, 북인지 알 수가 없기 때문에 필수로 생성이 된다.
장점
조인이 필요 없다
조회 쿼리가 단순함
단점
자식 엔티티가 매핑한 칼럼은 모두 null 허용
단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있게 상황에 따라서 조회 성능이 오히려 느려질 수 있다.]
3) 구현 클래스마다 테이블 전략
사용하면 안 되는 전략
장점
서브 타입을 명확하게 구분해서 처리할 때 효과적
not null 제약조건 사용 가능
단점
여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION SQL)
자식 테이블을 통합해서 쿼리 하기 어려움

주요 어노테이션

@Inheritance(stragegy=InheritanceType.XXX)
JOINED: 조인 전략
SINGLE_TABLE: 단일 테이블 전략
TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
@DiscriminatorColumn(name="DTYPE")
@DiscriminatorValue("XXX")

Mapped Superclass

공통 매핑 정보가 필요할 때 사용(id, name)
상속관계 맵핑이 아니다
엔티티가 아니다, 테이블과 매핑하는 게 아니다.
부모 클래스를 상속받는 자식 클래스에 매핑 정보만 제공
조회, 검색 불가(em.find(BaseEntity) 불가)
직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
@MappedSuperclass
테이블과 관계없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할
주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용
참고: @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능
package helloJpa; import javax.persistence.Column; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; @MappedSuperclass// 속성을 같이 쓰고 싶다고 할때 사용한다. 공통적으로 사용할 속성을 사용 할 때 쓴다.public abstract class BaseEntity { @Column(name = "INSERT_MEMBER")//이런식으로 변경도 가능private String createBy; private LocalDateTime createDate; @Column(name = "UPDATE_MEMBER")//이런식으로 변경도 가능private String lastModifiedBy; private LocalDateTime lastModifiedDate;
Java
복사
package helloJpa; import javax.persistence.*; @Entity public class Member extends BaseEntity { ... }
Java
복사
public class JpaMain { public static void main(String[] args) { ... try { Member member = new Member(); member.setCreateBy("오늘생성.."); em.persist(member);
Java
복사
결론
@MappedSuperclass는 공통 매핑 정보를 사용할 때 기본적으로 많이 사용되고, 또한 갑작스러운 DBA의 공통으로 DB날짜 insert를 원할 경우에도 많이 사용된다. 기본 속성으로 묶어서 넣어주고 싶을 때 사용하는 것이라고 생각하면 좀 더 편하게 다가온다.
이 글은 인프런의
제목 : 자바 ORM 표준 JPA 프로그래밍 - 기본 편
강사 : 김영한 님의 동영상을 참조해 만들었습니다.