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

이남규님의 프로필 이미지

작성한 질문수

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

주문 조회 V3.1: 엔티티를 DTO로 변환 - 페이징과 한계 돌파

페이징 시도 시 Out of Memory의 원인

21.07.10 15:50 작성

·

400

1

안녕하세요, 김영한 강사님.
페치 조인 시 페이징을 시도하면 메모리에서 프로세싱이 이루어지기 때문에 Out of Memory가 일어날 수 있다고 말씀주셨는데요.

이 이유가 정렬 시 추가적인 메모리 공간을 사용하기 때문인가요?

대량의 데이터를 페이징 없이 쿼리하면 메모리를 거치지 않고 결과값을 내려주나요?

페이징 없이 쿼리를 하더라도 메모리를 통한다면 수 많은 데이터를 쿼리하더라도 Out of Memory가 일어날수 있는게 아닌가 싶어서요.

혹시 제가 디비 쿼리 원리를 잘못 이해하고 있는걸까요.

감사합니다.

답변 1

5

김영한님의 프로필 이미지
김영한
지식공유자

2021. 07. 10. 21:10

안녕하세요. 이남규님

여기에서는 말씀드린 문맥이 중요합니다.

일반적인 페치 조인의 페이징은 괜찮은데,

1:N을 패치조인하게 되면, 1을 기준으로 페이징이 불가능해집니다.

왜냐하면 데이터베이스 입장에서 1과 N을 조인하면 데이터가 N만큼 늘어나기 때문에 1을 기준으로 페이징이 불가능합니다.

(이 부분은 직접 쿼리를 만들어서 돌려보시면 이해가 되실거에요.)

결국 DB에서는 불가능하기 때문에, 하이버네이트는 이것을 애플리케이션 메모리에 올려서 강제로 가능하게 도와줍니다.

그런데 이것이 가능하려면 데이터베이스의 1:N 조인 결과를 모두 메모리에 가져온 다음 1을 기준으로 페이징을 메모리에서 다시 수행해야 합니다. 조인의 결과가 100백만건이라면 애플리케이션 메모리 부족으로 OOM이 발생할 수 있습니다.

따라서 1:N 페치 조인을 한 상황에서 1을 기준으로 페이징을 하는 것은 매우 위험합니다.

감사합니다.