강의

멘토링

커뮤니티

Inflearn Community Q&A

jjw9812106721's profile image
jjw9812106721

asked

Introduction to Spring Batch: Fundamentals of Large-Scale Processing in 3 Hours

[Hands-on] Automating Batch Registration in Jenkins

jobParameter를 통한 멱등성 질문

Resolved

Written on

·

29

·

Edited

1

안녕하세요 우선 좋은 강의 감사드립니다. 덕분에 Batch에 대한 기본적인 틀을 잡을 수 있을 것 같아요! 중급강의도 기대됩니다.

실습을 따라가던 와중, 멱등성을 유지하기 위해서 궁금한점이 생겨서 질문드립니다.

  1. 같은 파라미터로 완료된 job은 재실행을 허용하지 않기 때문에 parameter로 time을 넣어주셨는데요.

    그렇게 되면 만약에 job을 실패지점부터 재실행 하고 싶은 경우에는 targetDate 뿐만 아니라 실패한 시간대에 time 파라미터까지 넣어서 재시작을 해야하는 것인가요?

  2. 만약에 time 파라미터를 추가한 상태에서, 이전 실행과 다른 time 파라미터로 완료된 job을 재실행 할경우에는 정산 테이블에서 targetDate에 해당하는 값을 DELETE를 하고 INSERT를 진행해야 멱등성이 유지될 것 같습니다. 이럴 경우 DELETE 같은 경우는 Settlement INSERT 작업 이전에 별도의 Step으로 구성이 되야할까요?

    1. 만약에 DELETE를 해야한다면 DELETE의 경우에는 targetDate의 해당 하는 값을 한번에 전부 지우고 INSERT를 시작하는지 궁급합니다..!

mysqljenkinsspring-bootspring-batchgradle

Answer 2

0

synee님의 프로필 이미지
synee
Instructor

iii님 안녕하세요! JSCODE 시니입니다~

 

우선 강의를 재미있게 들어주시고, 중급 강의까지 기대해 주신다니 정말 감사합니다! ㅎㅎ
남겨주신 질문들을 읽어보니, 배치 프로세스 설계의 핵심이자 가장 까다로운 부분 중 하나인
멱등성과 실패 복구에 대해 아주 정확하고 깊이 있는 고민을 하고 계신 것 같아요~!

 

질문주신 내용은 실제 실무에서 배치를 설계할 때 반드시 고려해야 하는 포인트들 입니다! ㅎㅎ

 

iii님이 질문 주신 세 가지 질문에 대해 하나씩 답변 드리겠습니다!

 

1. 실패 지점부터 재실행할 때의 파라미터 유지 여부

"만약에 job을 실패지점부터 재실행 하고 싶은 경우에는 targetDate 뿐만 아니라 실패한 시간대에 time 파라미터까지 넣어서 재시작을 해야하는 것인가요?"

네! 정확히 맞습니다.

Spring Batch에서 동일한 Job을 식별하는 기준은 Job Parameters 입니다. 파라미터가 완벽하게 동일해야 Spring Batch는 이를 새로운 실행이 아닌 기존 JobInstance의 재실행으로 인식합니다!

따라서, 실행도중 실패한 Job을 처음부터가 아닌 실패한 지점(Chunk) 부터 이어서 재실행 하고 싶다면, targetDate는 물론이고 실패했던 당시의 time 파라미터 값까지 똑같이 넣어서 실행하셔야 합니다!

만약 time 값을 조금이라도 다르게 부여하면, Spring Batch는 이를 완전히 새로운 JobInstance로 판단하여 처음부터 새로운 작업을 시작하게 됩니다~!

 

2.다른 time 파라미터로 재실행시 DELETE Step 분리 여부

"정산 테이블에서 targetDate에 해당하는 값을 DELETE를 하고 INSERT를 진행해야 멱등성이 유지될 것 같습니다. 이럴 경우 DELETE 같은 경우는 Settlement INSERT 작업 이전에 별도의 Step으로 구성이 되야할까요?"

네 맞습니다!

이전 실행이 완료되었거나, 실패했더라도 처음부터 완전히 다시 돌리고 싶어 새로운 time 파라미터를 부여하여 실행하는 경우가 있습니다. 이때 기존에 처리된 데이터가 남아있다면 중복 정산이 발생하므로 멱등성이 깨지게 됩니다..!

이런 상황에서 멱등성을 보장하기 위해 iii님께서 말씀주신 것 처럼 INSERT 이전에 기존 데이터를 DELETE 하는 작업이 필수적 입니다.

그리고 이 DELETE 작업은 별도의 Step(예를 들면 deleteSettlementStep) 으로 구성하여

INSERT Step 바로 직전에 배치하는 것이 가장 권장되는 설계 방식입니다.

이렇게 Step을 분리하면 역할이 명확해지고, 트랜잭션 관리도 훨씬 깔끔해질거에요!ㅎㅎ

 

3.DELETE 실행 방식 (한 번에 삭제 OR 나누어서 삭제)

"만약에 DELETE를 해야한다면 DELETE의 경우에는 targetDate의 해당 하는 값을 한번에 전부 지우고 INSERT를 시작하는지 궁금합니다..!"

일반적으로는 targetDate에 해당하는 값을 한 번에 벌크연산으로 전부 지우고 시작하는 것이 맞습니다.

정산 배치의 특성상 해당 날짜(targetDate)의 정산 데이터를 처음부터 다시 만든다는 의미이므로,

특정 날짜의 데이터를 초기화 하는 개념 입니다.
따라서 다음과 같이 쿼리를 작성해서 삭제하는 방식을 주로 사용합니다.
DELETE FROM settlement WHERE target_date = :targetDate

단, 실무에서 작업을 하다보면 삭제해야할 targetDate의 하루치 데이터가 수천만건 이상 이여서 한번에 DELETE 쿼리를 날리게 되면 DB락이 걸리게 되거나 성능상 이슈가 발생할 수도 있습니다..!

이때는 예외적으로 삭제 작업도 Chunk 단위로 나누어 지우거나,
파티셔닝을 고려해야 할 수도 있습니다.

하지만 제 경험상 일반적인 실무 환경에서는 날짜 조건 인덱스를 활용하여 벌크 연산으로 처리하는 경우가 가장 많았던 것 같습니다.

제가 iii님의 질문을 잘 이해하고 답변을 달아드렸는지 모르겠네요~!
혹시라도 잘 해결이 되지 않는 부분이 있다면 언제든 편하게 게시판에 남겨주세요!
최대한 빠르게 확인 후 답변드리도록 하겠습니다~!

 

오늘도 즐거운 하루 보내세요! ㅎㅎ

0

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

Spring Batch에서 멱등성을 유지하기 위해 JobParameter를 활용하는 방법과 관련된 질문에 대해 도와드리겠습니다.

1. 실패 지점부터 재실행 관련

Spring Batch에서 JobParameter를 사용해 동일한 작업을 중복 실행하지 않는 멱등성을 갖추고자 합니다. 말씀하신 것처럼 특정 시간대에 실행된 후에 실패한 작업을 재시작하고 싶다면, 동일한 time 파라미터를 사용해야 이전 상태를 인지하고 그 지점부터 재실행할 수 있게 됩니다. 이 경우 time 파라미터를 기존에 실패한 작업과 일치시키는 것이 중요합니다. 그렇지 않으면 새로운 Job으로 인식되어 처음부터 실행될 수 있습니다.

2. 멱등성 유지와 테이블 정리

time 파라미터를 다르게 설정하고 이미 완료된 Job을 다시 실행하려는 경우, 지정된 targetDate의 데이터를 정리(DELETE)하고 새로운 데이터를 삽입(INSERT)해야 합니다. 이는 멱등성을 유지하면서 데이터를 정확히 갱신하기 위해 필수적인 과정입니다.

  1. DELETE를 별도의 Step으로 구성: DELETE 작업은 특정 targetDate에 해당하는 데이터를 모두 삭제한 후, INSERT 작업을 수행할 수 있도록 별도의 Step으로 구성하는 것이 일반적입니다. 이렇게 하면 데이터 정리 및 삽입 과정의 논리적 구분이 명확해지고 트랜잭션 관리도 용이해집니다.

  2. DELETE 전략: 보통, 지정한 targetDate에 해당하는 모든 데이터를 삭제하는 방식으로 작업합니다. 그런 다음 INSERT를 통해 갱신된 데이터를 추가함으로써 데이터 일관성을 유지할 수 있습니다.

관련 질문 및 답변 링크

보다 구체적인 예시와 추가적인 문제 해결 방법은 아래의 링크에서 확인하실 수 있습니다:

이 링크에서는 유사한 상황에서의 해결책에 대한 설명이 포함되어 있어 참고하시면 많은 도움이 될 것입니다.

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

jjw9812106721's profile image
jjw9812106721

asked

Ask a question