BatchSIze 동작과 관련해서 궁금한 점이 있습니다!
345
작성한 질문수 53
안녕하세요. 항상 좋은 강의, 답변 주셔서 감사합니다
BatchSize 동작과 관련해서 궁금한 부분이 있어서 글을 적습니다.
@BatchSize(size = 100)
@GetMapping("/api/v3.1/orders")
public List<OrderDto> ordersV3_page(
@RequestParam(name = "offset", defaultValue = "0") int offset,
@RequestParam(name = "limit", defaultValue = "100") int limit
){
List<Order> orders = orderRepository.findAllWithMemberDelivery(offset, limit);
return orders.stream()
.map(order -> new OrderDto(order))
.collect(Collectors.toList());
}
위 코드에서 BatchSize로 OrderItems와 Item을 불러올 때, where절에 in으로 PK가 나가는 것으로 알고 있습니다.
예를 들어
1.Order → OrderItems 지연 로딩 시, Order PK 값들이 In 절로 들어갑니다.
2. OrderItems → Item 지연 로딩 시, OrderItems PK 값들이 In 절로 들어갑니다.
궁금한 부분은 다음과 같습니다.
1. OrderItems → Item으로 갈 때, OrderItems의 PK를 넘겨서 값을 가져오는데, 이 때 쿼리를 내보내는 시점에 JPA가 어떤 PK를 넘기는 것인지 궁금합니다.
위의 코드만 본다면, 영속성 컨텍스트에서 관리하고 있는 모든 PK를 보내는 것이 아닌, stream에서 강제 로딩을 하는 PK 값들만 JPA가 보내는 것으로 이해할 수 있을 것 같습니다.
그런데 Stream은 순차적으로 접근하니, 순차적으로 접근하면 접근할 때 마다 쿼리가 나가야하는데 이를 BatchSize를 100으로 설정했기 때문에 Stream으로 활성화(?)된 PK 값들이 한방에 나간다고 이해하고 있습니다
이 때, BatchSize를 100으로 설정한다면 Stream을 돌 때 마다 DB에서 불러와야할 PK값이 영속성 컨텍스트 내의 쓰기지연 저장소에 차곡차곡 쌓여있는 것으로 이해를 하면 될까요?
그래서 Stream을 다 돌고 나면 쌓인 PK 값들에 대해 Select + where + in 절로 한번에 join 쿼리를 보내주는 것으로 이해를 하면 될까요?
만약 Stream을 다 돌렸는데 영속성 컨텍스트 내의 쓰기 지연 저장소에 필요한 PK가 200개가 쌓였다고 하면 100개를 먼저 Flush 해주고, 다시 한번 100개를 Flush 해줘서 값을 불러온다고 이해를 하면 될까요?
BatchSize가 실제로 어떻게 동작하는지는 잘 나와있지 않아, 궁금하여 글을 적게 되었습니다.
항상 좋은 답변 주셔서 너무 감사합니다.
좋은 하루, 주말 되세요!
답변 1
@JsonIgnore 이후 Internal Server Error가 발생하지 않습니다.
0
32
2
강의 관련 외 질문입니다.
0
91
2
SpringBoot4 + Hibernate7 모듈 등록 방법 공유
1
113
1
BeanCreationException
0
104
3
Update 후 UpdateMemberResponse 매핑할 때
0
66
1
트랜잭션을 사용 안 할 때 커넥션은 언제 가져오나요?
0
109
2
페이징 + 검색조건 관련해서 질문드립니다.
0
77
1
Query Dsl Q파일 질문입니다.
0
92
1
루트 쿼리라는것은
0
68
1
메서드를 분리하는 기준
0
76
1
findAllWithMemberDelivery 메서드 질문드립니다.
0
123
3
연관관계 매핑을 안 쓸 경우, 사용해야 하는 전략
0
97
2
fetch join과 영속화와 OSIV의 관계
0
101
2
Distinct 사용 전 결과에 대한 의문
0
124
2
레포지토리 계층에서의 트랜잭션에 대한 의문
0
65
1
영속성 컨텍스트 생명주기의 신기한 부분이 있습니다.
0
82
2
dto 필드 속 엔티티 여부
0
67
1
뷰템플릿 사용 시
0
86
2
Result 클래스 관련 질문
0
59
1
@PostConstruct 프록시 관련 질문드립니다
0
91
1
DTO 대신 Form 사용은 안되나요?
0
142
1
OSIV ON 상태일 때
0
102
1
fetch join VS fetch join 페이징 궁금증
0
192
2
양방향 연관관계 알아보는 법?
0
113
1





