inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 배치

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

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

780

개감

작성한 질문수 9

0

안녕하세요 

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

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

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

 

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

@StepScope와 @Value를 사용하여 

StepExecutionContext에 접근하여 원하는 값을

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

 

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

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

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

차이점은 어떤 걸까요?

 

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

spring-batch spring-boot

답변 1

6

정수원

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

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

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

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

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

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

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

요약하자면

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

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

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

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

스프링 배치 버전 질문

0

120

1

소스코드가 어디에 있나요?

0

96

2

트랜잭션 예외

0

90

1

질문이 있습니다.

0

129

2

ChunkListener 에서 beforeChunk 의 실행 시점 관련 질문

0

124

2

여러 JOB 설정하는법

0

150

2

강의 자료 다른 방법 있을까요?

0

154

1

JobExecution과 JobExecutionContext와의 관계

0

186

2

특정 job만 실행

1

251

1

Batch 성능 질문

0

152

1

ItemReaderAdapter 종료

0

79

1

[ 강좌 Git 브랜치 문의 ] 섹션 9 > JdbcCursorItemReader, JpaCursorItemReader

0

179

2

Spring Batch 배포 질문

0

245

2

spring batch 버전

0

236

2

retry count 관련 질문

0

171

2

StepExecutionListener 의 afterStep 에서 return ExitStatus.FAILED 에 의한 동작에 의문이 갑니다.

0

330

2

jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)

0

235

2

Multithread step과 AsyncItemProcessor

0

202

2

job 재실행

0

250

2

bean 생명주기 문제 도와주세요(@Scope("step"), @Autowired)

0

183

1

Multi-threaded-step과 Partitioning 차이 확인

0

174

2

jdbcCursorReader, jdbcPagingReader 질문

0

145

1

step muti-thread 질문

0

109

1

itemSteam open update close 질문

0

110

1