인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

스프링 배치

DB - JpaCursorItemReader

jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)

작성

·

44

·

수정됨

0

안녕하세요

커서방식에서 Jdbc는 최초 open 메서드 호출 때 db에 쿼리를 날려 ResultSet 첫번 째 row를 가져온 상태에서 read() 를 반복해서 db resultset 커서를 하나씩 이동 시켜 스트리밍 방식으로 가져오는 걸로 알고 있습니다.

jpa도 마찬가지로 최초 open 메서드에 쿼리를 날려 작업 결과를 가져오는데 이 때 ResultStream을 반환하고 read에서 실제 db와 상호작용하지 않고 list의 반복자 패턴으로 하나씩 가져온다고 이해했는데요. read때 db와 상호작용을 하지 않는다고 하면 처음 ResultStream에 결과를 다 가져온다는 소리인데 이렇게 되면 메모리 효율이 떨어지지 않나요?

답변 2

1

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

사실 이 문제는 db 든 메모리든 큰 틀에서 보면 공통적인 문제들입니다.

성능을 좋게 하기 위해 메모리를 최대한 활용한다는 전략아래 디비로부터 데이터를 한번에 많은 양을 메모리에 가져올 수 있지만 문제는 가져오는 데 시간이 많이 걸린다는 딜레마가 생긴다는 거죠

일단 메모리로 가져 온다면 그 다음 부터는 당연히 엄청 성능이 좋겠지만 그 과정이 힘들다는 겁니다

그래서 이런 부분들은 언제든지 정답이 있다라기 보다는 시스템사양과 환경들을 기준으로 얼마만큼의 데이터를 네트워크를 경유해서 메모리로 가져올 것인가에 대해 많은 테스트와 검증을 거쳐서 결정해야 하는 문제들입니다.

jpa 에서 한번에 데이터를 가져오더라도 데이터 양에 따라 성능이 좋아질 수도 그렇지 않을 수도 있습니다.

이건 해당 기술이 허용하는 범위 내에서 가장 최적의 데이터 처리양을 확인 및 결정하고 테스트와 검증을 거쳐 결정해야 하는 부분이라 생각합니다.

0

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

hoonseung님께서 질문하신 내용은 JdbcCursorItemReader 및 JpaCursorItemReader의 실행 방식과 각 방식의 메모리 효율성에 관한 것입니다.

JdbcCursorItemReader의 경우, 데이터베이스 쿼리가 처음 실행되면 ResultSet이 생성되며, 데이터를 스트리밍 방식으로 읽어 들입니다. 즉, 커서를 하나씩 전진시키면서 필요한 데이터만 즉시 읽어오는 방식입니다. 이때 메모리 사용을 최적화하는 중요한 포인트는 fetchSize라는 속성으로, 이 값을 적절하게 설정하면 한 번에 가져오는 데이터 크기를 조정하여 메모리 사용을 개선할 수 있습니다.

반면, JpaCursorItemReader의 경우, 쿼리 실행 시점에서 모든 데이터를 메모리에 로드하여 List나 ResultStream으로 반환한 후, 메모리에 저장된 데이터를 반복자(iterator) 패턴을 통해 하나씩 읽어옵니다. 이 방식은 한 번에 모든 데이터를 메모리에 올리기 때문에 대량의 데이터 처리 시 메모리 효율성이 떨어질 수 있습니다. 즉, 데이터베이스와의 상호작용이 적다는 장점이 있지만, 메모리를 많이 사용할 수 있다는 점을 고려해야 합니다.

관련하여 참고할 수 있는 질문과 답변은 아래 링크를 확인해 주시기 바랍니다:
- “JdbcCursorItemReader 쿼리 실행 시점과 ResultSet 동작 방식이 궁금합니다.”
- “커서 기반 질문입니다.”
- “Cursor 방식 ItemReader 관련 질문입니다.”

Jdbc와 Jpa의 커서 방식은 각각 장단점이 있으므로, 메모리 사용량과 성능 요구사항에 맞춰 적절히 사용해야 합니다. 만약 대량의 데이터를 처리하고 메모리 효율성이 중요한 경우라면 JdbcCursorItemReader를 사용하고, 특정 상황에서 성능을 최적화하고 싶다면 fetchSize 조절을 고려해보시길 권장합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

질문하기