inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Trong thực tế! Spring Boot và JPA Usage 2 - Phát triển API và tối ưu hóa hiệu suất

Tra cứu đơn hàng V2: Chuyển đổi thực thể thành DTO

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

403

mino

8 câu hỏi đã được viết

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 을 가져오며 영속성 컨텍스트가 닫히는 거라고 생각하고 있습니다. 

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

 

java spring spring-boot JPA

Câu trả lời 2

3

David

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

.

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

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

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

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

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

OSIV

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

 

0

mino

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

강의 관련 외 질문입니다.

0

65

2

SpringBoot4 + Hibernate7 모듈 등록 방법 공유

0

86

1

BeanCreationException

0

86

3

Update 후 UpdateMemberResponse 매핑할 때

0

46

1

트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?

0

98

2

페이징 + 검색조건 관련해서 질문드립니다.

0

70

1

Query Dsl Q파일 질문입니다.

0

81

1

루트 쿼리라는것은

0

58

1

메서드를 분리하는 기준

0

62

1

findAllWithMemberDelivery 메서드 질문드립니다.

0

108

3

연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략

0

83

2

fetch join과 영속화와 OSIV의 관계

0

84

2

Distinct 사용 전 결과에 대한 의문

0

113

2

레포지토리 계층에서의 트랜잭션에 대한 의문

0

56

1

영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.

0

78

2

dto 필드 속 엔티티 여부

0

58

1

뷰템플릿 사용 시

0

76

2

Result 클래스 관련 질문

0

56

1

@PostConstruct 프록시 관련 질문드립니다

0

85

1

DTO 대신 Form 사용은 안되나요?

0

133

1

OSIV ON 상태일 때

0

95

1

fetch join VS fetch join 페이징 궁금증

0

179

2

양방향 연관관계 알아보는 법?

0

104

1

16강 17강 간단 정리 이게 맞을까요 ?

0

165

2