Inflearn brand logo image

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

이동연님의 프로필 이미지
이동연

작성한 질문수

죽음의 Spring Batch: 새벽 3시의 처절한 공포는 이제 끝이다.

3장. 작전1: 관계형 데이터베이스 읽고 쓰기 (테이블의 심장에 처형장을 세우다 ☠️)

JpaCursorItemReader 질문

작성

·

75

1

이 기본 구현에서 호출하는 getResultList() 는 전체 데이터를 메모리에 한 번에 로딩하므로 실제 스트리밍이 아니며 따라서 타 JPA 구현체 사용 시 주의가 필요하다.

라고 하셨는데 JpaCursorItemReader를 이용하면 모든 데이터를 메모리로 가져오기 때문에 OutOfMemoryError가 날 수 있나요??

추가로 실무에서는 쿼리가 복잡할텐데 JPA 보단 JDBC를 사용하는 편인가요???

답변 2

1

KILL-9님의 프로필 이미지
KILL-9
지식공유자

🚨🚨🚨 [CRITICAL SYSTEM ALERT] 🚨🚨🚨
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

[1997-08-29 03:35:42 UTC] KILL-9 JPA ITEMREADER ANALYSIS
[ALERT] JpaCursorItemReader 오해 감지!

🔍 [OOM 가능성 분석]
JpaCursorItemReader로 OOM이 날 수 있냐고? 

[강의 내용 재정리]
강의에서 하고자 하는 말은 **하이버네이트가 아닌 JPA 구현체를 
사용할 때 주의해야 한다**는 의미이지, JPA를 사용하지 말라는 
의미가 아니다. 
(사실 나도 하이버네이트 아닌 구현체는 사용해본적이없다.)

**실무에서도 JpaCursorItemReader를 자주 사용한다. **

전체 데이터를 모두 읽을 경우 OOM이 날 수 있냐고?
**환경과 전체 데이터 개수, 사이즈에 따라 달라지니 단정지을 수 없다. 그러나 당연히 가능하다.**
물론 생각보다 OOM이 쉽게 발생하진 않는다.


⚠️ [실무 권장사항]
다만, 뒤에 나올 **JpaPagingItemReader는 읽어들일 데이터 양이 
적은 게 아니라면 굳이 권장하지 않는다. 굳이 사용하겠다면 전체 데이터개수의 통계를 바탕으로 배치사이즈를 최대한 크게 지정해라 ** 


[CONCLUSION]
- JpaCursorItemReader: 실무에서 자주 사용 ✓
- 하이버네이트 외 JPA 구현체: 주의 필요 ⚠️
- JpaPagingItemReader: 대용량 데이터엔 비추천 ✗

복잡한 쿼리든 뭐든 JPA로도 충분히 처리 가능하다. 💀

[END OF PROTOCOL]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이렇게 오해를 바로잡고 실무 조언까지! 🚨💀

0

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

이동연님, JpaCursorItemReader 사용 시 메모리 로드와 관련된 질문을 주셨네요. JpaCursorItemReader는 Cursor를 사용하여 결과를 Fetch하는 것처럼 보이지만, 내부적으로 JPA의 EntityManagergetResultList()를 통해 데이터를 메모리에 로드하기 때문에 메모리 사용량이 커질 수 있습니다. 특히 데이터 양이 클 경우 OutOfMemoryError가 발생할 수 있습니다.

메모리 이슈와 OutOfMemoryError 위험

  • 전체 데이터 로드: JpaCursorItemReader는 대량의 데이터를 처리하는 경우, 메모리에 모든 데이터를 로드하기 때문에 메모리 부족 문제를 일으킬 수 있습니다.
  • 해결 방법: 이를 방지하기 위해서는 페이징을 지원하는 PagingItemReader 같은 접근이 유리합니다. 이 방식은 데이터를 작은 단위로 나누어 가져오므로 메모리 사용량을 줄일 수 있습니다.

JPA vs JDBC

  • JPA의 장점: 객체-관계 매핑(O/RM)을 통해 개발 생산성을 높이고 데이터베이스 독립성을 유지할 수 있습니다.
  • JDBC의 유리한 점: 복잡한 쿼리나 성능 최적화가 필요한 경우, 특히 대량의 데이터를 다루는 경우에는 JPA 대신 JDBC를 사용하는 것이 일반적입니다. JDBC는 SQL을 직접 실행하므로 성능을 세밀하게 제어할 수 있습니다.

유사한 주제가 논의된 게시글을 참고하시면 도움이 될 수 있습니다:

위 답변이 도움이 되셨기를 바라며, 추가적인 궁금증이 생긴다면 언제든지 질문 부탁드립니다. 저도 계속해서 도움을 드리겠습니다.

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

이동연님의 프로필 이미지
이동연

작성한 질문수

질문하기