DTO 조회 방식은 엔티티가 아니기 때문에 지연로딩이나 페치 조인을 사용할 수 없다.
DTO 조회 방식은 단순히 DB에서 데이터를 가져와서 DTO의 필드에 값을 채워주는 방식이다.
이때, 엔티티에는 값을 따로 할당하지 않기에 영속성 컨텍스트에도 DB에서 조회한 데이터가 들어가지 않는다.
엔티티 조회:
페치조인을 하지 않고 일반 조인을 하면 프록시 객체가 엔티티에 들어오는데
이를 실 객체로 만들기 위한 객체 탐색시 추가 쿼리가 나갈 수 있다.
DTO 조회:
DTO의 생성자의 인자 값만 받기에 프록시 객체 탐색 자체를 하지 않는다. 애초에 엔티티를 조회하지 않기 때문이다.
그럼 DTO로 바로 조회하는 방법이 훨씬 좋은 것 아닌가? 아니다. 엔티티를 조회하면 fetch join을 사용할 수 있기 때문에 컬렉션을 한 방에 조회가능하다. (하나의 컬렉션만!)
참조
https://inflearn.com/questions/505147
위와 같이 쿼리문에서 join한 Entity의 속성으로 조건을 걸거나 인자로 쓰거나 등은
프록시랑 애초에 상관이 없는 일이다. DB에서 찾아서 걸어주는 것임.
고로 "Member, Delivery는 지연로딩이라 프록시 객체의 속성을 사용했기에 실객체로 변환된다" 이런 말이 성립이 안 되는 것.
'스프링' 카테고리의 다른 글
Subquery returns more than 1 row (0) | 2023.03.04 |
---|---|
@OneToOne 양방향 LazyLoading 실패 (0) | 2023.02.28 |
EntityNotFoundException: Unable to find com.aloharoombackend.model.HomeImage with id 1 (0) | 2023.02.28 |
Spring Boot 파일 업로드 용량 제한 설정 (0) | 2023.02.23 |
스프링 부트 - 오류 페이지 (0) | 2022.08.20 |