강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của misely2007623
misely2007623

câu hỏi đã được viết

Trong thực tế! Spring Boot và JPA Usage 2 - Phát triển API và tối ưu hóa hiệu suất

Tra cứu đơn hàng đơn giản V2: Chuyển đổi thực thể thành DTO

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

Viết

·

1.3K

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=?
javaspringspring-bootjpa

Câu trả lời 5

4

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

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

 

2

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

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

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

1

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

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

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

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

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

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

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

감사합니다.

동일한 상황이 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 찾는 쿼리' 에 의해 수행됩니다.

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

 

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

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

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

0

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

Hình ảnh hồ sơ của misely2007623
misely2007623

câu hỏi đã được viết

Đặt câu hỏi