[JPA] 상속관계 매핑과 @Enumerated

jiaLEE·2022년 6월 14일
0

jpa에서 테이블 간의 상속관계와 연관관계가 있다.
아래의 글들을 통해 먼저 상속관계를 이해하고 enum 사용법에 대해 알아보자!

상속관계

전제: abstract 부모 클래스를 자식이 extends 해서 사용합니다.

상속관계를 매핑하는데 종류가 3가지 있다.

    1. 싱글 테이블 전략
    1. Joined 전략
    1. Table per class 전략

1. 싱글 테이블 전략

싱글테이블 전략은 말 그대로 여러개의 테이블을 하나의 테이블에 담는 전략이다.
위의 그림과 같이 모든 테이블의 결과를 하나에 담고 DTYPE에 어떤 테이블의 것인지 표기된다. 아래의 코드를 참고하자.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)	//기본값이 싱글테이블
@DiscriminatorColumn(name="dtype")	//name 생략 가능
@Getter @Setter
public abstract class Item {		//abstract class

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


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

위의 부모 테이블의 경우, @Iheritance의 starategy속성에서 단일 테이블인 SINGLE_TABLE을 선택하면 된다.
추가적으로 부모테이블임을 @DiscriminatorColumn을 통해 선언하며 name="dtype"이 기본값이라 생략이 가능하다.

@Entity
@DiscriminatorValue("B")
@Getter
@Setter
public class Book extends Item {

    private String author;
    private String isbn;
}

자식 테이블은 @DiscriminatorValue를 통해 자식을 표시하고 안에 값을 무조건 선언해줘야 한다.
이때 기입한 값인 'B'는 추후에 dtype으로 들어가는 값이다.

딱봐도 알겠지만 이렇게 테이블을 만들게 되면 조회에는 효과적이지만 테이블 안의 컬럼 수가 굉장히 커지는 단점이 있다.

2. 조인테이블 전략

그림에서 볼수있듯이 각 테이블마다 클래스를 만들고 부모테이블의 pk를 fk로서 자식테이블들이 가지고 있는다.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)		
@DiscriminatorColumn(name="dtype")	//name 생략 가능
@Getter @Setter
public abstract class Item {		//abstract class

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

    private String name;
    private int price;
    private int stockQuantity;
@Entity
@DiscriminatorValue("B")
@Getter
@Setter
public class Book extends Item {

    private String author;
    private String isbn;
}

코드는 싱글테이블과 동일하나 strategy만 join으로 변경하면 된다.

3. Table per class 전략

자식들의 클래스만 존재하고 부모 클래스는 존재하지 않는다. 자식클래스에 부모클래스에 관한게 다 들어있는 형태이다.
쓰지않는다고 하니 넘긴다.


enum

enum을 정의할 때, 아래와 같이 열거를 통해 만들 수 있다.

public enum OrderStatus {
    ORDER, CANCLE  
}

: orderStatus(주문상태)의 관해서 값은 ORDER와 CALCLE이 존재한다.

enum 자료형을 부를때는 필수적으로 @Enumerated 를 넣어주며 이때 속성을 EnumType.STRING 으로 꼭 변경해야한다.

@Entity
@Table(name="orders")	//nameth속성을 통해 테이블명을 따로 정할 수 있다.
@Getter @Setter
public class Order {

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

    @Enumerated(EnumType.STRING)
    private OrderStatus status; // 주문상태 [ORDER, CANCEL]

기본값은 EnumType.ORDINAL인데 이렇게 할 경우 숫자로 기입이 된다.
추후 주문상태에 새롭게 값이 추가되면 기존의 값들이 변경될 수 있기때문에 무조건 타입을 String으로 변경한다.

[출처] 인프런:실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발, 김영한

0개의 댓글