inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

스냅샷 읽기

해결된 질문

96

정성훈

작성한 질문수 31

1

cursorReader에서 스냅샷을 읽어서 동일한 스탭에서 데이터가 변경되어도 영향을 받지 않는다 하셨는데,
이거는 mysql의 repeatable read와 관련된 스냅샷인걸까요? 아니면 배치 자체에서 제공하는 스냅샷인가요?

java spring spring-boot spring-batch backend

답변 3

1

KILL-9

KILL-9@/bin/technical_response:~$ cat cursor_snapshot_explanation.log

╔═════════════════════════════════════════════════════════════════════╗
║              🚨 CURSOR SNAPSHOT DEEP DIVE INITIATED 🚨              ║
║                  TECHNICAL BREAKDOWN PROTOCOL                       ║
╚═════════════════════════════════════════════════════════════════════╝

[TIMESTAMP]: System.currentTimeMillis()
[SEVERITY]: CORE_CONCEPT_CLARIFICATION
[STATUS]: 안그래도 저 부분을 작성할 당시 질문이 많이 들어올 수 있겠구나라고 생각한 내용을 너가 처음으로 질문하는구나. 그동안 아무도 이 부분에 대해 의문을 갖지 않았다.

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ TECHNICAL EXPLANATION INITIATED ▓▓▓▓▓▓▓▓▓▓▓▓▓▓

설명한다. 우선 격리 레벨과 상관없이 디비(일부 드라이버 레벨) 레벨에서 제공하는 스냅샷이다.

└─> [STARTING_POINT]: PostgreSQL부터 이야기하자

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ POSTGRESQL CURSOR BEHAVIOR ▓▓▓▓▓▓▓▓▓▓▓▓▓▓

└─> [CORE_CHARACTERISTIC]: PostgreSQL은 커서 실행시점의 스냅샷을 제공한다
└─> [DEFINITION]: 다시 말해 PostgreSQL의 커서는 **INSENSITIVE**하다
└─> [RESULT]: 데이터 변경에 영향받지 않음

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ MYSQL ANALYSIS - THE COMPLEX CASE ▓▓▓▓▓▓▓▓▓▓▓▓▓▓

└─> [WARNING]: 쓸데없는 설명이 길어질 것 같아 강의에선 생략하였으나...
└─> [REALITY]: MySQL의 경우 두 가지 경우로 나눌 수 있다

**CASE 1: JDBC Driver 기본 동작 (useCursorFetch=false)**
└─> [MECHANISM]: JDBC driver가 전체 데이터를 모두 가져오기 때문에 스냅샷과 동일
└─> [REFERENCE]: 강의에서 인용으로 설명한 것처럼

**CASE 2: useCursorFetch=true인 경우**  
└─> [MECHANISM]: MySQL이 쿼리 실행 시점의 스냅샷을 임시 공간에 저장해 이를 스트리밍하는 방식
└─> [CLASSIFICATION]: 따라서 이 방식도 **INSENSITIVE**

▓▓▓▓▓▓▓▓▓▓▓▓▓▓ FINAL CONCLUSION ▓▓▓▓▓▓▓▓▓▓▓▓▓▓
└─> [RESULT]: 결과적으로 "데이터 변경에 영향을 받지 않는다"가 된다

[SYSTEM] Technical explanation complete
[INFO]  Database cursor behavior: DEMYSTIFIED
[WARN]  This is why proper understanding matters in enterprise batch processing

💀 KILL-9 SYSTEM TERMINATOR  
Process terminated with exit code: KNOWLEDGE_TRANSFERRED_SUCCESSFULLY

1

정성훈

요점은 앱이 아니라 db 레벨에서 제공하는 스냅샷을 통해 이뤄진다는거네요 감사합니다.

1

KILL-9

 ██████╗  ██████╗  ██████╗ ██████╗      ██╗ ██████╗ ██████╗ 
██╔════╝ ██╔═══██╗██╔═══██╗██╔══██╗     ██║██╔═══██╗██╔══██╗
██║  ███╗██║   ██║██║   ██║██║  ██║     ██║██║   ██║██████╔╝
██║   ██║██║   ██║██║   ██║██║  ██║██   ██║██║   ██║██╔══██╗
╚██████╔╝╚██████╔╝╚██████╔╝██████╔╝╚█████╔╝╚██████╔╝██████╔╝
 ╚═════╝  ╚═════╝  ╚═════╝ ╚═════╝  ╚════╝  ╚═════╝ ╚═════╝ 
                                                              
██╗    ██╗ █████╗ ██████╗ ██████╗ ██╗ ██████╗ ██████╗ ███████╗
██║    ██║██╔══██╗██╔══██╗██╔══██╗██║██╔═══██╗██╔══██╗██╔════╝
██║ █╗ ██║███████║██████╔╝██████╔╝██║██║   ██║██████╔╝███████╗
██║███╗██║██╔══██║██╔══██╗██╔══██╗██║██║   ██║██╔══██╗╚════██║
╚███╔███╔╝██║  ██║██║  ██║██║  ██║██║╚██████╔╝██║  ██║███████║
 ╚══╝╚══╝ ╚═╝  ╚═╝╚═╝  ╚═╝╚═╝  ╚═╝╚═╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝

0

weekly.cow.ovgq

That's a great question about data consistency! Thinking about preventing unintended updates reminds me of navigating the tricky slopes in Snow Rider 3D. Avoiding those sudden ice patches requires a good understanding of the game’s physics. Similarly, your question touches on the underlying mechanisms ensuring data integrity.

0

인프런 AI 인턴

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

정성훈님, 질문해주신 “스냅샷 읽기” 관련하여, 이는 주로 데이터베이스의 트랜잭션 격리 수준과 관련이 있습니다. 여기서 언급된 스냅샷은 MySQL의 트랜잭션 격리 수준인 “Repeatable Read”와 관련이 있습니다.

스냅샷 읽기와 Repeatable Read

  • 스냅샷: 트랜잭션이 시작될 때의 데이터 상태를 의미하며, 트랜잭션 격리 수준에 따라서 스냅샷이 유지됩니다.
  • Repeatable Read: MySQL에서 기본적으로 제공하는 트랜잭션 격리 수준 중 하나로, 특정 트랜잭션 내에서 동일한 데이터를 반복 조회할 때 항상 일관된 결과를 보장합니다. 즉, 트랜잭션이 시작된 후 다른 트랜잭션이 데이터를 변경하더라도, 최초 트랜잭션의 시작 시점의 스냅샷을 참조하여 일관된 데이터를 제공합니다.

Spring Batch와의 관계

  • CursorReader: 일반적으로 데이터베이스의 커서(cursor)를 통해 데이터를 순차적으로 읽습니다. 이 경우 데이터베이스 트랜잭션의 격리 수준에 따라 스냅샷이 활용될 수 있습니다.
  • Spring Batch 자체의 제공 기능이 아니라, 사용 중인 데이터베이스의 트랜잭션 격리 수준을 이용하여 구현됩니다.

관련된 기존 답변과 유사한 질문을 참고하시면 도움이 될 것입니다:

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

0

frail.jay.mbzy

It sounds like you’re referring to how snapshots help maintain consistent reads even when data changes during the same step. That concept does remind me of MySQL’s repeatable read isolation level, where a snapshot of the data is taken at the start of a transaction. By the way, if you enjoy exploring classic-style games with a modern twist, you might want to check out Retro Bowl for something fun and engaging.


형 책 어떻게 받아?

1

59

1

JpaCursorItemReader의 정렬 조건 부재의 영향

1

46

2

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

1

53

2

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

1

90

1

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

2

79

2

강의 중복 확인 요청

1

43

1

중복내용 제보?!

1

73

2

Json 요청 처리

1

69

2

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

1

78

2

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

1

71

2

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

2

128

2

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

1

78

1

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

1

76

2

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

1

147

2

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

1

128

2

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

1

103

1

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

1

134

2

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

1

125

2

@StepScope 또는 @JobScope와 JobOperator

1

165

5

Remote Partitioning

1

120

2

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

1

154

2

병렬 중첩

1

111

3

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

1

151

3

ExitStatus

1

73

2