Programming/JPA

JPA - 고급 매핑

잇(IT) 2023. 7. 14. 17:36

- 상속관계 매핑

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

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

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


- 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법

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

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

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


- 주요 어노테이션

1. @Inheritance(strategy=InheritanceType.XXX)
1.1. JOINED: 조인 전략
1.2. SINGLE_TABLE: 단일 테이블 전략
1.3. TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
2. @DiscriminatorColumn(name=“DTYPE”)
3. @DiscriminatorValue(“XXX”)


- 조인 전략

1. 장점

1.1. 테이블 정규화

1.2. 외래 키 참조 무결성 제약조건 활용기능

1.3. 저장곤간 효율화

2. 단점

2.1. 조회시 조인을 많이 사용, 성능 저하

2.2. 조회 쿼리가 복잡함

2.3. 데이터 저장시 INSERT SQL 2번 호출


- 단일 테이블 전략

1. 장점

1.1. 조인이 필요 없으므로 일반적으로 조회 성능이 빠름

1.2. 조회 쿼리가 단순함

2. 단점

2.1. 자식 엔티티가 매핑한 컬럼은 모두 null 허용

2.2. 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다. 상황에 따라서 조회 성능이 오히려 느려질 수 있다.


- @MappedSuperclass

 

- 공통 매핑 정보가 필요할 때 사용(id, name)

1. 상속관계 매핑이 아니다.

2. 엔티티가 아니다. 테이블과 매핑되지 않는다.

3. 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공한다.

4. 조회, 검색 불가(em.find(BaseEntity) 불가능하다.)

5. 직접 생성해서 사용할 일이 없으므로 추상 클래스로 작성하는 것을 권장한다.

 

- 테이블과 관계 없고, 단순히 엔티티가 공통으로 사용하는 매핑 정보를 모으는 역할을 한다.

- 주로 등록일, 수정일, 등록자, 수정자 같은 전체 엔티티에서 공통으로 적용하는 정보를 모을 때 사용한다.

- @Entity 클래스는 엔티티나 @MappedSuperclass로 지정한 클래스만 상속 가능하다.

 


- Member

@Entity
public class Member extends BaseEntity{

    @Id @GeneratedValue
    @Column(name = "MEMBER_ID")
    private Long id;
    private String name;
    private String city;
    private String street;
    private String zipcode;

 

- Order

@Entity
@Table(name = "ORDERS")
public class Order {

    @Id
    @GeneratedValue
    @Column(name = "ORDER_ID")
    private Long id;

    @Column(name = "MEMBER_ID")
    private Long memberId;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;
}

 

- Delivery

@Entity
public class Delivery extends BaseEntity{

    @Id
    @GeneratedValue
    @Column(name = "DELIVERY_ID")
    private Long id;

    private String city;
    private String street;
    private String zipcode;
    private DeliveryStatus status;

    @OneToOne(mappedBy = "delivery")
    private Order order;
}

 

- OrderItem

@Entity
public class OrderItem {

    @Id
    @GeneratedValue
    @Column(name = "ORDER_ITEM_ID")
    private Long id;

    @Column(name = "ORDER_ID")
    private Long orderId;

    @Column(name = "ITEM_ID")
    private Long itemId;

    private int orderPrice;
    private int count;

 

- Item

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn
public abstract class Item extends BaseEntity{

    @Id
    @GeneratedValue
    @Column(name = "ITEM_ID")
    private Long id;

    private String name;
    private int price;
    private int stockQuantity;

    @ManyToMany(mappedBy = "items")
    private List<Category> categories = new ArrayList<>();

 

- Album

@Entity
public class Album extends Item{

    private String artist;
    private String etc;

 

- 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;

 

- Category

@Entity
public class Category extends BaseEntity{

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Category parent;

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

    @ManyToMany
    @JoinTable(name = "CATEGORY_ITEM",
            joinColumns = @JoinColumn(name = "CATEGORY_ID"),
            inverseJoinColumns = @JoinColumn(name = "ITEM_ID")
    )
    private List<Item> items = new ArrayList<>();
}

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 인프런 - 우아한 형제들 기술이사 김영한의 스프링 완전 정복 (자바 ORM 표준 JPA 프로그래밍 - 기본편)

728x90

'Programming > JPA' 카테고리의 다른 글

JPA - 즉시 로딩, 지연 로딩  (0) 2023.07.17
JPA - 프록시  (0) 2023.07.17
JPA - 다양한 연관관계 매핑  (0) 2023.07.14
JPA - 연관관계 매핑 기초  (0) 2023.07.14
JPA - 엔티티 매핑  (0) 2023.07.14