API 개발 (4) - One to Many관계 - DTO 직접 조회

2021. 7. 29. 23:50·스프링/스프링부트 API 설계 정리

주문목록 가져오기 V4

  • QueryDto를 사용해서 바로 조회하는 방법

 

쿼리용 OrderQueryDto 클래스를 선언해서 해당 타입으로 받는 api
	@GetMapping("/api/v4/orders")
	public List<OrderQueryDto> orderV4() {
		return orderQueryRepository.findOrderQueryDtos();
	}

 

OrderQueryDto
@Data
public class OrderQueryDto {

    @JsonIgnore
    private Long orderId;
    private String name;
    private LocalDateTime localDateTime;
    private OrderStatus orderStatus;
    private Address address;
    private List<OrderItemQueryDto> orderItems;

    public OrderQueryDto(Long orderId, String name, LocalDateTime localDateTime, OrderStatus orderStatus, Address address) {
        this.orderId = orderId;
        this.name = name;
        this.localDateTime = localDateTime;
        this.orderStatus = orderStatus;
        this.address = address;
    }
}

쿼리 응답을 받기위한 클래스를 선언한다. 이때 Order(1)에 포함되는 N(orderItems)를 위한 OrderItemQueryDto를 따로 선언해줘야한다.

 

OrderItemQueryDto
@Data
public class OrderItemQueryDto {
    private Long orderItemId;
    private String itemName;
    private int price;
    private int count;

    public OrderItemQueryDto(Long orderItemId, String itemName, int price, int count) {
        this.orderItemId = orderItemId;
        this.itemName = itemName;
        this.price = price;
        this.count = count;
    }
}

 

해당 쿼리 응답용 OrderQueryRepository
    public List<OrderQueryDto> findOrderQueryDtos() {
        List<OrderQueryDto> result = findOrders();

        result.forEach(o -> {
            List<OrderItemQueryDto> orderItems = findOrderItems(o.getOrderId());
            o.setOrderItems(orderItems);
        });

        return result;
    }

    private List<OrderItemQueryDto> findOrderItems(Long orderId) {
        return em.createQuery(
                        "select new jpaBook.jpaShop.repository.order.query.OrderItemQueryDto(oi.order.id, i.name, oi.orderPrice, oi.count)" +
                                " from OrderItem oi" +
                                " join oi.item i" +
                                " where oi.order.id = :orderId", OrderItemQueryDto.class)
                .setParameter("orderId", orderId)
                .getResultList();
    }

    private List<OrderQueryDto> findOrders() {
        return em.createQuery(
                "select new jpaBook.jpaShop.repository.order.query.OrderQueryDto(o.id, m.name, o.orderDate, o.status, d.address)" +
                        " from Order o"+
                        " join o.member m" +
                        " join o.delivery d", OrderQueryDto.class
        ).getResultList();
    }

먼저 모든 주문을 findOrders()를 통해 찾는다. 이후 각 order에 대해서 해당 order.id와 같은 order.id를 가지는 orderitems를 찾기위해 findOrderItems()를 부른다. 반환받은 orderItems를 order의 속성값으로 넣어준다.

 

이런 구조가 되면, order목록 조회를 위해 1번의 쿼리, 각 order에서 orderItems를 조회하게 되어서 1 + N번의 쿼리가 발생한다.

 


 

반응형
저작자표시 (새창열림)

'스프링 > 스프링부트 API 설계 정리' 카테고리의 다른 글

API 개발 (6) - OSIV 정리  (0) 2021.07.30
API 개발 (5) - OneToMany관계 정리  (0) 2021.07.30
API 개발 (3) - One to Many관계 - Entity조회 후 DTO로 변환  (0) 2021.07.29
API 개발 (2) - X to One관계  (0) 2021.07.28
API 개발 (1) - 회원 조회, 수정, 생성  (0) 2021.07.28
'스프링/스프링부트 API 설계 정리' 카테고리의 다른 글
  • API 개발 (6) - OSIV 정리
  • API 개발 (5) - OneToMany관계 정리
  • API 개발 (3) - One to Many관계 - Entity조회 후 DTO로 변환
  • API 개발 (2) - X to One관계
구름뭉치
구름뭉치
구름의 개발일기장
  • 구름뭉치
    구름 개발일기장
    구름뭉치
  • 전체
    오늘
    어제
    • ALL (283)
      • 프로젝트 (23)
        • 토스페이먼츠 PG 연동 시리즈 (12)
        • JWT 방식 인증&인가 시리즈 (6)
        • 스우미 웹 애플리케이션 프로젝트 (1)
        • 스프링부트 기본 보일러 플레이트 구축 시리즈 (2)
        • 마이크로서비스 아키텍쳐 시리즈 (1)
      • 스프링 (43)
        • 스프링부트 API 설계 정리 (8)
        • 스프링부트 RestAPI 프로젝트 (18)
        • 스프링부트 WebSocket 적용기 (3)
        • 스프링 JPA 정리 시리즈 (5)
        • 스프링 MVC (5)
        • 스프링 배치 (2)
        • 토비의 스프링 정리 (2)
      • 기술 학습 (28)
        • 아파치 카프카 (9)
        • 클린 코드 (4)
        • 디자인 패턴의 아름다움 (2)
        • 모던 자바 인 액션 (7)
        • JVM 스레드 딥다이브 (6)
      • Web (25)
        • 정리글 (20)
        • GraphQL 정리글 (2)
        • Jenkins 정리글 (3)
      • 취업 (6)
      • CS (77)
        • 네트워크 전공 수업 정리 (11)
        • OSI 7계층 정리 (12)
        • 운영체제 정리 (19)
        • 데이터베이스 정리 (5)
        • MySql 정리 (17)
        • GoF의 Design Pattern 정리 (12)
      • 알고리즘 (70)
        • 백준 (56)
        • 프로그래머스 (12)
        • 알고리즘 정리본 (1)
      • 기초 지식 정리 (2)
      • 일상 (8)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    크로아티아
    류블라냐
    동유럽
    부다페스트
    mx master s3 for mac
    키보드 손목 받침대
    레이저
    마우스
    마우스 패드
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
구름뭉치
API 개발 (4) - One to Many관계 - DTO 직접 조회
상단으로

티스토리툴바