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

mino님의 프로필 이미지

작성한 질문수

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

주문 조회 V2: 엔티티를 DTO로 변환

영속성 컨텍스트 유지관련 질의

작성

·

323

0

15분 37초에 나온,

주문자가 모두 같은 책을 주문했을 경우엔 영속성 컨텍스트에 값이 있으니까, 쿼리가 하나만 나가도 된다, 는 말과 관련해서 영속성 컨텍스트가 언제 사라지고 다시 생성되는지 헷갈려서 질문드립니다!

요청마다 영속성 컨텍스트가 열리고 닫힌다, 로만 이해하고 있다보니 헷갈리는 듯합니다.

코드는 다음과 같습니다.

 

@RestController
@RequiredArgsConstructor
public class OrderApiController {

    private final OrderRepository orderRepository;

   @GetMapping("/api/v2/orders")
      public List<OrderDto> ordersV2() {
          List<Order> orders = orderRepository.findAllByString(new OrderSearch());
          List<OrderDto> result = orders.stream()
                  .map(o -> new OrderDto(o))
                  .collect(Collectors.toList());

          return result;
      }

    @Getter
    static class OrderDto {

        private Long orderId;
        private String name;
        private LocalDateTime orderDate;
        private OrderStatus orderStatus;
        private Address address;
        private List<OrderItemDto> orderItems;

        public OrderDto(Order order) {
            orderId = order.getId();
            name = order.getMember().getName();
            orderDate = order.getOrderDate();
            orderStatus = order.getStatus();
            address = order.getDelivery().getAddress();
            orderItems = order.getOrderItems().stream().map(orderItem -> new OrderItemDto(orderItem)).collect(Collectors.toList());
        }
    }

    @Getter
    static class OrderItemDto {

        private String itemName;
        private int orderPrice;
        private int count;

        public OrderItemDto(OrderItem orderItem) {
            itemName = orderItem.getItem().getName();
            orderPrice = orderItem.getOrderPrice();
            count = orderItem.getCount();
        }
    }
}

 

api/v2/orders 로 요청이 들어오면

우선, orderRepository.findAllByString 메소드가 실행되면서 영속성 컨텍스트가 열리고, 메소드가 종료되며 닫히고

orderDto 를 생성하는 과정에서 Member를 db에서 가져오며 영속성 컨텍스트가 열렸다가 닫히고 Delivery 를 가져오며 다시 열리고 닫히고 OrderItemDto를 생성하며 item 을 가져오며 영속성 컨텍스트가 닫히는 거라고 생각하고 있습니다. 

정확히 어디에서 영속성 컨텍스트가 열리고 닫히는지 알 수 있을까요??

 

답변 2

3

안녕하세요. minhkim님, 공식 서포터즈 David입니다.

.

영속성 컨텍스트는 트랜잭션이 시작될 때 생성되고 트랜잭션이 끝나면  닫힙니다.

그러나 트랜잭션이 끝난 후에도 controller layer에서 조회가 필요한 경우가 있습니다.

이를 위해 스프링에서는 open session in view라는 옵션으로 트랜잭션이 끝나도 응답이 완료되기 직전까지 영속성 컨텍스트를 유지하도록 돕습니다. 조회만 가능하며 변경은 불가능합니다.

그리고 이 옵션을 기본적으로 사용하게 설정되어있습니다. 만약 이 옵션을 끈다면 영속성 컨텍스트는 트랜잭션의 종료 후 닫힙니다.

아래 글도 함께 읽어주세요:)

OSIV

* https://dodeon.gitbook.io/study/kimyounghan-spring-boot-and-jpa-optimization/04-osiv
.
감사합니다.

 

0

mino님의 프로필 이미지
mino
질문자

좋은 사이트까지 알려주셔서 감사합니다 :)

mino님의 프로필 이미지

작성한 질문수

질문하기