• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

@StepScope를 사용한 것과 안한 것의 차이점 문의

21.11.04 12:09 작성 조회수 484

0

안녕하세요 

챕터 : 스프링 배치 실행 - flow

강의 : @JobScope / @StepScope - 기본개념 및 설정

실습 및 테스트 부분에 문의 있습니다.

 

런터임시 tasklet2()를 통해서 Tasklet빈 생성 할

@StepScope와 @Value를 사용하여 

StepExecutionContext에 접근하여 원하는 값을

얻어오는 것을 실습해봤는데요

 

이렇게 @StepScope와 @Value를 통해서 하는 것과

바로 Tasklet에서 매개변수로 넘어오는

stepContribution을 통해서 접근하여 값을 얻어오는 것의

차이점은 어떤 걸까요?

 

해당 실습에서는 둘다 결과가 같아서 차이점이 헷갈립니다.

답변 1

답변을 작성해보세요.

5

결과가 동일한 것은 맞지만 처리하는 방식이 다르다고 할 수 있습니다.

@StepScope를 사용하면 스프링의 표현식 언어를 사용해서 런타임 시점에 @StepScope를 선언한 빈이 생성되는 동시에 파라미터 바인딩이 적용되어 좀 더 유연한 설계가 가능해 집니다.

stepContribution 와 같은 객체를 참조해서 사용하지 않아도 표현식 언어로 접근이 가능해 지는거죠

구동시점이 아닌 실행 시점에 JobParameter 의 파라미터 값을 설정하고 실제 빈을 호출하면 해당 파라미터를 표현식 언어로 주입받을 수 있게 됩니다.

이것이 가능하게 하는 것이 @StepScope 를 선언해 주었기 때문입니다.

또한 런타임 시점에 빈이 생성된다는 것은 지연 생성이 가능하다는 것이고 특히 병렬처리 환경에서는 여러 스레드가 실제 빈을 호출하는 시점에 @StepScope 이 선언된 빈의 객체가 스레드마다 생성되어 할당되기 때문에 스레드에 안전한 실행이 가능해 집니다

가령 예를 들어 여러 스레드가 하나의 Step 객체빈을 공유해서 사용할 경우 Tasklet 내 멤버 변수가 존재한다면   그 멤버 변수의 동시적 접근에 따른 동시성 문제 등 스레드 안전성을 해칠 수 있으나 @StepScope 가 선언되면 Step 객체를 여러 스레드가 공유하지 않고 스레드마다 생성되어 할당되기 때문에 멤버 변수를 공유할 수 없어 스레드에 안전하게 됩니다. 

요약하자면

1. Step 빈의 생성이 구동시점이 아닌 런타임 시점에 생성되어 객체의 지연로딩이 가능해진다

2. 파라미터의 주입을 구동시점이 아닌 런타임 시점에 표현식 언어로 유연하게 주입받을 수 있다

3. 병렬 처리시에 스레드마다 Step 객체가 생성되어 할당되기 때문에 멤버 변수등의 동시적 접근과 같은 동시성 문제를 차단할 수 있다

자세한 내용은 강의에서 설명하고 있으니 참고해 주시기 바랍니다.