영속성 관련 이슈

응답 값으로 엔티티를 직접 노출 한 경우

문제점

  • 엔티티의 모든 값 추가
  • 응답 스팩을 맞추기 위한 로직 추가
  • api스팩에 대한 변경에 대응하기 어려움

Fetch Join

장점

  • SQL 한번으로 연관된 엔티티를 함께 조회할 수 있어 SQL 호출 횟수를 줄여 성능 최적화 가능

단점

  • 1대 다 fetch join 페이징 불가능
  • 컬렉션 둘 이상의 패치조인 사용하면 안됨 ⇒ 데이터가 부정합하게 조회 될수 있음

ex)

em.createQuery(
    "select o from Order o join fetch o.member m join fetch o.deleveryd",Order.class
).getResultList();

distinct

  • jpa 의 distinct는 디비의 distinct 엔티티의 중복인 경우 중복을 걸러서 보내줌

페이징 처리를 하며 Collection 한계 돌파

  • ToOne(OneToOne, ManyToOne)모두 패치 조인

  • 컬렉션은 지연 로딩으로 조회

  • 지연 로딩을 최적화 하기위해 hibernate.default_batch_fetch_size (inquery 갯수)/ @BatchSize 둘중 하나 사용

  • @BatchSize : 개별 최적화

  • hibernate.default_batch_fetch_size : 글로벌 설정

  • 이 옵션을 사용하면 컬렉션이나, 프록시 객체를 한꺼번에 설정한 size만큼 IN쿼리로 조회

  • 한계 )

em.createQuery(
    "select distinct o from Order o" + 
    "join fetch o.member m "+ //order 입장 패치 가능
    "join fetch o.delivery d "+  // order 입장 패치 가능
    "join fetch o.orderItems oi " //order 입장 패치 불가능  ToOne관계 아님
    "join fetch oi.item i", Order.class)  // 1대n 관계 관련으로 패치조인 불가능
  • 해결책)
public List<orderDto> order(@RequestParam(value="offset", default
em.createQuery(
    "select o from Order o"+
    "join fetch o.member m" +
    "join fetch o.delivery d", Order.class)
    .setFirstResult(offset)
    .setMaxResults(limit)
    .getResultList();
)

결론

  • ToOne관계는 패치조인 사용
  • 나머지는 hibernate.default_batch_fetch_size 로 최적화 (max : 1000 min:100)

'Study(Language) > JPA' 카테고리의 다른 글

[JPA] 트렌젝션  (0) 2020.06.03

+ Recent posts