인생마커
Published 2023. 6. 27. 12:34
Cron 해석 라이브러리 Utils

개요

사내 프로젝트에서 MLOps 환경의 모델에 스케줄 잡을 설정하는 부분이 있는데, 여기서 cron 표현식을 사용합니다. 

 

UI 상에서 입력된 cron이 어떤 의미인지 해석하여 보여주었으면 좋겠다는 요청이 있었습니다.


i18n으로 다국어까지 지원해야 하기 때문에 손수 작업을 할 경우 상당히 까다로운 작업이 될 것 같아 검색을 하던 와중 다국어 지원도 되는 해석 라이브러리를 찾아서 소개해드리려 합니다.

 

cRonstrue

cron 해석을 지원하는 자바스크립트 라이브러리입니다.

 

다양한 언어로 지원이 되며, 사용법이 간단합니다.

 

https://github.com/bradymholt/cRonstrue

 

GitHub - bradymholt/cRonstrue: JavaScript library that translates Cron expressions into human readable descriptions

JavaScript library that translates Cron expressions into human readable descriptions - GitHub - bradymholt/cRonstrue: JavaScript library that translates Cron expressions into human readable descrip...

github.com

 

종속되는 패키지는 없으나, 유효성 검사에 대한 옵션도 없습니다.

 

유효성 검사를 해야할 경우 cron-parser 라이브러리를 함께 사용하는 것을 추천하는군요.

 

이 프로젝트에서는 cron-validate라는 cron 유효성에 대한 라이브러리가 이미 설치되어 있었기 때문에 저는 cron-parser 를 사용하지는 않았습니다.

 

사용

아래와 같이 패키지를 설치합니다.

 

npm install cronstrue

 

사용하려는 스크립트에서 import 해줍니다.

import cronstrue from 'cronstrue';

 

유효한 cron 표현식을 cronstrue의 toString 메서드에 첫 번째 매개변수로 전달하면 해석이 반환됩니다.

cronstrue.toString("* * * * *");
> "Every minute"

cronstrue.toString("0 23 ? * MON-FRI");
> "At 11:00 PM, Monday through Friday"

cronstrue.toString("0 23 * * *", { verbose: true });
> "At 11:00 PM, every day"

cronstrue.toString("23 12 * * SUN#2");
> "At 12:23 PM, on the second Sunday of the month"

cronstrue.toString("23 14 * * SUN#2", { use24HourTimeFormat: true });
> "At 14:23, on the second Sunday of the month"

cronstrue.toString("* * * ? * 2-6/2", { dayOfWeekStartIndexZero: false });
> "Every second, every 2 days of the week, Monday through Friday"

cronstrue.toString("* * * 6-8 *", { monthStartIndexZero: true });
> "Every minute, July through September"

 

그리고 두 번째 매개변수에 객체를 전달 할 수 있는데요.

 

객체에서 사용할 수 있는 옵션은 총 6가지 이고 아래와 같습니다.


throwExceptionOnParseError: boolean - 식을 구문 분석하고 설명을 생성하려고 할 때 예외가 발생하면 Exception 메시지를 throw할지 catch하고 설명으로 출력할지 여부. (기본값: 참)
verbose: boolean - 자세한 설명 사용 여부(기본값: false)
dayOfWeekStartIndexZero: boolean - 크론 표현식 DOW를 일요일 또는 월요일로 해석할지 여부 1. (기본값: 참)
monthStartIndexZero: boolean0 - 1월을 또는 로 해석할 Wether 1. (기본값: 거짓)
use24HourTimeFormat: boolean - true인 경우 설명에 24시간제를 사용합니다 (기본값: false이지만 일부 번역은 true로 기본 설정됨).
locale: string - 사용할 로케일(기본값: "en")

다국어를 사용하려면 locale에 관한 i18n 파일을 따로 import 해주어야 합니다.

// ESM / webpack / TypeScript
import cronstrue from 'cronstrue/i18n';

지원되는 로케일의 갯수가 많아 꽤 무거운 파일입니다.

 

때문에 아래와 같이 사용하려는 언어를 골라서 개별 import를 해줄 수도 있습니다.

import 'cronstrue/locales/fr';
import 'cronstrue/locales/es';

 

저는 현재 Angular를 사용하고 있으므로 pipe를 만들어서 사용했습니다.

/**
 * @description cron 표현식을 해석.
 */
@Pipe({
  name: 'convertCron'
})
export class ConvertCronPipe implements PipeTransform {
  constructor(
    private globalService: GlobalService
  ) {
  }
  transform(v: string) {
    if(!v) return '';
    return cronstrue.toString(v, { locale: this.globalService.translation.getCurrentLang(), use24HourTimeFormat: true, verbose: true });
  }
}

 

globalService는 전역 상태로 저장되어 있는 language 값을 가져올 수 있는 프로젝트 내부 서비스 입니다.

 

위 처럼 파이프를 만들어 해석이 필요한 곳에 연결해두면 언어가 바뀔때 locale 프로퍼티 값이 자동으로 변경되어 cron 해석식의 언어에 대응할 수 있습니다.

'Utils' 카테고리의 다른 글

GoJS 메모리 누수(Memory leak)와 성능 개선  (0) 2023.07.24
JSON.stringify 메소드로 깊은 탐색  (0) 2022.09.15
JSON Server  (0) 2022.02.17
profile

인생마커

@Cottonwood__

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!