[Spring Batch] @JobScope, @StepScope 를 사용하는 이유와 주의

Cho-D-YoungRae·2023년 5월 18일
0
post-thumbnail

작동

  • Job 과 Step 의 빈 생성과 실행에 관여하는 스코프
  • 프록시 모드를 기본값으로 하는 스코프
  • 해당 스코프가 선언되면 빈의 생성이 어플리케이션 구동시점이 아닌 빈의 실행 시점에 이루어진다.
  • 프록시 모드로 빈이 선언되기 때문에 어플리케이션 구동시점에는 빈의 프록시 객체가 생성되어 실행 시점에 실제 빈을 호출해준다.

사용 이유

  • @Value 를 통해 jobParameter, jobExecutionContext, stepExecutionContext 사용 가능
  • JobParameter 를 빈의 실행 시점에 값을 참조할 수 있음 (Late Binding)
    • Job Parameter 를 StepContext 또는 JobContext 레벨에서 할당시킬 수 있음
    • 어플리케이션의 실행 시점이 아니더라도 Controller 나 Service 와 같은 비즈니스 로직 처리 단계에서 Job Parameter 를 할당 가능
  • 동일한 컴포넌트를 병렬 혹은 동시에 사용할 때 유용
    • 병렬 혹은 동시에 사용되어야 하는 컴포넌트에 멤버 변수와 이 멤버 변수를 변경하는 로직이 있을 경우, @StepScope 없이 실행시키면 서로 다른 Step에서 하나의 컴포넌트의 상태를 변경하게됨
    • @StepScope 가 있다면 각각의 Step 에서 별도로 컴포넌트를 생성하고 관리하기 때문에 서로의 상태를 침범할 일 없음

주의

// 인터페이스 타입 반환 시 문제 발생 가능
@Bean
@StepScope
Public ItemReader reader() {...}

// 구현체 타입으로 반환
@Bean
@StepScope
Public JpaPagingItemReader reader() {...}
  • @StepScopeproxyMode = ScopedProxyMode.TARGET_CLASS 이기 때문에 인터페이스 타입으로 빈을 반환할 경우 해당 인터페이스의 프록시 객체를 생성하게 됨
  • 인터페이스의 구현체의 메서드를 사용해야되는 것이 있는데 이를 사용할 수 없음
    • ItemReader 의 인터페이스는 read() 밖에 없어서 ItemStream 의 메서드를 사용할 수 없음
    • JpaPagingItemReader 에서는 ItemStream 의 메서드를 사용

참고

0개의 댓글