OrderResponse에 List<ProductResponse> 를 추가하는게 적절한가 에 대해 의문이 듭니다
555
작성한 질문수 41
안녕하세요 강사님!
질문 드리기에 앞서 항상 좋은 강의 감사드립니다!
제가 강의를 수강하면서 의아한 부분이 있었는데요,
바로 OrderResponse에 List<ProductResponse> 를 추가하신 부분 입니다.
이에 따라 OrderResponse의 of() 메소드 안에서
order.getOrderProducts() 를 호출할 수 밖에 없게 되었는데요,
이때 페치조인을 하지 않는 이상 쿼리가 나가게 될 것 같습니다 (지연로딩)
저는 바로 이 측면이 개인적으로 잘못되었다고 생각하는데요,
JPA는 어떤 쿼리가 어느 타이밍에 나가는지를 파악하기 어려워서, 최대한 이 측면을 명확하게 해주는게 필요하다고 생각합니다.
그래서 저의 경우는 서비스 로직에서 사용되는 repository 메소드 들에서만 쿼리가 나가는 경우로 명확하게 제한을 해주는 편 인데요,
이런식으로 서비스 로직이 아닌(정확히는 그 안에서 사용되는 repository메소드) 다른 곳에서 지연로딩으로 인해 쿼리가 나간다면 - 어느타이밍에 어떤 쿼리가 나가는지를 코드만 보고 명확하게 파악할 수 없게 된다고 생각합니다.
그래서 결론적으로 저는 OrderResponse 안에서 order.getProducts()를 호출하여 List<ProductResponse>를 만드는게 적절하지 않다고 생각하는데요, 이부분에 대해 강사님의 생각을 말씀해주시면 감사하겠습니다!
감사합니다.
답변 2
1
안녕하세요, khd1692님! :)
네 맞습니다. 사실 JPA에 대한 강의가 아니다보니 구체적으로 짚고 넘어가지 않은 부분인데요.
강의에서는 객체 간 직접 참조로 Order, Product, 그리고 중간 테이블인 OrderProduct를 두었는데, 사실 질문주신 내용 등의 이유로 인해 ID 기반의 간접 참조를 더 선호하고 있습니다. ㅎㅎ
간접 참조 방식이었다면 객체 참조를 하지 못하니 자연스레 주문에 해당하는 대상 Product의 ID값을 모아 ProductRepository에서 한번 더 조회를 해서 응답을 구성했을 것입니다. ㅎㅎ
저도 강의를 기획할 때 이 부분까지 고려했으나, 이렇게 되면 테스트 강의가 아니라 JPA 강의가 될 것 같아서...ㅎㅎㅎ 이야기하지 않고 넘어간 부분이었는데 좋은 질문 주셨네요 👍
감사합니다. :)
0
안녕하세요, 인프런 AI 인턴이에요. OrderResponse 클래스에 List
JPA의 경우, FetchType.LAZY 속성을 사용하여 연관된 엔티티를 지연로딩(Lazy Loading)할 수 있습니다. OrderResponse 클래스의 List
하지만, 코드상으로 어떤 타이밍에 어떤 쿼리가 실행되는지 명확하게 확인하기 어려울 수 있습니다. 이를 개선하고자 하시는 것은 옳은 접근입니다. 다만, OrderResponse 클래스에서 order.getProducts()를 호출하는 것보다는 서비스 레이어에서 필요한 데이터들을 명시적으로 가져오는 것이 더 명확하고 예측 가능한 방법일 수 있습니다.
따라서, 서비스 로직에서 사용되는 repository 메소드들에서만 쿼리가 실행되고 나머지 곳에서는 최대한 지연로딩을 피하는 것이 좋은 방법일 수 있습니다. 이를 위해 페치조인(Fetch Join)을 사용하여 연관된 엔티티를 함께 조회하는 방법을 고려해볼 수도 있습니다.
그렇지만 상황에 따라서 지연로딩을 사용하는 것이 더 효율적인 경우도 있을 수 있으니 신중하게 판단하셔야 합니다. 적절한 성능 테스트와 개발 방법에 따라서 최적의 방법을 선택하시면 될 것 같아요.
답변이 도움이 되셨길 바랍니다. 추가로 궁금한 점이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!
private 상수 테스트 관련 질문
0
83
1
void는 어떻게 테스트하나요..? void로 애초에 코딩하면 안되나요??
0
126
2
커버리지는 어떻게 활용하시는지 궁금합니다.
0
161
2
테스트 문서화 질문입니다
0
105
2
단위테스트 질문이 있습니다
0
96
2
컨트롤러는 모킹을 한 이유가 궁금합니다.
0
103
2
ERD 가장자리에 있는 도메인 테스트 질문
0
89
2
DTO 검증 필드에 대한 테스트 코드 작성은 어디까지?
0
135
2
OrderCreateRequest DTO에 대해서 궁금한점
0
102
2
고전파의 테스트 대역 사용 대상, 공유 의존성
0
156
2
계층 관련 질문이 있습니다.
0
139
3
'코틀린'에서는 빌더를 따로 쓰지 않는데, 이 때는 어떻게 test fixture를 만드시는지 궁금합니다
1
124
2
혹시 update 로직은 어떻게 테스트하나요? (@Setter?)
0
135
2
단위테스트와 통합테스트의 경계가 궁금합니다.
0
228
2
Service+Repository 통합테스트 관련 질문입니다.
0
150
2
OrderControllerDocsTest 작성 해봤는데요. 날짜 형식이 이상하게 나와요
0
185
2
test 용 .yml
0
90
2
throws Exception
0
80
2
카페키오스크 클래스 문의 ,,
0
89
2
Rest docs 문서용 테스트코드를 따로 작성해야 되나요?
0
174
2
테스트 코드에서 필요한 생성자
0
138
1
tearDown 순서
0
116
2
@Builder 생성자 private
0
136
2
@DisplayName gradle / intellJ
0
93
2





