Skip to content

OOM 문제 발생 및 해결 과정

Jiwon Choi edited this page Aug 29, 2023 · 1 revision

문제 발생

시나리오 테스트 ngrinder 돌리던 중 OOM 문제가 발생했습니다.

스크린샷 2023-08-29 오후 2 10 48

원인을 분석하기 위해 시나리오를 분석하다가 충격적인 결과를 발견했습니다.

스크린샷 2023-08-29 오후 2 21 02

한 번 특정 유저의 주문 내역을 호출할 때마다 약 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 이슈를 해결할 수 있었습니다~