1. Spring batch를 사용해서 Job과 Step을 만들고, Tasklet을 수행하게 만들기
- Job 만들기
JobConfiguration을 만들어 job과 step을 bean으로 만들어주도록 하겠습니다
Bean을 관리하는 Configuration이니 @Configuration을 붙여주저야겠죠?

JobBuilder를 통해 Job을 만들어주도록 합니다.
해당 Job의 이름은 getStockInfo2입니다. 이 이름들은 jobRepository에 의해 관리됩니다.
이 repository를 통해 job의 이름들도 관리되고, 중복 실행도 방지되는 등의 역할을 하게 되는 듯 합니다.
start에는 해당 job이 처음으로 실행할 step을 넣어주고 build하여 반환해줍니다.
- Step 만들기

이번엔 step입니다.
Job과 마찬가지로 StepBuilder를 통해 만들고, jobRepository로 관리합니다.
해당 step은 tasklet을 수행하게 됩니다.
tasklet은 Transactional하게 관리되어야 합니다. 그렇기에 transactionManager도 넣어줍니다.
- Tasklet 만들기

Step은 Tasklet을 수행합니다.
이 Tasklet을 구현한 구현체에 execute 메서드를 오버라이딩 해주면 이 메서드가 실행되게 됩니다.
return 으로 RepeatStatus.FINISHED를 반환하면 해당 Step은 일을 끝마치게 됩니다.
RepeatStatus.CONTINUABLE을 사용하게 되면 execute가 계속해서 실행되고, execute안에 if문을 사용하여 특정 지점까지 로직을 수행한 뒤 FINISHED하게 만들 수도 있습니다.

이후에 @Component를 하나 만들고 @EnableScheduling 어노테이션을 붙이면 Scheduled를 이용하여 특정 시점에 해당 Job을 실행시키게 만들 수 있습니다.
Job은 중복해서 실행이 불가능하므로, LocalDateTime.now를 이용해 Parameter를 계속해서 바꿔주었습니다.
Parameter가 달라지면 같은 JobName이더라도 중복해서 실행이 가능하게 됩니다.
이렇게 cron으로 1분 단위로 runJob을 실행시키거거나 매일 아침 6시에 해당 Job이 실행되게 만들 수도 있습니다.
하지만 이 Tasklet은 Transactional하게 관리가 된다고 하였습니다.
즉, 10000개의 데이터를 넣는 작업을 할 경우 해당 tasklet을 진행하던 도중 9999번째에서 에러가 나게 되면 이전의 모든 데이터는 유실되게 됩니다.
해당 문제를 해결하기 위해 같은 로직이라 하더라도 chunk로 단위를 쪼개어 실행하는 것이 일반적이라고 합니다.
하지만, 저희는 50개의 종목 데이터만 받아올 것이기 때문에 간단하게 batch를 돌려보았습니다.
'주식자동매매프로젝트' 카테고리의 다른 글
4. Python No module named 에러 - venv를 만들었는데도 모듈을 못찾는다? (0) | 2023.11.07 |
---|---|
3. Redis로 실시간 데이터 확인 빠르게 하기 (1) | 2023.10.31 |
1. 자바 스프링에서 클라이언트로 한국투자증권API 웹소켓 열기 (0) | 2023.10.26 |