@StepScope를 사용한 것과 안한 것의 차이점 문의
780
작성한 질문수 9
안녕하세요
챕터 : 스프링 배치 실행 - 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 객체가 생성되어 할당되기 때문에 멤버 변수등의 동시적 접근과 같은 동시성 문제를 차단할 수 있다
자세한 내용은 강의에서 설명하고 있으니 참고해 주시기 바랍니다.
스프링 배치 버전 질문
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





