Weekly I Learned (2월 2주차)

YEON·2023년 2월 6일
0

Weekly I Learned (2023)

목록 보기
2/3
post-custom-banner
📖 그 주의 주말에 업데이트가 완료됩니다. [학습에 따라 더 수정할 예정입니다!]

1. @ConfigurationProperties (feat. Batch)

@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 어노테이션을 사용하여 property 값을 사용하는 것보다 매핑을 유연하게 할 수 있다.
  • 단점: SpEL를 사용할 수 없기 때문에, SpEL를 사용할 때에는 @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 값이다.




2. Quartz Cron 표기법

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시간 간격으로 수행




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

profile
- 👩🏻‍💻
post-custom-banner

0개의 댓글