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

변현진님의 프로필 이미지

작성한 질문수

스프링 배치

DB - Cursor & Paging 이해

chunk 처리 기반에서 cursor 방식과 메모리 사용

작성

·

211

1

안녕하세요. 비전공자로 배치 프로그램에 관심이 많아서 해당 강의를 듣다가 커서 방식과 페이징 방식을 스프링 배치에서 사용할 때 고려사항과 관련하여 질문이 있습니다.

커서가 페이징 방법에 비해 데이터 일관성이 보장이 쉽고 속도도 더 빠른 것으로 알고 있습니다.

그리고 청크 기반 배치 처리 로직으로 구현한다면, 커서 기법을 사용하는 경우에도 페이징 방법처럼 트랜잭션 단위를 청크 크기만큼 나눌 수 있을 텐데요.

(페이징에서 chunk와 paging 단위를 같이 하는 것처럼 커서에서도 chunk와 fetchsize를 같게 해주면 될 것으로 고려합니다.)

그리고 멀티 스레드를 고려한다면,

SynchronizedItemStreamReader로 reader 영역을 감싸서 처리할 수도 있는 걸로 알고 있습니다.

그렇다면, 이러한 상황 속에서 커서와 페이징을 사용함에 고려해야할 트레이프 오프가 커넥션 타임 뿐인 걸까요??

이런 상황에서도 커서가 메모리 할당 방식으로 인해서 메모리 사용량이 커진다는 단점이 있는 건가요??

( 더 정확하게 말하자면 결과를 메모리에 할당한다는 점이 명확히 와닿지 않습니다.

제 나름 추론하자면,

커서가 fetch size나 chunk로 전체 데이터를 분할하여 메모리에 올리고 읽고나서도 모든 결과값이 메모리에 쌓여 한번에 write(ex- db에 저장) 되기 때문에 메모리 사용량이 많아 진다는 것인가여??

반면에, 페이징은 기반 처리는 페이징 단위로 데이터를 읽고 읽은 데이터 크기를 처리 후 메모리에 올리고 write한 후에 다시 정해진 크기 만큼 읽는 방식인건가요??

즉, 이것이 커넥션을 맺고 끊는 것 방식과 관련이 깊은 것인지 궁금합니다.)

이상 cs적인 지식이 부족한 비전공자의 긴 질문을 읽어주셔서 감사합니다.

답변 2

0

정수원님의 프로필 이미지
정수원
지식공유자

사실 스프링 배치에서는 청크 사이즈만큼 트랜잭션이 일어나기 때문에 커서 방식에서 크게 메모리 사용량이 늘어나지는 않습니다

강의에서 설명한 것은 일반적인 커서방식을 의미하는 것으로서 스트리밍 방식으로 계속 데이터를 로드하는 경우 메모리에 쌓이게 되는 경우를 말합니다

그에 반해 페이징은 페이지크기만큼만 로드하기 때문에 메모리 사용량이 덜하다는 의미라 볼 수 있습니다

결론은 커서든 페이징이든 어느 정도의 fetchsize 로 메모리에 데이터를 로드할 것인가에 따라 메모리 사용량이 달라진다고 보시면 됩니다

스프링 배치는 그런 관점에서 청크사이즈만큼 트랜잭션이 이루어지므로 대용량 데이터 처리에 최적화 된 기술을 제공하고 있다고 보시면 됩니다

0

안녕하세요, 인프런 AI 인턴입니다.

변현진님의 질문에 대해 스프링 배치에서 커서 방식과 페이징 방식을 사용할 때의 고려사항에 대해 답변드리겠습니다.

커서 방식과 페이징 방식 모두 대량의 데이터 처리 시 메모리 사용량을 최적화하는 데에 유용합니다. 커서 방식은 데이터베이스와의 연결을 유지하면서 연속적으로 데이터를 읽어오는 방식으로, 큰 데이터 세트를 처리할 때 빠르고 효율적입니다. 그러나 커서를 사용할 때는 데이터베이스 연결이 지속적으로 열려 있어야 하기 때문에, 커넥션 관리에 유의해야 합니다.

반면, 페이징 방식은 데이터를 일정한 크기의 페이지로 나누어서 처리합니다. 이 방식은 각 페이지마다 별도의 데이터베이스 쿼리를 발생시키며, 이를 통해 커넥션을 더 짧은 시간 동안만 사용하게 됩니다. 따라서 커넥션 관리 측면에서는 좀 더 유리할 수 있으나, 페이지를 넘길 때마다 쿼리를 수행해야 하기 때문에 전체적인 처리 속도는 커서 방식보다 느릴 수 있습니다.

커서 기반 처리에서 메모리 사용량이 늘어나는 이유는, 커서가 데이터를 읽어올 때 설정한 fetch size만큼 데이터를 메모리에 적재하기 때문입니다. 이는 큰 데이터 세트를 한 번에 처리하기보다는 일정량을 메모리에 유지하며 순차적으로 처리하는 방식으로 이해할 수 있습니다. 그럼에도 불구하고, 커서 방식에서 메모리 사용량이 과도하게 증가하는 것을 막기 위해 적절한 fetch size 설정이 중요합니다.

페이지 방식의 경우, 각 페이지마다 데이터를 읽고 쓰는 작업이 이루어지므로, 한 번에 처리되는 데이터 양이 커서 방식보다 적으며, 결과적으로 적은 양의 데이터가 메모리를 사용하게 됩니다. 이렇게 데이터를 처리하는 방식은 배치 작업의 효율성과 메모리 사용에 균형을 맞춰주는 역할을 합니다.

결론적으로, 커서와 페이징 방식 모두 사용 시에는 데이터 일관성, 처리 속도, 메모리 사용량, 그리고 커넥션 관리 등 다양한 측면의 트레이드 오프를 고려해야 합니다. 스프링 배치에서는 이러한 특징들을 이해하고 시나리오에 맞는 최적의 방식을 선택하는 것이 중요합니다.

이 내용이 변현진님의 궁금증을 해결하는 데 도움이 되었기를 바랍니다.