인프런 커뮤니티 질문&답변

edutech-labs님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파

orderItem 에 조건을 주려면 어떻게해야하나요?

해결된 질문

20.01.16 23:10 작성

·

222

6

영한님 안녕하세요~

주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파

강습을 보고 질문드립니다.

강좌처럼 in 절을 날리면서 데이터를 한번에 가져올때에는 지연로딩을 통해 orderItem 컬렉션을 가져오는데

막상 orderitem에 조건을 주려면 어떻게해야하나요?

애플리케이션(java)에서 작업해야하나요?

답변 1

7

김영한님의 프로필 이미지
김영한
지식공유자

2020. 01. 17. 00:25

안녕하세요. deutech-labs님^^ 좋은 질문입니다.

우선 엔티티는 연관된 엔티티를 조회하면 항상 데이터베이스와 데이터 수가 일치해야 합니다. 이것을 더 정확히 표현하면 메모리의 엔티티와 데이터베이스간에 불일치가 발생하면 안됩니다.

order에서 지연로딩을 통해서 orderItem을 가져올 때도 마찬가지 입니다. orderItem 조회 쿼리에서 추가조건이 들어가면 orderItem의 일부 row가 필터링 됩니다. 결국 order->orderItem 연관관계 사이에 불일치가 발생합니다.

예를 들어서 데이터베이스는 order A와 연관된 orderItem은 5개인데, 메모리에 올렸더니 order A와 연관된 orderItem은 3개라면 불일치 문제가 발생하는 것이지요.

엔티티의 연관관계는 이런 불일치가 발생하면 안됩니다.

그러면 문제를 어떻게 해결하면 될까요?

order를 조회한 다음에 orderItem에 조건을 준 원하는 쿼리를 직접 작성해서 바로 DTO로 변환하면 됩니다.

(결국 수동으로 해야합니다.)

관련해서 성능 최적화 까지 고려한 내용이 V4, V5, V6에 쭉 이어져서 나옵니다^^

쭉 보시고 또 궁금한 점은 말씀주세요.