강의

멘토링

로드맵

Inflearn brand logo image

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

chancehee96님의 프로필 이미지
chancehee96

작성한 질문수

PagingItemReader

작성

·

4

·

수정됨

0

안녕하세요 선생님 강의 잘 듣고 있습니다.

# 질문

PagingItemReader는 Cursor 기반과 다르게 DB Connection을 페이징 단위로 맺는 것으로 이해했습니다.

배치 수행 중, SQL Select 대상이 되는 테이블이 CUD 작업으로 데이터 모수가 변경되는 상황에서
Paging 기반으로 처리 했을 때, 중복으로 처리되거나 처리되지 않는 케이스가 있을 것 같은데

해당 케이스는 실무에서 어떻게 처리하는지 궁금합니다.

 

선생님의 고견을 기다리고 있겠습니다.

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
chancehee96님 질문 주셔서 감사합니다.

PagingItemReader로 배치 작업을 수행할 때, 데이터베이스의 테이블이 CUD(Create, Update, Delete) 작업으로 변동되면 중복되거나 누락되는 데이터가 발생할 가능성이 있습니다. 이는 페이징 페이지가 여러 번 수행되면서 데이터베이스 상태가 변경될 수 있기 때문입니다. 이러한 상황을 위하여 실무에서는 다음과 같은 방법들을 고려할 수 있습니다:

  1. 고정된 Snapshot 사용: 배치 작업이 실행될 때마다 일정 시점의 데이터를 고정해서 읽게끔 설정하여 일관된 상태의 데이터를 처리합니다. 데이터 변경에 대한 영향을 최소화할 수 있습니다.

  2. 레코드 락킹(Locking) 사용: Optimistic Locking 또는 Pessimistic Locking을 사용하여 데이터 충돌을 방지하고, 각 데이터셋의 일관성을 높입니다. 하지만 이는 데이터베이스 성능에 영향을 줄 수 있는 점을 고려해야 합니다.

  3. 비즈니스 로직에서 체크: 배치 작업 후 데이터의 일관성을 검증하는 로직을 추가하여 중복 또는 누락 데이터를 탐지하고, 이를 처리하는 보정 작업을 진행할 수 있습니다.

  4. Chunk Transaction 제어: Spring Batch의 경우 Chunk 단위로 트랜잭션을 제어하여 데이터 정합성을 확보할 수 있습니다. 그러나 이는 부분적으로 데이터 변경에 민감할 수 있습니다.

배치 작업 상황에 따라, 상기 방법들을 적절히 조합하여 최적의 솔루션을 구성하는 것이 중요합니다.

Spring Batch에 대한 보다 자세한 내용은 Spring Batch 공식 문서를 참고하시면 도움이 될 것입니다.

추가 질문이 있으면 언제든지 문의해 주세요!

chancehee96님의 프로필 이미지
chancehee96

작성한 질문수

질문하기