Notice
Recent Posts
Recent Comments
Link
반응형
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

David의 블로그

[Spring Boot] 대량의 데이터를 한번에 처리하는 Spring Batch. 두번째 본문

프로그래밍/Spring Boot

[Spring Boot] 대량의 데이터를 한번에 처리하는 Spring Batch. 두번째

David 리 2025. 4. 15. 22:10
반응형

2025.04.15 - [프로그래밍/Spring Boot] - [Spring Boot] 대량의 데이터를 한번에 처리하는 Spring Batch. 첫번째

 

[Spring Boot] 대량의 데이터를 한번에 처리하는 Spring Batch. 첫번째

"Spring Batch"는 대량의 데이터를 효율적으로 처리하기 위한 프레임워크로, 주로 반복적이고 주기적인 작업을 수행하는데사용됩니다. 이 프레임워크는 스프링 프레임워크를 기반으로 하며, 다양

78alswo.tistory.com

이전에는 Spring Batch를 쓰기 위해서 gradle에 라이브러리 추가와

버전을 알아보면서, Batch의 개념을 알아보았다.

 

 

 

이번에는 소스를 구현하면서 진행해 보도록 하겠다.

 

먼저, 프로젝트를 실행하면 Batch 자동실행을 막기위해서 application.properties파일에 아래처럼 추가한다.

```application.properties```

1
2
# 배치 자동 실행 방지
spring.batch.job.enabled=false
cs

 

 

 

그리고 스케줄링 기능을 활성화해주기 위해서

@EnableScheduling 어노테이션을 

SpringBootApplication 클래스에다가 추가한다.

```yourSpringBootApplication.java```

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableScheduling
public class yourSpringBootApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(yourSpringBootApplication.class, args);
    }
 
}
cs

 

이 어노테이션을 사용하면 Spring의 스케줄링 기능을 통해 정기적으로 특정 작업을 수행할 수 있다.

 

 

 

다음은 스케줄링 설정 파일을 만든다.

```FirstSchedule.java```

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@Configuration
@Slf4j
public class FirstSchedule {
 
    private final JobLauncher jobLauncher;
    
    public FirstSchedule(JobLauncher jobLauncher) {
        this.jobLauncher = jobLauncher;
    }
    
    @Autowired
    private Job batchMstCRUDJob;
    
    @Autowired
    private Job requestCrawlerJob;
    
    @Scheduled(cron = "* * 18 * * *", zone = "Asia/Seoul")
    public void runFirstJob() throws Exception {
        
        
         // 현재 날짜와 시간 가져오기
        LocalDateTime now = LocalDateTime.now();
        // 포맷 정의
        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        
        String todayDate = now.format(dateFormat);
        
        JobParameters jobParameters = new JobParametersBuilder()
                .addString("date", todayDate)
                .toJobParameters();
        
        // requestCrawler Job 실행
        JobExecution requestCrawlerExecution = jobLauncher.run(requestCrawlerJob, jobParameters);
 
        // requestCrawler Job이 성공적으로 완료되었는지 확인
        if (requestCrawlerExecution.getStatus().isUnsuccessful()) {
            // 실패한 경우 로그를 남기거나 예외 처리
            log.info("requestCrawlerJob 실행 실패: {}", requestCrawlerExecution.getAllFailureExceptions());
//            System.out.println("requestCrawlerJob 실행 실패: " + requestCrawlerExecution.getAllFailureExceptions());
            return// 첫 번째 Job을 실행하지 않음
        }
 
        // firstJob 실행
        JobExecution firstJobExecution = jobLauncher.run(batchMstCRUDJob, jobParameters);
        log.info("batchMstCRUDJob 실행 완료: {}", firstJobExecution.getStatus());
//        System.out.println("batchMstCRUDJob 실행 완료: " + firstJobExecution.getStatus());
    }
}
cs

 

5번 줄의 JobLauncher 인스턴스는 33, 44번 줄처럼 설정한 Job을 실행한다.

12, 15번줄은 Job으로 설정한 인스턴스다.

17번줄은 해당 Batch작업을(크론표현식 매일 18시) 실행하도록 설정했다.

29, 30번줄은 todayDate라는 현재날짜시간을 String값으로 넣었는데, 이는 Batch가 실행하면서 중복을 방지하기 위해

변수를 넣었다.

 

그리고 36 ~ 40번은 필자는 Job2개 등록을 했는데,

행여나 비동기식으로 batchMstCRUDJob 종료가 안됐는데,

다음 Job이 실행되는 오류를 막기위해 구현한 소스다.

따라서 

batchMstCRUDJob가 먼저 실행이되고 종료가 됐다고 판단되면

requestCrawlerJob을 실행하는 것이다.

 

아래는 Spring Batch 모식도다.

알고 넘어가야할것이

JobLauncher는 정의된 Job을 실행하는 역할을 한다.

Job은 Spring Batch를 실행하는 작업 단위를 말한다.

 

Job은 Step으로 이루어져있고, Step은 대량의 데이터를 Read/Processor/Write

즉, 읽고/처리하고/쓰는 작업으로 이루어져있다.

 

 

이렇게 스케줄러 설정 파일 만드는 방법과

Batch자동 실행 방지, Batch 모식도를 알아보았다.

다음 시간에 마지막 Batch소스 설정파일을 만들어 마무리 짓도록 하겠다.

 

유익했으면 공감과 좋아요. 댓글 부탁드립니다!

반응형