📖 그 주의 주말에 업데이트가 완료됩니다. [학습에 따라 더 수정할 예정입니다!]
@ConfigurationProperties를 통해 Batch의 Quartz 스케줄링 속성을 설정하며 이에 대해 간략하게 정리하고자 진행하였다.
@ConfigurationProperties
어노테이션은,
Spring Boot가 외부 설정에 정의된 속성에 대해 쉽게 사용할 수 있도록 제공해주는 어노테이션으로,
.properties
, .yml
파일에 있는 property를 자바 클래스에 값을 가져와서(바인딩) 사용할 수 있게 해주는 어노테이션이다.
이를 만약 class 파일을 생성해서 관리를 하게 된다면, @Component로 bean을 등록하고 @ConfigurationProperties에 prifix를 설정한다. (단, 예제는 spring boot 2.2이후에 해당된다.)
만약 해당 어노테이션 안에서 외부의 속성을 검증하고 싶다면 다음과 같은 어노테이션을 필드에 선언해주면 된다.
@NotBlank
: 필수 속성 지정@Length()
: 속성 길이 설정@Min, Max()
: min~max 제한@Pattern()
: 이메일 주소와 같이 형식 일치 속성 부여당연히 해당 어노테이션에도 장,단점이 존재한다.
@Value
를 사용해야 한다.예제
만약 다음과 같은 application.yml 파일이 있다면
job: job-chunk-property: cron: 0 0/30 * * * ? // quartz 실행주기: 매 30분마다 실행 commitInterval: 1000 // chunk size: 1000 설정
property class를 작성한다고 했을 때는 다음과 같다.
@Data @Component @Validated // 프로퍼티 값 유효성 검사 @ConfigurationProperties(prefix = "job.job-chunk-property") public class jobProperties { @NotBlank private String cron; @Min(value=1) @Max(value=1000) private String commitInterval; }
이후 chunk 메소드에서 chunkSize를 지정할 때는 위의 jobProperties를 통해 지정해주면 된다.
private final JobProperties property; //JobConfig에 선언 @Bean(STEP_NAME) @JobScope public Step step() { return stepBuilderFactory.get(STEP_NAME) .<~,~>chunk(property.getCommitInterval()) .reader(ItemReader) .processor(ItemProcessor) .writer(ItemWriter) .build(); }
Commit-Interval ?
이때 commitInterval은 Spring Batch Job 설정 시 트랜잭션 커밋(commit)이 호출되기 전 처리되어야 하는 아이템들의 개수이다.
스프링 배치는 reader가 읽고나서 processor가 처리한 갯수가, chunkSize 만큼 쌓이면 writer에 item들을 보내서 write하게 된다.
이때, Step 선언시 우리가 작성해주는 chunk메소드의.<~,~>chunk(chunkSize)
chunkSize가 곧 commit-interval 값이다.
Job의 스케쥴링을 지정해주는 과정에서, Cron 표현식은 CronTrigger 인스턴스를 설정하는데 사용된다.
Quartz Cron 표현 식은 공백으로 구분되는 6~7개의 필드로 구성된 문자열이다.
각 단위는 스케줄을 세분화하여 기술되어있는데 왼쪽부터 오른쪽까지 한 칸씩 순서대로 의미한다. (단, 연도는 optional이다.)
cron : 초 분 시 일 월 요일 연도 : 0 0 0 * * * ? *
*
: 매번 (매분, 매시,.. )?
: 설정 값 없음. 해당 필드에 조건이 없다. (일, 요일 에만 해당)-
: 일련의 범위 (10-12 = 10~12),
: 값 나열/
: 값 증가 (0/15 = 0초부터 15분 마다)#
: k#N - N번째 k요일 (요일 해당)L
: 마지막 의미. (일, 요일 에만 해당)W
: 가장 가까운 평일 (Weekday)C
: 5C (Calendar에 의해 허용되는 5번째 일자)예제
0 0 0 * * ? * // 매일 0시 정각에 실행 0 0 12 * * ? // 매일 12시 정각에 실행 * 0,30 * * * ? * //매시 정각 및 30분 실행 0 59 23 ? * * // 매일 22시 59분에 실행 0 59 23 * * ?` // 매일 22시 59분에 실행 0 59 23 * * ? *` // 매일 22시 59분에 실행 0 0/30 12-13 * * ?` // 매일 12시~13시에 30분 간격으로 수행 (12:00, 12:30, 13:00, 13:30) 0 0 0/3 * * ? *` // 매일 0시부터 3시간 간격으로 수행
주말까지 작성될 부분입니다.
Batch에서 관련된 것들을 대충 이해만 하고, 정리하지 못했어서 WIL에 관련된 것들을 적어보고자 했다.
모든 포스팅들이 뭔가 계속 아쉬워서 마무리를 못지었더니 계속 비공개 상태 로 돌려놓고 있는데 이번주 주말에는 다시 정리해본 후 공개로 돌려야겠다~!😂
추가적으로, JPA에 대해서 다시 한번 쓱- 훑어보고 있는데 역시나 까먹은 것들이 많더라.. 이번 기회에 디버깅까지 다 확인해보고 캡쳐해서 이전 포스팅들을 수정해야겠다!💥
[참조]
https://velog.io/@max9106/Spring-Boot-%EC%99%B8%EB%B6%80%EC%84%A4%EC%A0%95-4xk69h8o50
https://brush-up.github.io/java/java-ConfigurationProperties/ - ConfigurationProperties
https://sheerheart.tistory.com/entry/Spring-Batch-commitinterval%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC
https://backtony.github.io/spring/2022-01-24-spring-batch-6/ - commitinterval
https://velog.io/@nooyji/Spring-boot-Quartz-Scheduler-Cron-Expression-정리-Scheduler-개발을-위한-Cron-표현식
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=estern&logNo=110010101624 - cron