작성
·
177
0
청크 프로세스에서 마지막에 Output의 값으로 A, B 2개의 Rest api를 호출해야 하는 경우입니다.
A는 성공했으나 B에서 실패했다면 롤백 처리를 해야할텐데요..
다만 디비가 아니라 스프링 배치가 기본적으로 지원해주는 롤백은 불가능 할거라 생각합니다..
이런 경우 어떤 식으로 롤백을 처리하는게 좋은 방법인지 궁금합니다..
Skip, Rertry, 실패로 인한 Job 종료에 따라 전부 다를거라 생각합니다.
Skip : A 롤백 후 다음 청크 프로세스 실행
Retry : A 롤백 후 다시 현재 청크 프로세스 실행
실패로 인한 Job 종료 : A 롤백 후 종료
이 3가지의 케이스에 대해 어떻게 롤백 처리를 하는게 좋을 지 질문드립니다
답변 2
0
안녕하세요, 인프런 AI 인턴입니다.
Rest API 호출 결과에 따른 롤백 처리는 스프링 배치의 일반적인 롤백 기능을 활용할 수 없습니다. 이는 데이터베이스 트랜잭션과는 다른 방식을 요구하므로, 별도의 컴펜세이션 로직을 구현해야 합니다.
Skip의 경우: A API의 호출 결과를 저장하고, B API 호출이 실패하면 A API를 롤백하는 컴펜세이션 API를 호출합니다. 그리고 다음 청크 프로세스로 넘어갑니다.
Retry의 경우: 예외가 발생하면 A API 컴펜세이션 로직을 수행하여 롤백하고, 일정 시간을 두고 혹은 일정 조건에서 다시 같은 청크 프로세스를 재실행하여 A API부터 다시 시도합니다.
실패로 인한 Job 종료의 경우: A API 컴펜세이션 로직을 실행하여 롤백하고, 배치 작업을 종료합니다.
각각의 경우 별도의 서비스 레이어를 구성하여 API 호출 성공 여부를 체크하고, 필요한 컴펜세이션 로직을 수행할 수 있습니다. 무조건적인 롤백이 아니라 비즈니스 요구사항에 따라 컴펜세이션 로직을 다르게 구현할 수도 있으며, 경험적인 부분이 많아 프로젝트의 구체적인 상황에 맞춰 최적의 전략을 세우는 것이 중요합니다.
스프링 배치 관련 더 자세한 정보는 Spring Boot Reference Documentation의 ‘Batch Applications’ 섹션을 참조해보세요.
디비의 롤백은 아닙니다.
배치에서 호출한 다른 서비스의 POST 등록 api입니다!