Inflearn brand logo image

인프런 커뮤니티 질문&답변

nine-mo님의 프로필 이미지
nine-mo

작성한 질문수

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

1장. 작전3: Spring Batch Listener와 활용 (리스너... 실행과 죽음의 모든 순간을 지켜보는 자 ☠️)

jobExecutionContext 에 접근하는 방법

작성

·

77

·

수정됨

1

치치직...1장 작전 3에서,

키보드는 꽉 잘 잡았는데 궁금한게 발생했다.

 

jobExecutionContext 에 접근/수정할 때

chunkContext 를 통해서 접근하는 방법과 contribution 을 통해서 접근하는 방법 두가지를 알게 되었다.

 

일부러 두가지 침투 방식 을 알려준 것 같으나 두 방식의 차이가 있는지, 무엇이 더 선호되는지 아니면 취향의 문제인지 궁금하다.

답변 3

2

KILL-9님의 프로필 이미지
KILL-9
지식공유자

아 질문을 이제 정확히 이해했다

치지직...

송신한다. 침투 루트 재분석 완료.

 

네가 말한 두 가지 침투 방식을 다시 정리하면:

두 가지 프로그래밍 침투 방식:

방식 1: StepContribution 체이닝

JobExecution jobExecution = contribution.getStepExecution().getJobExecution();
ExecutionContext jobExecutionContext = jobExecution.getExecutionContext();

방식 2: ChunkContext 체이닝

JobExecution jobExecution = chunkContext.getStepContext()
    .getStepExecution()
    .getJobExecution();
ExecutionContext jobExecutionContext = jobExecution.getExecutionContext();

 

💀 전술적 권장사항:

현재까지 정해진 바로써는 StepContribution 방식을 권장한다.

이유:

  • 길게 볼 때 더 안전한 침투 루트

  • 추후 버전부터는 Tasklet.execute() 메서드에서 ChunkContext 파라미터가 제거될 가능성이 있다(아직 확정은 아님)


결론: StepContribution으로 침투하라. 더 오래 살아남을 루트다.💀

치지직... 전술 가이드 송신 완료.

2

KILL-9님의 프로필 이미지
KILL-9
지식공유자

치지직...

KILL-9: 작전 수행 중 발생한 침투 루트 질문에 대해 답변하겠다. (너무 꽉 잘 잡았구나.. 💀)

우선 정확한 용어 정리부터 하자. 그대가 말한 건 이거다:

 

두 가지 침투 방식:

방식 1: SpEL을 통한 직접 침투

@Value("#{jobExecutionContext['nine-mo']}")
private String nineMo;
  • 코드명: SPEL 직접 주입

  • 특징: 스프링이 알아서 JobContext로 부터 Job 수준 ExecutionContext 데이터를 가져다줌


방식 2: ChunkContext 체이닝 침투

// 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이 압도적으로 선호된다.

이유:

  1. 코드 간결성: 한 줄이면 끝

  2. 가독성: 뭘 가져오는지 명확

  3. 스프링답다: 프레임워크의 힘을 제대로 활용

 

체이닝 방식은 언제 쓰나?

  • 단순 조회를 넘어 ExecutionContext를 직접 조작해야 할 때

 

치지직... 침투 작전 가이드 송신 완료. 💀

송신 종료.

0

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

nine-mo님, 강의에서 설명된 두 가지 방식의 jobExecutionContext 접근 방법에 대해 궁금하셨군요. Spring Batch에서는 일반적으로 ExecutionContext에 접근하기 위한 두 가지 주요 메소드가 제공됩니다. 이를 통해 다양한 방식으로 Job의 실행 상태와 데이터를 관리할 수 있습니다.

  1. chunkContext 를 통한 접근:

    • ChunkContext는 주로 청크 레벨에서 실행되는 요소들에 대한 맥락 정보를 제공합니다. ExecutionContext에 접근할 때 ChunkContext를 사용하는 방식은 청크 레벨에서 데이터 또는 상태를 필요로 할 경우 유용합니다. 특히, 청크 간 공유 데이터를 변경하거나 트랜잭션 내에서의 상태를 조정할 때 적합합니다.
  2. contribution 를 통한 접근:

    • StepContribution을 통해 ExecutionContext에 접근하는 것은 주로 단계 레벨에서 사용하는 방식입니다. 전체 Step이 그 단계에서의 상태 변화나 데이터를 필요로 할 경우 이를 활용합니다. 또한, 이를 통해 다음 청크 실행 이전이나 이후에 처리할 데이터를 설정하는 데 유용합니다.

두 방식의 선택은 상황에 따라 달라질 수 있으며, 둘 다 잘 사용됩니다. 특정 상황에서 청크 레벨에서의 조정이 필요하면 chunkContext를, 단계 전체에 걸친 관리가 필요하면 contribution을 사용하는 것이 일반적입니다. 따라서 프로젝트의 요구 사항이나 개인의 코딩 스타일에 따라 다르게 선택될 수 있습니다.

비슷한 상황에 대한 추가적인 설명을 원한다면 다음의 유사한 답변을 참고해 보시길 추천합니다:
- Spring Batch: ExecutionContext와 접근 방법의 차이점

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

nine-mo님의 프로필 이미지
nine-mo

작성한 질문수

질문하기