-
Notifications
You must be signed in to change notification settings - Fork 3
OOM 문제 발생 및 해결 과정
Jiwon Choi edited this page Aug 29, 2023
·
1 revision
시나리오 테스트 ngrinder 돌리던 중 OOM 문제가 발생했습니다.
원인을 분석하기 위해 시나리오를 분석하다가 충격적인 결과를 발견했습니다.
한 번 특정 유저의 주문 내역을 호출할 때마다 약 69000개의 데이터를 조회하는 문제 발생
→ 이 부분에서 OOM 문제가 터진다고 판단하였고, 이를 위해 주문 목록에 페이징을 도입했습니다.
이 부분도 상품 조회와 마찬가지로 커서 방식으로 일부 데이터만 가져오는 형식으로 문제를 해결했습니다.
주문 목록을 최신순 부터 가져오는 것을 목표로 id를 역순으로 정렬하였습니다.
@Override
public List<Order> findOrdersByMemberId(Long memberId, Long lastOrderId, int pageSize) {
return jpaQueryFactory.selectFrom(order)
.where(order.memberId.eq(memberId),
cursor(lastOrderId),
order.orderStatus.in(OrderStatus.PAYED, OrderStatus.CANCELED))
.orderBy(order.id.desc())
.limit(pageSize)
.fetch();
}
private BooleanExpression cursor(Long lastOrderId) {
if (lastOrderId == null) {
return null;
}
return order.id.lt(lastOrderId);
}
이런 방식으로 페이징을 적용하였고, 기본 페이지 사이즈는 20으로 두고 프론트에서 적절한 요청을 보내면 유동적으로 페이지 사이즈를 조절할 수 있게 설계했습니다.
그리고 지금 커서는 id 기반이기 때문에 특정 인덱스를 굳이 걸지 않아도 된다고 판단하여 걸지 않았습니다.
그 결과 OOM 이슈를 해결할 수 있었습니다~