작성
·
77
·
수정됨
1
치치직...1장 작전 3에서,
키보드는 꽉 잘 잡았는데 궁금한게 발생했다.
jobExecutionContext 에 접근/수정할 때
chunkContext 를 통해서 접근하는 방법과 contribution 을 통해서 접근하는 방법 두가지를 알게 되었다.
일부러 두가지 침투 방식 을 알려준 것 같으나 두 방식의 차이가 있는지, 무엇이 더 선호되는지 아니면 취향의 문제인지 궁금하다.
답변 3
2
아 질문을 이제 정확히 이해했다
치지직...
송신한다. 침투 루트 재분석 완료.
네가 말한 두 가지 침투 방식을 다시 정리하면:
JobExecution jobExecution = contribution.getStepExecution().getJobExecution();
ExecutionContext jobExecutionContext = jobExecution.getExecutionContext();
JobExecution jobExecution = chunkContext.getStepContext()
.getStepExecution()
.getJobExecution();
ExecutionContext jobExecutionContext = jobExecution.getExecutionContext();
현재까지 정해진 바로써는 StepContribution
방식을 권장한다.
이유:
길게 볼 때 더 안전한 침투 루트
추후 버전부터는 Tasklet.execute() 메서드에서 ChunkContext 파라미터가 제거될 가능성이 있다(아직 확정은 아님)
결론: StepContribution으로 침투하라. 더 오래 살아남을 루트다.💀
치지직... 전술 가이드 송신 완료.
2
치지직...
KILL-9: 작전 수행 중 발생한 침투 루트 질문에 대해 답변하겠다. (너무 꽉 잘 잡았구나.. 💀)
우선 정확한 용어 정리부터 하자. 그대가 말한 건 이거다:
@Value("#{jobExecutionContext['nine-mo']}")
private String nineMo;
코드명: SPEL 직접 주입
특징: 스프링이 알아서 JobContext로 부터 Job 수준 ExecutionContext 데이터를 가져다줌
// Tasklet 내부에서
JobExecution jobExecution = chunkContext.getStepContext()
.getStepExecution()
.getJobExecution();
ExecutionContext jobExecutionContext = jobExecution.getExecutionContext();
String targetData = (String) jobExecutionContext.get("nine-mo");
코드명: 수동 체이닝을 통한 컨텍스트 확보
특징: 우리가 직접 JobExecution → ExecutionContext 경로로 침투
표면적 차이:
SpEL = 스프링의 도움을 받는 자동 침투 - JobContext로부터 Job 수준 ExecutionContext를 가져온다.
체이닝 = 우리가 직접 하는 수동 침투
근본적으로는 동일하다. JobContext도 결국 JobExecution에서 ExecutionContext를 가져오는 것이기 때문이다.(이를 위에서 Job 수준 ExecutionContext라고 한 것이다.)
JobContext와 StepContext는 업데이트 예정이나 현재 spring integration 기반 잡 실행 예시를 만들고나서 + 2장 개선이 완료되면 업데이트 예정이다
SpEL이 압도적으로 선호된다.
이유:
코드 간결성: 한 줄이면 끝
가독성: 뭘 가져오는지 명확
스프링답다: 프레임워크의 힘을 제대로 활용
체이닝 방식은 언제 쓰나?
단순 조회를 넘어 ExecutionContext를 직접 조작해야 할 때
치지직... 침투 작전 가이드 송신 완료. 💀
송신 종료.
0
안녕하세요, 인프런 AI 인턴입니다.
nine-mo님, 강의에서 설명된 두 가지 방식의 jobExecutionContext
접근 방법에 대해 궁금하셨군요. Spring Batch에서는 일반적으로 ExecutionContext
에 접근하기 위한 두 가지 주요 메소드가 제공됩니다. 이를 통해 다양한 방식으로 Job의 실행 상태와 데이터를 관리할 수 있습니다.
chunkContext
를 통한 접근:
ChunkContext
는 주로 청크 레벨에서 실행되는 요소들에 대한 맥락 정보를 제공합니다. ExecutionContext
에 접근할 때 ChunkContext
를 사용하는 방식은 청크 레벨에서 데이터 또는 상태를 필요로 할 경우 유용합니다. 특히, 청크 간 공유 데이터를 변경하거나 트랜잭션 내에서의 상태를 조정할 때 적합합니다.contribution
를 통한 접근:
StepContribution
을 통해 ExecutionContext
에 접근하는 것은 주로 단계 레벨에서 사용하는 방식입니다. 전체 Step이 그 단계에서의 상태 변화나 데이터를 필요로 할 경우 이를 활용합니다. 또한, 이를 통해 다음 청크 실행 이전이나 이후에 처리할 데이터를 설정하는 데 유용합니다.두 방식의 선택은 상황에 따라 달라질 수 있으며, 둘 다 잘 사용됩니다. 특정 상황에서 청크 레벨에서의 조정이 필요하면 chunkContext
를, 단계 전체에 걸친 관리가 필요하면 contribution
을 사용하는 것이 일반적입니다. 따라서 프로젝트의 요구 사항이나 개인의 코딩 스타일에 따라 다르게 선택될 수 있습니다.
비슷한 상황에 대한 추가적인 설명을 원한다면 다음의 유사한 답변을 참고해 보시길 추천합니다:
- Spring Batch: ExecutionContext와 접근 방법의 차이점
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.