inflearn logo
강의

Course

Instructor

Spring Batch of Death: The desperate terror of 3 AM is finally over.

Chapter 3. Operation 1: Reading and Writing Relational Databases (Setting up an Execution Ground at the Heart of the Table ☠️)

JpaCursorItemReader의 정렬 조건 부재의 영향

28

seoys0910

5 asked

1

형 질문있어.

페이징 기반 ItemReader에서는 예제와 같이 ORDER BY를 추가해야 한다. ORDER BY가 없으면 매 페이지를 읽을 때마다 데이터의 순서가 보장되지 않아 일부 데이터가 누락되거나 중복될 수 있다.

라고 했잖아.

이 말은 곧 "JpaCursorItemReader 는 ORDER BY를 추가하지 않아도 괜찮다"로 들리는데 맞아?

GPT는 아니라고 하거든.

cursor 기반도 마찬가지로 ORDER BY가 없으면 재실행마다 DB에 정렬 순서를 위임하는데, DB는 쿼리 플랜이 변경되는 등 여러 원인들에 의해 실행마다 달라질 수 있대.

뭐가 맞아?

java spring spring-boot spring-batch backend

Answer 2

1

KILL-9

그렇다 ORDER BY가 없으면 재실행보단 정확히는 재시작시 (중단된 Job을 다시 실행 시킬 때) 이슈가 발생한다. (물론 순서가 이슈가될 수 있다면 재실행시에도 문제가 될 순 있다)

이 부분은 JdbcCursorItemReader에서 설명했으니 다시 확인해보도록 하라 💀💀

0

communityai8509

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

seoys0910님, Spring Batch의 JpaCursorItemReader와 관련하여 정렬 조건인 ORDER BY의 필요성에 대해 질문을 주셨네요. 이는 데이터를 처리하는 데 있어서 중요한 부분입니다.

배치 처리에서의 ORDER BY 필요성

  1. JpaCursorItemReader:

    • JpaCursorItemReaderORDER BY가 없으면 데이터베이스의 쿼리 실행 계획에 따라 각 실행 시 데이터의 순서가 달라질 수 있습니다. 이는 특히 배치 재시도나 처리 중단 후 재처리 시 문제가 될 수 있습니다.
    • 비록 Cursor를 사용하여 단일 ResultSet을 유지하는 듯 보이나, 모든 데이터의 일관성을 유지하는 보장은 없습니다. 따라서, 데이터의 일관된 순서가 필요하다면 ORDER BY를 명시적으로 지정하는 것이 좋습니다.
  2. 재실행 시 데이터 정렬:

    • Cursor 기반이라고 해서 매번 동일한 순서로 데이터를 반환한다는 보장은 없습니다. 데이터베이스의 상황에 따라 쿼리 최적화가 다르게 처리될 수 있고, 이는 결과 순서에 영향을 미칠 수 있습니다.
  3. 실무 권장사항:

    • 안정적인 배치 처리를 위해 특정 컬럼에 대한 ORDER BY를 사용하여 처리 순서를 확실히 하는 것이 좋습니다. 이는 데이터의 중복 처리나 누락을 방지하고, 데이터의 데이터를 특정 순서에 따라 보장된 방식으로 처리할 수 있게 합니다.

관련 질문과 추가 논의는 다음 게시글을 참고하시면 도움이 될 것 같습니다:
- JPA와 대량 데이터 처리 시 주의점에 대한 심층 토론

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

형 책 어떻게 받아?

0

8

0

"컴파일 시점에 없는 값을 어떻게 참조할 것인가?" 섹션

1

36

2

형 이번에 낸 책이랑 강의 내용에 차이가 있어?

1

66

1

형 나 몰래 책내면 모를 줄 알고?

2

60

2

강의 중복 확인 요청

0

35

1

중복내용 제보?!

1

60

2

Json 요청 처리

1

60

2

[건의][6장][작전1] deprecated 메소드

1

66

2

[예제][3장][작전2] windows 에서 마지막 예제

1

52

2

[오타][3장][작전1] 형 이건 빨리 해줘

2

118

2

[오타] "리스너 활용: 시스템 완전 장악 매뉴얼" 부분

1

74

1

[오타] "JobScope와 StepScope 사용 시 주의사항" 부분

1

72

2

spring boot 4 + spring batch 6 설정 변경?

1

132

2

Batch 패키지 설계 — 실무에서 Job 단위 구조

1

116

2

Spring batch를 실행해줄 스케줄러와 batch 실행 환경

1

97

1

메타테이블에 데이터가 생기지 않는 이유

1

127

2

Spring Batch 4.3.10 ExecutionContext 한글 인코딩 이슈 관련 문의

1

121

2

@StepScope 또는 @JobScope와 JobOperator

1

160

5

Remote Partitioning

1

118

2

킬구형 실무에서는 JPA ItemReader / ItemWriter를 더 선호해? 아니면 JDBC itemReader/ItemWriter를 더 선호해?

1

151

2

병렬 중첩

1

109

3

형 코드에 public static class 이게 뭐야 ?

1

146

3

ExitStatus

1

72

2

Batch6: jobOperator.startNextInstance() throws UnexpectedJobExecutionException

1

133

5