YAML, YML 정의
"YAML은 마크업 언어가 아니다 (YAML Ain't Markup Language)” 라는 재귀적인 이름에서 유래된(본래의 뜻은 또 다른 마크업 언어 (Yet Another Markup Language) 이다) YAML은 XML, C, 파이썬, 펄, RFC2822에서 정의된 e-mail 양식에서 개념을 얻어 만들어진 '사람이 쉽게 읽을 수 있는' 데이터 직렬화 양식이다.
Rule을 정의하기 위한 YML 파일 작성
우선 YML 파일을 생성한다. 필자는 Eclipse를 사용하므로, 그에 맞춰 설명하도록 하겠다. Eclipse에서는 기본적으로 yml 확장자를 지원하지 않으므로, File로 생성 후 확장자명을 지정하도록 한다. 아래 이미지를 참조하면 좋을 듯 하다.
이후 생성된 yml 파일에 다음과 같이 rule을 작성하도록 한다.
name: "weather rule"
description: "if it rains then take an umbrella"
condition: "rain == true"
actions:
- "System.out.println(\"It rains, take an umbrella!\");"
YML을 이용한 규칙 생성에 필요한 Component
작성한 yml 파일을 읽어오기 위해서는, class 파일에서 MVELRuleFactory를 정의해줘야 한다. MVELRuleFactory를 정의하기 위해서는 easy rules 사용 [3] MVEL Rule 글과 같이 부가적인 component가 필요하다. 해당 게시물을 참조하여 component를 추가하면 되며, 아래에 필요한 component의 directory 경로 및 파일을 첨부하도록 하겠다.
- easy-rules/easy-rules-mvel/src/main/java/org/jeasy/rules/mvel/
- MVELRuleFactory.java
- easy-rules/easy-rules-support/src/main/java/org/jeasy/rules/support/
- AbstractRuleFactory.java
- RuleDefinition.java
- easy-rules/easy-rules-support/src/main/java/org/jeasy/rules/support/composite/
- ActivationRuleGroup.java
- CompositeRule.java
- ConditionalRuleGroup.java
- UnitRuleGroup.java
- easy-rules/easy-rules-support/src/main/java/org/jeasy/rules/support/reader/
- AbstractRuleDefinitionReader.java
- JsonRuleDefinitionReader.java
- RuleDefinitionReader.java
- YamlRuleDefinitionReader.java
SnakeYAML Maven 추가
YamlRuleDefinitionReader class 파일 내 import 중 SnakeYAML가 존재한다. maven으로 간단하게 추가할 수 있으니 추가하도록 하자.
<!-- Rule Engine / snakeYAML -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.29</version>
</dependency>
YML을 이용한 규칙 생성
메인이 되는 class를 다음과 같이 수정하겠다.
import org.jeasy.rules.api.Facts;
import org.jeasy.rules.api.Rule;
import org.jeasy.rules.api.Rules;
import org.jeasy.rules.api.RulesEngine;
import org.jeasy.rules.core.DefaultRulesEngine;
import org.jeasy.rules.core.RuleBuilder;
import easyRulesTest.controller.MVELRuleFactory;
import easyRulesTest.controller.YamlRuleDefinitionReader;
public class Launcher {
public static void main(String[] args) {
// Local path
String path = "C:\\test\\workspace\\ruleTest\\src\\main\\resources\\rule\\rule.yml";
try {
// facts 정의
Facts facts = new Facts();
facts.put("rain", true);
// rules 정의
MVELRuleFactory ruleFactory = new MVELRuleFactory(new YamlRuleDefinitionReader());
Rule testRule = ruleFactory.createRule(new FileReader(path));
Rules rules = new Rules();
rules.register(testRule);
// rules engine 정의 및 구동
RulesEngine rulesEngine = new DefaultRulesEngine();
rulesEngine.fire(rules, facts);
} catch (IOException e) {
System.out.println("IOException");
e.printStackTrace();
} catch (Exception e) {
System.out.println("Exception");
e.printStackTrace();
}
}
}
필자는 실제로 운영에서 사용하게 되었을 경우 유동적인 절대 경로와 테스트 용도의 절대 경로를 구분하여 사용하였기에, 주석으로 Local path를 적어놓았다. Real path로 사용할 때에는 다음과 같이 사용하면 된다.
// Real path
URL path = GetClassLoader.class.getResource("/rule/rule.yml");
String pathRe = path.toString();
이제 해당 project를 구동하면, 다음과 같은 console 화면을 확인할 수 있다.
yml 파일에 설정한 condition(조건) 및 actions(결과 행동)이 정상적으로 실행되고 있음을 알 수 있다.
[ 출처 ]
YAML, YML 정의 : https://ko.wikipedia.org/wiki/YAML
Easy Rules 사용법 : https://github.com/j-easy/easy-rule
'Java > easy rules' 카테고리의 다른 글
easy rules 사용 [7] MVEL Rule 예시 (0) | 2021.08.23 |
---|---|
easy rules 사용 [6] YML 예시 (0) | 2021.08.23 |
easy rules 사용 [4] jeasy API(Controller 추가 없음) (0) | 2021.08.19 |
easy rules 사용 [3] MVEL Rule (0) | 2021.08.19 |
easy rules 사용 [2] RuleBook (0) | 2021.08.19 |