작성
·
75
1
이 기본 구현에서 호출하는 getResultList() 는 전체 데이터를 메모리에 한 번에 로딩하므로 실제 스트리밍이 아니며 따라서 타 JPA 구현체 사용 시 주의가 필요하다.
라고 하셨는데 JpaCursorItemReader를 이용하면 모든 데이터를 메모리로 가져오기 때문에 OutOfMemoryError가 날 수 있나요??
추가로 실무에서는 쿼리가 복잡할텐데 JPA 보단 JDBC를 사용하는 편인가요???
답변 2
1
🚨🚨🚨 [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의 EntityManager
의 getResultList()
를 통해 데이터를 메모리에 로드하기 때문에 메모리 사용량이 커질 수 있습니다. 특히 데이터 양이 클 경우 OutOfMemoryError가 발생할 수 있습니다.
PagingItemReader
같은 접근이 유리합니다. 이 방식은 데이터를 작은 단위로 나누어 가져오므로 메모리 사용량을 줄일 수 있습니다.유사한 주제가 논의된 게시글을 참고하시면 도움이 될 수 있습니다:
위 답변이 도움이 되셨기를 바라며, 추가적인 궁금증이 생긴다면 언제든지 질문 부탁드립니다. 저도 계속해서 도움을 드리겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.