일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 취업리부트코스
- KPT회고
- 항해99
- TiL
- Python
- 1주일회고
- infcon 2024
- 빈 조회 2개 이상
- spring batch 5.0
- jwt
- jwttoken
- 프로그래머스
- 전략패턴 #StrategyPattern #디자인패턴
- 빈 충돌
- 개발자부트캠프추천
- 인프콘 2024
- 개발자 취업
- 99클럽
- 디자인패턴
- 디자인 패턴
- 프로그래머스 이중우선순위큐
- 단기개발자코스
- 구글 OAuth login
- 파이썬
- @FeignClient
- 커스텀 헤더
- JavaScript
- DesignPattern
- 코딩테스트 준비
- Spring multimodule
- Today
- Total
m1ndy5's coding blog
Ditto Project Spring Batch&Scheduling 2편 - Docker, Jenkins 사용하여 Spring Batch Job 실행하기 본문
Ditto Project Spring Batch&Scheduling 2편 - Docker, Jenkins 사용하여 Spring Batch Job 실행하기
정민됴 2024. 2. 17. 16:56이전 포스팅에서는 cron을 사용하여 batch job을 실행시켰다면, 이번에는 jenkins를 사용하여 batch job을 실행시켜보려고 한다.
그렇다면 jenkins로 batch를 관리했을 때 가질 수 있는 장점이 무엇일까?
Jenkins?
대표적인 CI 툴로 대부분의 경우 배포 용도로 사용된다.
* CI(Continuous Integration, 지속적 통합)이란 뜻으로 애플리케이션의 버그 수정이나 새로운 코드 변경이 주기적으로 빌드 및 테스트 되면서 공유되는 레파지토리에 통합(merge)하는 것을 의미한다.
좀 치는 백엔드 개발자라면 젠킨스에 대해서 이미 어느정도 들어봤을텐데 batch에도 젠킨스를 사용한다고? 라는 의문점이 들 수 있다.
배치를 위한 젠킨스와 서비스를 위한 젠킨스를 분리해서 사용하게 되면 현재 실행중인 스케줄링 작업에 문제가 생기지 않는 배포 구성이 가능해진다.
Spring Batch 관리 도구로써의 Jenkins
1. 기본적인 관리 기능
관리 도구로서 대표 기능이라고 볼 수 있는 대시보드 / 이력관리 / 로그인 / 계정 권한 관리 등이 기본적으로 제공된다.
또한 각 Job 실행별 표준 입출력 역시 대시보드에서 바로 확인할 수 있다.
Job을 실행할 권한, 보기 권한, 설정 권한 등도 계정별 or 그룹별 관리가 가능하다.
2. 통합
여러소프트웨어(Email, Slack, Github, Aws, Docker, Kubernetes 등)과 통합환경을 지원하고 있기 때문에 연동이 편하다.
3. 다양한 Job 실행 환경
실제 수십/수백개의 배치 환경에서 수년간 운영/개선을 하다보면 스케줄링만으로는 다 대응이 안된다.
ex) 별도의 서비스에서 배치를 실행해야만 할 때, 스케줄링으로 실행되던 배치를 수동으로 한번 실행해야 할 때 등
4. Job을 최소 단위로 사용하여 실행 가능
파이프라인으로 Job을 묶어주는 것이 가능하기 때문에 Step이 아닌 Job을 최소 단위로 사용할 수 있습니다.
도커로 Jenkins 설치하기
compose.yml
services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
volumes:
- ./jenkins:/var/jenkins_home
ports:
- "8088:8080"
젠킨스 이미지를 만들어서 docker compose up 명령어를 입력할 때 이미지를 실행시킨다.
localhost:8088로 들어가면 젠킨스의 기본 포트인 8080으로 연결해준다.
새로운 Item을 클릭한 후에 spring-batch라는 이름으로 project를 만든다.
먼저 jenkins 프로젝트의 폴더 위치를 알기 위해
이런 커맨드를 작성하고 apply 하면
이렇게 workspace > spring-batch 가 생기고 그 안에 빌드해놓은 jar 파일을 넣으면 된다.
Setting에 들어가서 Build periodically에 월-금까지 새벽 5시에 실행되게 설정한다.
기존에 만들어 놨던 batch 모듈을 실행시킨다.
Spring Batch
@EnableBatchProcessing
@EnableBatchProcessing을 선언하면 스프링 배치를 작동시켜준다.
BatchAutoConfiguration가 실행되기 때문에 빈으로 등록된 Job을 조회해서 초기화와 동시에 Job을 수행하도록 구성되어있다.
BatchAutoConfiguration
스프링 배치가 초기화될 때 자동으로 실행되는 설정 클래스이다.
Job을 수행하는 JobLauncherApplication 빈을 생성한다.
JobLauncherApplicationRunner은 Job과 JobParameter를 받아서 JobExecution 객체에 넣는 역할을 한다.
그런데 Springboot 3.x.x버전은 @EnableBatchProcess라는 어노테이션이 없고 DefaultBatchConfiguration이 존재하지 않는 경우만 BatchAutoConfiguration이 활성화된다.
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "spring.batch.job", name = "enabled", havingValue = "true", matchIfMissing = true)
public JobLauncherApplicationRunner jobLauncherApplicationRunner(JobLauncher jobLauncher, JobExplorer jobExplorer,
JobRepository jobRepository, BatchProperties properties, Collection<Job> jobs) {
JobLauncherApplicationRunner runner = new JobLauncherApplicationRunner(jobLauncher, jobExplorer, jobRepository);
String jobNames = properties.getJob().getName();
if (StringUtils.hasText(jobNames)) {
if (jobs.stream().map(Job::getName).noneMatch(s -> s.equals(jobNames))){
throw new IllegalArgumentException(jobNames + "는 등록되지 않은 job name입니다. job name을 확인하세요.");
}
runner.setJobName(jobNames);
}
return runner;
}
@ConditionalOnMissingBean -> 동명의 스프링 빈이 없을 시에 현재 등록한 빈을 쓰게끔 함
@ConditionalOnProperty -> Property의 조건에 따라 작동하는 Bean
prefix = "spring.batch.job" name = "enabled" 라고 지정하면 spring.batch.job.enabled라는 프로퍼티가 존재하는 지 확인
JobLauncherApplicationRunner에 jobName을 넣어주는 빈을 등록해주면 완료!
특정 job name을 지정하지 않으면 Bean으로 등록된 모든 Job들이 실행된다.
틀린 부분이 있다면 고쳐주세요!!
참고 : https://jojoldu.tistory.com/489
https://hooneats.tistory.com/33#recentComments
'Toy Projects > Ditto - Discuss Today's Topic' 카테고리의 다른 글
Ditto 프로젝트 동시성 문제 해결하기 2편 - 낙관적 락을 사용해 동시성 해결하기 (feat. Deadlock, DirtyChecking, Retry) (1) | 2024.02.24 |
---|---|
Ditto 프로젝트 동시성 문제 해결하기 1편 - 낙관적 락 VS 비관적 락 (1) | 2024.02.24 |
Ditto Project Spring Batch&Scheduler 1편 - 스프링 배치 5.0, 스케줄러 적용하기 (0) | 2024.02.16 |
Ditto 프로젝트 멀티 모듈 도입 3편 - Gateway 도입하기 (2) | 2024.02.06 |
Ditto 프로젝트 멀티 모듈 도입 2편 - Entity 연관관계 끊기 (0) | 2024.02.06 |