[JPA 프로그래밍 - 기본편] 고급 매핑

지현·2022년 2월 8일
0

JPA

목록 보기
7/12

상속관계 매핑

  • 객체의 상속, 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 (슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사)
  • DB의 슈퍼타입, 서브타입이라는 논리 모델링기법을 어떤 세가지 방법을 사용하여 구현하던지 다 매핑하도록 지원
  • DB 입장에서 어떤 방법으로 구현하더라도 JPA에선 다 매핑이 가능

조인 전략

  • 정규화해서 모델링하고 조인하는 방식 (중복 X)
  • 구분하는 컬럼을 둠 (DTYPE) @DiscriminatorColum, @DiscriminatorValue(“XXX”)
  • @Inheritance(strategy = InheritanceType.JOINED)
  • 기본적으로는 조인 전략이 정석으로 사용됨!!
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn //DTYPE > 엔티티 명이 들어감
public class Item{
	@Id @GeneratedValue
    private Long id;
    
    private String name;
    private int price;
    
    ...
    
}
@Entity
@DiscriminatorValue(A) //기본은 클래스 명과 같음
public class Album extends Item{
	priave String artist;
}

장점

  • 데이터가 정규화가 되어있고, 제약조건을 공통적으로 맞출 수 있음
  • 외래키 참조 무결성 제약조건 활용 가능
  • 공통적인 부분을 조회할 때, 부모 클래스 테이블만 확인하면 됨 > 설계가 깔끔
  • 저장공간 효율화

단점

  • 조회할 때 조인을 많이 사용하여 쿼리가 복잡하고 성능이 저하됨
  • 데이터 저장 할 때 insert 쿼리가 2번 호출
  • 관리가 복잡

단일 테이블 전략

  • 통합 테이블로 변환
  • 테이블 하나에 다 넣고 DTYPE으로 구분
  • @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
  • 단일 테이블 전략은 DTYPE이 필수이기 때문에 @DiscriminatorColumn 이 없어도 생성됨
  • 생성, 조회 쿼리 한번만 나가면 됨 (테이블이 하나여서)
  • 비즈니스가 단순할 때 사용하면 좋음
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Item{
	@Id @GeneratedValue
    private Long id;
    
    private String name;
    private int price;
    
    ...
    
}
@Entity
@DiscriminatorValue(A) //기본은 클래스 명과 같음
public class Album extends Item{
	priave String artist;
}

장점

  • 조인이 필요 없어서 조회 성능이 빠름
  • 조회 쿼리 단순

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null을 허용해야 함
  • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있고, 상황에 따라서 조회 성능이 오히려 느려질 수 있음 (거의 없는 일)

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

  • 서브타입 테이블로 변환
  • 속성들 중복되게 허용
  • Item 클래스는 abstract로 생성
  • DTYPE 필요 없음
  • 사용하면 안되는 전략!!
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item{
	@Id @GeneratedValue
    private Long id;
    
    private String name;
    private int price;
    
    ...
    
}
@Entity
public class Album extends Item{
	priave String artist;
}

장점

  • 서브 타입을 명확하게 구분해서 처리할 때 효과적
  • not null 제약조건 사용 가능

단점

  • 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요)
  • 자식 테이블을 통합해서 쿼리하기 어려움
  • 변경할 때 좋지 않음

Mapped Superclass - 매핑 정보 상속

  • 공통적으로 사용해야 할 속성이 있을 때 사용
  • 상속관계 매핑 X, 엔티티 X, 테이블과 매핑 X
  • 부모 클래스를 상속받는 자식 클래스에 속성만 제공
  • 부모 타입으로 조회, 검색 불가능!!!
  • 직접 생성해서 사용할 일이 없으므로 추상 클래스 권장
  • 참고 : @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능
@MappedSuperclass
public abstract class BaseEntity{
	private String createdBy;
    private LocalDateTime createdDate;
    private String lastModifiedBy;
    private LocalDateTime lastModifiedDate;
    
    ...
    
}
public class Member extends BaseEntity{
	...
}


출처
[인프런] 자바 ORM 표준 JPA 프로그래밍 - 기본편

0개의 댓글

관련 채용 정보