[내배캠/TIL(6/13)]JPA 연관관계 처리

손홍서·2022년 6월 13일
0

Spring

목록 보기
8/24

day36 TIL

API개발-지연로딩과 조회성는 최적화

  • 양방향 관계에서는 @JsonIgnore 붙여줘야 무한루프에 걸리지 않고 데이터를 가져올 수 있다.

  • 앤티티는 DTO로 변환해서 활용해야한다.

  • @xtoOne(다대일,일대일) fetch join 사용해 연관된 데이터들을 가져온다.

  • 일대다는 fetch join하면 페이징 불가
    ->batchsize 증가해

    public List<Order> findAllWithMemberDelivery(int offset, int limit) {
        return em.createQuery(
                "select o from Order o" +
                        " join fetch o.member m" +
                        " join fetch o.delivery d", Order.class)
                .setFirstResult(offset)
                .setMaxResults(limit)
                .getResultList();
    }

x대일 관계의 데이터로만 묶어 데이터 뻥튀기 되지 않는 선에서 가져옴

public OrderDto(Order order) {
            orderId = order.getId();
            name = order.getMember().getName();
            orderDate = order.getOrderDate();
            address = order.getDelivery().getAddress();
            orderItems = order.getOrderItems().stream()
                    .map(orderItem -> new OrderItemDto(orderItem))
                    .collect(Collectors.toList());
        }

이후는 for문으로 가져옴(LAZY로딩이기 때문에 하나씩 가져와 줘야한다.)

spring:
  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        default_batch_fetch_size: 100

근데 쿼리가 n개씩 나가는 것은 비효율적이기에 배치 사이즈를 설정해 한 번에 여러개를 가져오도록 한다.

profile
Hello World!!

0개의 댓글