JPA 고급 매핑

이상민·2021년 11월 9일
0

JPA

목록 보기
6/8
post-thumbnail

1. 상속관계 매핑

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

  • 그나마 슈퍼타입 서브타입 관계라는 논리적 모델링 기법이 객체 상속과 유사하다

  • 상속관계 매핑은 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑한다. 3가지 전략을 사용할 수 있다

1-1. 조인 전략

  • 조인 전략 : 슈퍼타입 서브타입을 별도 테이블로 둔다

    • 장점 :
      • 정규화
      • 외래 키 참조 무결성 제약 조건 활용가능
      • 저장공간 효율화
    • 단점 :
      • 조회시 조인을 많이 사용
      • 성능 저하, 조회 쿼리가 복잡
      • 데이터 저장시 INSERT문 2회 호출
@Entity 
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "ITEM_TYPE")
public class Item {
    @Id @GeneratedValue
    private Long id;
    
    private String name;
    private Integer price;
}


@Entity
public class Album extends Item {
    private String artist;
}


@Entity
public class Movie extends Item {
    private String director;
    private String actor;
}


@Entity
public class Book extends Item [
    private String author;
    private String ISBN;
}

1-2. 단일 테이블 전략

  • 단일 테이블 전략 : 하나의 테이블에 모든 정보를 담는다

    • 장점 :
      • 조인이 필요 없어 조회 성능이 빠름
      • 조회 쿼리가 단순
    • 단점 :
      • 자식 엔티티가 매핑한 컬럼은 모두 null 허용
      • 단일 테이블에 모든 것을 저장하므로 테이블이 커짐. 상황에 따라서 조회 성능이 오히려 느려질 수 있음
@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "ITEM_TYPE")
public class Item {
    @Id @GeneratedValue
    private Long id;
    
    private String name;
    private Integer price;
}


@Entity
public class Album extends Item {
    private String artist;
}


@Entity
public class Movie extends Item {
    private String director;
    private String actor;
}


@Entity
public class Book extends Item [
    private String author;
    private String ISBN;
}

1-3. 각각 테이블 전략

  • 각각 테이블 전략 : 각각 테이블이 슈퍼타입의 정보를 가진다
    • 데이터베이스 설계자와 ORM 전문가 둘 다 싫어한다
    • 장점 :
      • 서브 타입을 명확하게 구분, 처리시 효과적
      • not null 제약 조건 사용 가능
    • 단점 :
      • 여러 자식 테이블을 함께 조회할 때 성능이 느림 (UNION)
      • 자식 테이블을 통합해서 쿼리하기 어려움
@Entity 
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
    
    private String name;
    private Integer price;
}


@Entity
public class Album extends Item {
    private String artist;
}


@Entity
public class Movie extends Item {
    private String director;
    private String actor;
}


@Entity
public class Book extends Item [
    private String author;
    private String ISBN;
}

2. @MappedSuperclass

  • 공통 매핑 정보가 필요할때 사용하는 애노테이션
    ex) 생성일, 수정일
  • 상속관계 매핑이 아니다! 조회 검색이 불가하고 직접 생성해서 사용하는 일이 없으므로 추상 클래스를 권장한다

@MappedSuperclass
public abstract class BaseEntity {
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt = createdAt;
}

@Entity
public class User extends BaseEntity {
    ...
}

@Entity
public class Ticket extends BaseEntity {
    ...
}
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글