본문 바로가기

Java, Spring/스프링부트와 JPA 활용 2

3-2. 간단주문조회V2 : 엔티티를 DTO로 변환

이렇게 List로 반환하면 안된다. -> Result로 한번 감싸야함.

이렇게 List로 반환하면 안된다. -> Result로 한번 감싸야함.

이렇게 List로 반환하면 안된다. -> Result로 한번 감싸야함.

읽으면서 무조건 다 이해 (생성자 만들어서 한번에 DTO로 바꿈)

 

 

이렇게 List로 반환하면 안된다. -> Result로 한번 감싸야함.

이렇게 List로 반환하면 안된다. -> Result로 한번 감싸야함.

이렇게 List로 반환하면 안된다. -> Result로 한번 감싸야함.

이렇게 List로 반환하면 안된다. -> Result로 한번 감싸야함.

 

 

극한으로 줄인 버전. 이것도 이해해라. Collectors 를 static import 도 가능하긴함.

 

야무지게 나온다.

But LAZY 문제 있다. -> 테이블을 3개 건드려야함.(Order, Member, Delivery(address))

 

여길보면 2, 5번째 줄에서 Member, Delivery 쿼리가 나감.

 

보면 orders 에서 주문 2개를 조회 하고 Dto로 바꾸는 과정에서 Member, Delivery의 LAZY를 초기화하는 쿼리(DB에서 실제 객체 값을 가져와 프록시 객체를 채워주는 쿼리) 가 두번씩 나감. (총 5번) = 1+N+N = 여기서 N=2 이므로 총 5번

 

Order조회 쿼리 1번 (2개 가져옴, N=2)

Member 조회 쿼리 1번

Delivery 조회 쿼리 1번

<다음 루프>

Member 조회 쿼리 1번

Delivery 조회 쿼리 1번

 

--------- 총 5번

 

-> 원래 EAGER를 권장 했으나 실무에선 결국 쓰면 안되는 구나. (쿼리 예측이 안됨.)

 

-> 만약 Order가 10개 조회됐었다면? -> 헬

 

여기서 최악의 경우 인 이유 : 같은 멤버면 두번째는 영속성컨텍스트에서 가져오므로 (이때 실제 DB쿼리는 1번) but 최악의 경우 따지는게 맞음. (PK로 구분)

 

-> 이거 1번 가져오는 이유모르면 안됨. JPA 기초 다시 공부

Recent Posts
Popular Posts
Recent Comments