작성
·
670
0
안녕하세요
챕터 : 스프링 배치 실행 - flow
강의 : @JobScope / @StepScope - 기본개념 및 설정
실습 및 테스트 부분에 문의 있습니다.
런터임시 tasklet2()를 통해서 Tasklet빈 생성 할
@StepScope와 @Value를 사용하여
StepExecutionContext에 접근하여 원하는 값을
얻어오는 것을 실습해봤는데요
이렇게 @StepScope와 @Value를 통해서 하는 것과
바로 Tasklet에서 매개변수로 넘어오는
stepContribution을 통해서 접근하여 값을 얻어오는 것의
차이점은 어떤 걸까요?
해당 실습에서는 둘다 결과가 같아서 차이점이 헷갈립니다.
답변 1
6
네
결과가 동일한 것은 맞지만 처리하는 방식이 다르다고 할 수 있습니다.
@StepScope를 사용하면 스프링의 표현식 언어를 사용해서 런타임 시점에 @StepScope를 선언한 빈이 생성되는 동시에 파라미터 바인딩이 적용되어 좀 더 유연한 설계가 가능해 집니다.
stepContribution 와 같은 객체를 참조해서 사용하지 않아도 표현식 언어로 접근이 가능해 지는거죠
구동시점이 아닌 실행 시점에 JobParameter 의 파라미터 값을 설정하고 실제 빈을 호출하면 해당 파라미터를 표현식 언어로 주입받을 수 있게 됩니다.
이것이 가능하게 하는 것이 @StepScope 를 선언해 주었기 때문입니다.
또한 런타임 시점에 빈이 생성된다는 것은 지연 생성이 가능하다는 것이고 특히 병렬처리 환경에서는 여러 스레드가 실제 빈을 호출하는 시점에 @StepScope 이 선언된 빈의 객체가 스레드마다 생성되어 할당되기 때문에 스레드에 안전한 실행이 가능해 집니다
가령 예를 들어 여러 스레드가 하나의 Step 객체빈을 공유해서 사용할 경우 Tasklet 내 멤버 변수가 존재한다면 그 멤버 변수의 동시적 접근에 따른 동시성 문제 등 스레드 안전성을 해칠 수 있으나 @StepScope 가 선언되면 Step 객체를 여러 스레드가 공유하지 않고 스레드마다 생성되어 할당되기 때문에 멤버 변수를 공유할 수 없어 스레드에 안전하게 됩니다.
요약하자면
1. Step 빈의 생성이 구동시점이 아닌 런타임 시점에 생성되어 객체의 지연로딩이 가능해진다
2. 파라미터의 주입을 구동시점이 아닌 런타임 시점에 표현식 언어로 유연하게 주입받을 수 있다
3. 병렬 처리시에 스레드마다 Step 객체가 생성되어 할당되기 때문에 멤버 변수등의 동시적 접근과 같은 동시성 문제를 차단할 수 있다
자세한 내용은 강의에서 설명하고 있으니 참고해 주시기 바랍니다.