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

창신동 장첸님의 프로필 이미지

작성한 질문수

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

주문 조회 V1: 엔티티 직접 노출

v1: 엔티티직접노출 방식에 달린 주석 질문

21.09.22 17:08 작성

·

301

0

@GetMapping("/api/v1/orders")
public List<Order> ordersV1() {
List<Order> all = orderRepository.findAll();
for (Order order : all) {
order.getMember().getName(); //Lazy 강제 초기화
order.getDelivery().getAddress(); //Lazy 강제 초기환

List<OrderItem> orderItems = order.getOrderItems();
orderItems.stream().forEach(o -> o.getItem().getName()); //Lazy 강제 초기화
}
return all;
}

첨부된 소스코드를 보면 "트랜잭션 안에서 지연 로딩 필요"라고 v1 메소드에 설명이 있습니다.

orderRepository.findAll( ); 의 호출이후 트랜잭션은 종료됐을 텐데 그 이후에 강제 Lazy로딩을 하는 것이 위 주석의 설명과 혼동이 됩니다.

 

기본편에서 진행을 할 때는 항상 tx.commit( ) 이전에 Lazy로딩을 했기 때문에 트랜잭션 안에서 지연로딩을 한다는 의미를 당연하게 받아드렸지만 

웹MVC를 결합하면서 Controller쪽에서 findAll() 호출 후 진행되는 상황은 트랜잭션이 종료된 후이기 때문입니다.

 

답변부탁드립니다. 감사합니다.

답변 1

0

창신동 장첸님의 프로필 이미지

2021. 09. 22. 17:20

다음 강의 OSIV에서 해결됐습니다~!

 

[정리]

프레젠테이션 계층에도 계속 영속성 컨택스트가 남아있어 소유하고 있는 conn객체를 통해 조회(Lazy로딩)는 가능하나

서비스계층에서 트랜잭션이 종료됐기 때문에 프레젠테이션 계층의 엔티티 수정은 불가능하다

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

2021. 09. 22. 19:14

스스로 잘 해결하셨습니다^^