본문 바로가기
Etc/문제해결 기록하기

[Spring] Spring Batch 프로그램을 만들면서 생긴 문제

by pplucy 2021. 6. 29.

 

이번에 회사에서 간단한 배치프로그램을 만들게 되었다.

기존에 배치 프로그램을 한 번 정도 수업시간에 만든 적이 있었지만

스스로 해본 경우는 처음이라 기존에 패키지 내에 만들어져있던 클래스의 설정법들을 클론코딩 하게 되었다.

 

내가 만든 단계는

1. 해당 Scheduler 클래스를 스케줄러 패키지에 생성 , @Component 어노테이션 추가

2. 해당 클래스 내에 @Scheduled 어노테이션을 사용해 배치를 돌릴 메소드를 선언

3. 메소드 내에 대용량 처리가 요구되는 작업을 넣고 해당 내역을 남길 수 있도록 Log 추가

4. 해당 스케줄러를 dispatcher-servlet에 <bean>으로 생성하고 task:scheduler, task:executor 선언

 

--- 이 4번에서 문제가 발생하게 된다.

내 배치프로그램에 발생한 문제점은 중복실행이었다.

내가 추가했던 log는 3개에 불과했지만 진행 후에 기록되는 log는 6개였고

해당 메소드 내에 존재하는 for문 때문에 2번 실행되는 줄 알았으나

log 내용을 보면 하나의 배치프로그램이 돌아가고 난 뒤, 또 다른 배치프로그램이 뒤따라서 돌아가는 듯 보였다.

기존에 있는 배치프로그램의 설정들을 똑같이 따라했는데 왜 ? 이런 문제가? (나의 첫 반응)

 

아무튼 정말 어이없게도 가장 기본적인 지식의 문제였다.

애초에 해당 클래스에 @Component 를 선언해주었음에도 불구하고

dispatcher-servlet에 해당 클래스를 또 bean으로 등록했으니,,^^

context scan이 되면서 bean이 2번 선언된 상황..

실제로 해당 <bean>을 없애든 @Component를 없애든 배치는 1번만 돌게 되었고...

결론적으로는 <bean> 생성보다는 @Component로 어노테이션 선언해주는 것이

디폴트로 쓰이는 것 같아서 해당 내역대로 처리했다.

쉽게 생각해보면 정말 응?하게 되는 상황인데 있는 그대로 클론 코딩하려다가 실패 ㅎ

 

가장 기본적인 것이 가장 중요하다!

 

 

 

댓글