7. 고급 매핑 - (상속 관계 매핑)

HotFried·2023년 10월 2일
0

조인 전략

장점

  • 테이블 정규화
  • 외래 키 참조 무결성 제약조건 활용가능
  • 저장공간 효율화

단점

  • 조회시 조인을 많이 사용, 성능 저하
  • 조회 쿼리가 복잡함
  • 데이터 저장시 INSERT SQL 2번 호출

Code

Item 엔티티

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

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;
}

movie 엔티티 (Item 엔티티를 상속받는다)

@Entity
public class Movie extends Item {

    private String director;
    private String actor;
}

JpaMain

Movie movie = new Movie();
movie.setDirector("aaaa");
movie.setActor("bbbb");
movie.setName("바람과함께사라지다");
movie.setPrice(10000);

em.flush();
em.clear();

Movie findMovie = em.find(Movie.class, movie.getId());
System.out.println("findMovie = " fineMovie);

tx.commit();

Movie 엔티티 생성 후 em.flush()를 이용해 Query를 날리고 em.clear()를 통해 영속성 컨텍스트를 초기화한다.
이 후, 엔티티 조회 시 inner join Query가 나간다.

Hibernate:
	select
    	movie0_.id as id1_2_0_,
        movie0_1_.name as name2_2_0_,
        movie0_1_.price as price3_2_0_,
        movie0_.actor as actor1_6_0_,
        movie0_.director as director2_6_0_
    from
    	Movie movie0_
    inner join
   		Item movie0_1_
        	on movie0_.id=movie0_1_.id
    where
    	movie0_.id=?

findMovie = hello.jpa.Movie@534ca02b

단일 테이블 전략

장점

  • 조인이 필요 없으므로 일반적으로 조회 성능이 빠르다.
  • 조회 쿼리가 단순하다.

단점

  • 자식 엔티티가 매핑한 컬럼은 모두 null이 허용된다.
  • 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다.
    상황에 따라서 조회 성능이 오히려 느려질 수 있다.

Code

Item 엔티티

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

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;
}
  • 모든 필드가 ITEM 테이블에 합쳐지고 자식 테이블은 생성되지 않는다.
  • @DiscriminateColumn 어노테이션을 달지 않아도 DTYPE이 기본적으로 생성된다.
  • 해당 자식 Entity와 관련이 없는 데이터는 null로 들어간다.

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

  • 이 전략은 데이터베이스 설계자와 ORM 전문가 둘다 추천X

장점

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

단점

  • 여러 자식 테이블을 함께 조회할 때 성능이 매우 느림
  • 자식 테이블을 통합해서 쿼리하기 어렵다.

Code

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

    @Id @GeneratedValue
    private Long id;

    private String name;
    private int price;
}

JPA가 알아서 단일 테이블로 조회한다.
DTYPE이 필요 없으므로 @DiscriminatorColumn 어노테이션을 달아도 적용되지 않는다.


Note:

  • JPA 덕분에 DB 설계가 바뀌어도 코드는 손대지 않고 애너테이션의 전략만 바꾸면 해결된다.

  • 기본적으로 조인 전략을 선택하고, 테이블이 정말 단순하고 확장할 가능성이 없다면 단일 테이블 전략을 선택한다.

  • 비즈니스적으로 중요하고 복잡하면 조인 전략을 선택한다.


참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

자바 ORM 표준 JPA 프로그래밍 - 기본편

profile
꾸준하게

0개의 댓글