inflearn logo
강의

Course

Instructor

Real-world! Spring Boot and JPA Utilization 2 - API Development and Performance Optimization

Simple Order Lookup V2: Converting Entities to DTOs

쿼리가 강의보다 더 나오고 있습니다.

1343

misely2007623

9 asked

9

"/api/v2/simple-orders " 이 url로 호출했을 때,

(1) order테이블에서 가져오는 쿼리 1번 => (2개의 데이터)

(2) member 쿼리 1번 * 2

(3) delivery 쿼리 1번 * 2

해서 총 5번이 나오는 걸로 알고 있습니다.

 

근데 현재 로그에서 총 쿼리가 7번이 나가고 있습니다. 코드를 따라쳐보면서 했는데도 왜 다르게 나가는지 원인을 짐작하기가 힘듭니다.

현재 제 쿼리는

(1) order 테이블에서 가져오는 쿼리 1번

(2) member 쿼리 1번

(3) delivery 쿼리 1번

(4) delivery id 조건절로 order 찾는 쿼리 1번

(2)~(4)번 한 번 더 반복
이렇게 해서 총 7번 쿼리가 나가게 됩니다.

쿼리만 보고 어떤 부분때문에 더 나가게 됐는지 짐작할 수 있을까요? 엔티티 간의 연관관계 매핑은 강의를 보면서 했기 때문에 제가 중간에 놓쳤나 생각이 들기도 하네요ㅜ 원인을 짐작하기가 어렵습니다.

       select
        o1_0.order_id,
        o1_0.delivery_id,
        o1_0.member_id,
        o1_0.order_date,
        o1_0.status 
    from
        orders o1_0 
    join
        member m1_0 
            on m1_0.member_id=o1_0.member_id fetch first ? rows only
2023-03-23T19:03:54.387+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL                        : 
    select
        m1_0.member_id,
        m1_0.city,
        m1_0.street,
        m1_0.zipcode,
        m1_0.name 
    from
        member m1_0 
    where
        m1_0.member_id=?
2023-03-23T19:03:54.390+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL                        : 
    select
        d1_0.delivery_id,
        d1_0.city,
        d1_0.street,
        d1_0.zipcode,
        d1_0.status 
    from
        delivery d1_0 
    where
        d1_0.delivery_id=?
2023-03-23T19:03:54.393+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL                        : 
    select
        o1_0.order_id,
        o1_0.delivery_id,
        o1_0.member_id,
        o1_0.order_date,
        o1_0.status 
    from
        orders o1_0 
    where
        o1_0.delivery_id=?
2023-03-23T19:03:54.395+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL                        : 
    select
        m1_0.member_id,
        m1_0.city,
        m1_0.street,
        m1_0.zipcode,
        m1_0.name 
    from
        member m1_0 
    where
        m1_0.member_id=?
2023-03-23T19:03:54.396+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL                        : 
    select
        d1_0.delivery_id,
        d1_0.city,
        d1_0.street,
        d1_0.zipcode,
        d1_0.status 
    from
        delivery d1_0 
    where
        d1_0.delivery_id=?
2023-03-23T19:03:54.397+09:00 DEBUG 56506 --- [nio-8080-exec-1] org.hibernate.SQL                        : 
    select
        o1_0.order_id,
        o1_0.delivery_id,
        o1_0.member_id,
        o1_0.order_date,
        o1_0.status 
    from
        orders o1_0 
    where
        o1_0.delivery_id=?

java spring spring-boot jpa

Answer 5

4

gorisanson

아래 링크에 같은 맥락의 질문이 있습니다. 해당 질문에 달린 답변을 보시면 도움이 될 것 같습니다!

https://www.inflearn.com/questions/747488

 

2

dyl0115

2024년에도 글쓴이 분과 동일하게,

"(4) delivery id 조건절로 order 찾는 쿼리" 때문에

총 7번 쿼리가 나가는데, 저만 그런걸까요?

1

ewgregerg c

2024 년에도 총 7번 쿼리날아가네요. 디버깅 해보니

address = order.getDelivery().getAddress();  // LAZY 초기화

이 부분에서

select
        d1_0.delivery_id,
        d1_0.city,
        d1_0.street,
        d1_0.zipcode,
        d1_0.status 
    from
        delivery d1_0 
    where
        d1_0.delivery_id=?

2024-10-22T14:07:35.134+09:00 DEBUG 6578 --- [nio-8080-exec-1] org.hibernate.SQL                        : 
    select
        o1_0.order_id,
        o1_0.delivery_id,
        o1_0.member_id,
        o1_0.order_date,
        o1_0.status 
    from
        orders o1_0 
    where
        o1_0.delivery_id=?

이렇게 두번 쿼리가 실행되네요..

 

List<Order> all = orderRepository.findAllByString(new OrderSearch());

여기서 쿼리 한번

 

name = order.getMember().getName();  // LAZY 초기화

여기서 쿼리 한번

 

address = order.getDelivery().getAddress();  // LAZY 초기화

여기서 쿼리 두번

 

주문 리스트가 2개 있으므로

1 + 2 * (1 + 2) = 7 번 실행됩니다.

궁금한 점은

select
        o1_0.order_id,
        o1_0.delivery_id,
        o1_0.member_id,
        o1_0.order_date,
        o1_0.status 
    from
        orders o1_0 
    where
        o1_0.delivery_id=?

이 쿼리는 왜 추가적으로 실행되는지 모르겠습니다.

1

codetrain999

안녕하세요. 감자님, 공식 서포터즈 codesweaver입니다.

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

2

lilacp

동일한 상황이 ordersV2() -> api/v2/orders 를 호출했을 때도 발생합니다.

order -> member -> delivery -> orderitems -> item -> (2) -> item -> ( 1 ) ->member -> delivery -> orderitems ->item -> (2)->item 순서로 sql이 출력되어야하는데,

order -> member -> delivery -> order -> orderitems -> item -> (2) -> item -> ( 1 ) ->member -> delivery -> order -> orderitems ->item -> (2)->item 

굵게 칠해진 order가 'delivery id 조건절로 order 찾는 쿼리' 에 의해 수행됩니다.

강의자료에 배포된 코드와 차이점은 없어보이는데, 무슨 차이점이 있는 건가요?

 

1

codetrain999

이규태 님이 남겨주신 링크의 내용처럼

하이버네이트 버전이 6으로 오르며 발생하는 문제인 것 같습니다.

일단 다음 강의로 진행해주시기 바랍니다 :)

0

progammer

홀리몰리 저도 이 문제 있어서 대체 뭐가 문제였을까 살피다가 질문 올리려고 했는데 이미 있었군요! Delivery에서 order을 로딩할 필요가 없는 걸로 보아 버그이지 않나 싶네요.

강의 관련 외 질문입니다.

0

62

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

0

85

1

BeanCreationException

0

86

3

Update 후 UpdateMemberResponse 매핑할 때

0

46

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

96

2

페이징 + 검색조건 관련해서 질문드립니다.

0

70

1

Query Dsl Q파일 질문입니다.

0

81

1

루트 쿼리라는것은

0

58

1

메서드를 분리하는 기준

0

61

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

108

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

83

2

fetch join과 영속화와 OSIV의 관계

0

83

2

Distinct 사용 전 결과에 대한 의문

0

112

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

55

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

77

2

dto 필드 속 엔티티 여부

0

58

1

뷰템플릿 사용 시

0

76

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

85

1

DTO 대신 Form 사용은 안되나요?

0

133

1

OSIV ON 상태일 때

0

94

1

fetch join VS fetch join 페이징 궁금증

0

178

2

양방향 연관관계 알아보는 법?

0

102

1

16강 17강 간단 정리 이게 맞을까요 ?

0

161

2