[5회차] Spring Batch 스터디: 후기 및 추가 학습 내용

5회차는 Spring Batch의 JdbcPagingItemReader/JdbcBatchItemWriter에 대해 공부했습니다.

 

스터디 진행 전 교안을 공부하며 정리한 내용은 이곳에서 볼 수 있습니다.

 

[5회차] JdbcPagingItemReader로 DB내용을 읽고, JdbcBatchItemWriter로 DB에 쓰기

아래 글은 한국 스프링 사용자 모임(KSUG)에서 진행된 스프링 배치 스터디 내용을 정리한 게시글입니다.DEVOCEAN에 연재 중인 KIDO님의 글을 참고하여 실습한 내용을 기록했습니다.  [SpringBatch 연재

yeseul-dev.tistory.com

 

이번 스터디 시간에는 주로 Paging과 Cursor의 차이점에 대해 이야기 나누는 시간을 가졌습니다.

 

 

간단하게 터미널에 뜨는 job 실행 시간 비교 후 mermaid 툴 사용해서 나타낸 표

 

스터디에 참여하신 김XX님께서 Cursor 방식과 Paging 방식의 성능 차이가 궁금하셔서 비교해보셨는데,

예상과 다르게 Cursor 방식이 더 빠르게 실행되었다고 하셨습니다.

이에 대해 스터디 멤버들끼리 이야기를 나눈 결과, 몇 가지 결론을 내게 되었습니다.

 

Cursor vs Paging

Cursor 방식 vs Paging 방식: 비교 요약

1. 데이터베이스 연결

  • Cursor: 단일 연결을 유지하며 데이터를 스트리밍 방식으로 가져오므로, 한 번의 연결로 전체 데이터를 지속적으로 불러옴
  • Paging: 각 페이지마다 별도의 쿼리를 실행하여 데이터를 가져오므로, 페이지별로 새 연결이 이루어질 수 있음

2. 메모리 사용

  • Cursor: 전체 결과셋을 메모리에 저장하므로, 대용량 데이터 처리 시 메모리 사용량이 높아짐
  • Paging: 페이지 단위로 메모리에 불러와 필요한 만큼만 사용하여 상대적으로 메모리 효율적

3. 스레드 안전성

  • Cursor: 스레드 안전하지 않으며, 멀티스레드 환경에서 비효율적
  • Paging: 스레드 안전하여 멀티스레드 환경에서 적합하게 사용할 수 있음

4. 데이터 정렬

  • Cursor: 특별한 정렬 없이 데이터를 순차적으로 가져옴 (특별한 정렬이 필요 없음)
  • Paging: 일관된 결과를 위해 정렬을 필수 설정해야함

5. 사용 추천 상황

  • Cursor
    • 단일 스레드 환경
    • 메모리가 충분할 때
    • 빠르게 전체 데이터를 순차적으로 처리할 때
  • Paging
    • 멀티스레드 환경
    • 메모리 제약이 있는 경우
    • 대용량 데이터 처리 시

6. 구현 복잡성

  • Cursor: 구현이 간단하며, 별도의 설정 없이 바로 사용할 수 있음.
  • Paging: 페이지 크기, 정렬 설정 등이 필요하여 구현이 다소 복잡.

7. 주의사항

  • Cursor: 긴 실행 시간 동안 연결을 유지해야 하므로 네트워크 불안정성에 영향을 받을 수 있음.
  • Paging: 데이터가 자주 변경되는 환경에서는 페이지 간 데이터 일관성을 유지하기 어려울 수 있음.

8. 결론

일반적으로 Paging 방식이 더 안전하고 범용적이므로 기본 선택으로 고려하는 것이 좋을 것 같습니다.

Cursor 방식은 단일 스레드 환경이나 전체 데이터를 빠르게 처리해야 할 때, 또는 메모리가 충분할 경우에 적합합니다.

 

 


 

보통 Paging 방식을 많이 사용한다고 알고 있었지만

역시 코딩에는 정답이 없듯이, 각 환경에 맞는 방식을 비교해 보고 최적의 방법을 선택하는 것이 중요하다는 생각이 들었습니다.