BE전문가 프로젝트

상속관계 매핑 본문

JPA

상속관계 매핑

원호보고서 2022. 10. 29. 14:15
  • 객체에는 상속 관계가 있지만  관계형 데이터베이스는 상속 관계X
  • 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사
  • 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑

  • 음반, 영화, 책의 공통 속성인 이름, 가격을 물품에 분류한다
  • 각각 가지고 있는 특성은 밑에 따로 분류한다.
  • 객체에서는 왼쪽 그림과 같이 명확하게 상속 관계를 가지고 있다

 

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

  • 각각 테이블로 변환 -> 조인 전략
  • 통합 테이블로 변환 -> 단일 테이블 전략
  • 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략

JPA에서는 위에 3가지방법 모두 지원한다

 

주요 Annotation

  • @DiscriminatorColumn(name="DTYPE")
  • @DiscriminatorVallue("XXX")
  • @Inhetitance(strategy=InheritanceType.XXX)

          - JOINED: 조인 전략

          - SINGLE_TABLE: 단일 테이블 전략

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

 

 

JOIN  전략

지금 이 모델은 DB를 가장 잘 정규화 해서 만들어진 테이블이다. 그리고 JPA와 가장 유사한 모습을 띄고 있다.

 

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn
public abstract class Item {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;
}
@Entity
@DiscriminatorValue("A")
public class Album extends Item {

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

    private String author;
    private String Isbn;
}
@Entity
public class Movie extends Item {

    private String Director;
    private String Actor;
}
  • 아무것도 설정하지 않으면 싱글 테이블로 구성되어 Item에 모든 요소들이 들어간다.
  • 주인 객체에 @Inheritance(strategy = InheritanceType.JOINED)을 사용하면 위에 보이는 테이블 처럼 JPA를 설계할 수 있다
  • @DiscriminatorColumn을 사용하게 되면  기본으로 DTYPE이란 Column이 생성되며 엔티티 명 데이터가 입력된다.
  • 기본으로 엔티티 명이 DTYPE에 들어가지만 @DiscriminatorValue("A")를 사용하면 A라는 값으로 데이터가 입력된다
ublic class JPAMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();                                     //트랜잭션 시작

        try {

            Movie movie = new Movie();

            movie.setDirector("aaa");
            movie.setActor("bbb");
            movie.setName("바람과 함께 사라지다");
            movie.setPrice(10000);

            em.persist(movie);

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}

 

 

 

단일 테이블 전략

모든 데이터를 단일 테이블로 관리하고 싶을 때 사용하는 전략이며 DTYPE으로 분류한다.

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

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;
}
  • @Inheritance(strategy = InheritanceType.SINGLE_TABLE)을  사용하여 설계할 수 있다.
  • @DiscriminatorColumn이 없어도 자동으로 DTYPE이 생성된다. 하지만 적용해주는 것이 운영하는 데 있어서 더 좋다.

 

 

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

 

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Item {

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;

}
  • 단순하게 값을 빼고 넣을 때는 좋지만 조회 시에는 문제가 생길 수 있다. Item객체로 movie를 찾고 싶을 때 Album, Book에 있는 모든 Id를 찾기 때문에 성능에 큰 지장을 줄 수 있다.

 

각 전략의 장단점

   
조인 전략(정석) 장점 - 테이블정규화 
        - 제약조건을 상위 엔티티에 걸어 쉽게 가져올 수 있다.
        - 외래 키 참조 무결성 제약조건 활용
        - 저장공간 효율화(정규화)
단점 - 조회시 조인을 많이 사용, 성능 저하
        - 조회 쿼리가 복잡함
        - 데이터 저장시 Inset SQL 2번 호출
단일 테이블 전략 장점 - 조인이 필요 없으므로 일반적으로 조회 성능이 빠름
        - 조회 쿼리가 단순함
단점 - 자식 엔티티가 매핑한 컬럼은 모두 null허용(무결성 이슈)
        - 단일테이블에 모든 것을 저장하므로 테이블이 커질 수 있고, 상황에 따라서 조회 성능          -   이 저하될 수 있음
구현 클래스마다 테이블 전략
(사용X)
장점 - 서브 타입을 명확하게 구분해서 처리할 때 효과적
         - not null 제약조건 사용 가능
단점 - 여러 자식 테이블을 함께 조회할 대 성능이 느림(UNION SQL을 사용하여 복잡한 쿼              리가 조회됨)
        - 자식 테이블을 통합해서 쿼리하기 어려움
        - 이 전략은 DB 설계자와 ORM 전문가 둘 다 추천X

 

 

JPA가 가진 또 하나의 장점

처음 설계를 했을 때 Join전략으로 설계했지만 성능상에 이슈가 생겨 단일 테이블로 설계를 다시 해야하는 경우가 종종 있다. JPA가 없을 경우에는 테이블을 다시 생성하고 복잡한 과정들을 다시 거쳐야 하지만 JPA의 경우 Annotation 설정 정보만 바꿔주면 간단하게 수정이 가능하다. 

 

상위 엔티티를 만들 때는 항상 abstract 즉 추상클래스로 만들어야 되는데 사용하지 않는 다면 독단적으로도 사용이 가능하다는 것을 의미하기 때문에 항상 추상 클래스로 만들어 줘야 한다.

'JPA' 카테고리의 다른 글

쇼핑몰 만들기 3 - 상속관계 매핑  (0) 2022.10.30
@MappedSuperclass  (0) 2022.10.30
연관관계 Annotation 정리  (0) 2022.10.27
쇼핑몰 만들기 2 - 다양한 연관 관계 매핑  (0) 2022.10.27
일대일(1:1)  (0) 2022.10.23
Comments