easy rules 사용 [10] MVEL Rule 응용(여러 조건 적용 및 변수 return)

이전에 작성한 easy rules 사용 [9] 포스팅의 응용에 대하여 작성해보겠다. MVEL Rule을 사용하면서, 여러 조건을 하나의 Rule에 등록하는 것과, Rule을 거치며 return 하고자하는 변수를 담는 것에 집중하고자 한다.

 


 

MVEL Rule 응용 방식

우선 아래의 소스코드를 확인하자. 필자가 포스팅한 가장 기본적인 형태의 MVEL Rule의 형태이다.

public static void main(String[] args) {
	// facts 정의
	Facts facts = new Facts();
	facts.put("position", true);
	
	// rules 정의
	Rule testMVELRule = new MVELRule()
		.name("MVEL rule")
		.description("MVEL Approval Rule")
		.when("position == true")
		.then("System.out.println('It works!');");
	
	Rules rules = new Rules();
	rules.register(testMVELRule);
	
	// rules engine 정의 및 구동
	RulesEngine rulesEngine = new DefaultRulesEngine();
	rulesEngine.fire(rules, facts);
}

facts를 정의하고, ruels를 정의한 후 등록하고, rules engine을 구동하여 rule 검증을 시도한다. 여러 rule을 검증하고 싶을 때에는, facts 내 검증을 위한 변수의 name 및 value 값을 추가하고. rule을 추가로 정의한 후 rules에 등록하여 사용하였었다.

 

하지만 필자가 이번 포스팅에서 사용할 방법은 다음과 같다. 하얀 부분은 다중 조건을 하나의 rule로 검증하는 방법에 대한 것이고, 검은 부분은 return 값을 설정하는 방법이다.

  • facts 내 검증을 위한 다수의 변수에 대한 name 및 value 값을 추가한다.
  • MVEL Rule의 검증을 위한 조건이 들어가는 when() 부분에 조건을 추가한다.
  • 이 때, when() 부분은 String 값을 parameter로 받으며, 해당 String은 여러 조건을 담을 수 있다.
  • MVEL Rule 검증 시, facts 내의 변수들을 사용한다.
  • when() 부분에서 검증되어 true 판단이 내려졌을 경우, then() 부분의 String 값을 실행한다.
  • when() 부분에서 해당 변수들에 대한 검증을 할 때 facts 내 변수들을 참조하지만, then() 부분에서도 facts 내 변수를 사용할 수 있다.

 


 

실제 예시 1

easy rules 사용 [7] 포스팅의 다중 조건 예시를 변형하도록 하겠다. 소스코드를 다음과 같이 수정해보도록 하자.

/** 기존 rules 정의 소스 **/
// rules 정의
Rule myRule_1 = new MVELRule()
		.name("rule_1")
		.description("rule step 1")
		.priority(1)
		.when("position == true")
		.then("System.out.println(\"position true\");");

Rule myRule_2 = new MVELRule()
		.name("rule_2")
		.description("rule step 2")
		.priority(2)
		.when("authLevel > 3")
		.then("System.out.println(\"authLevel is checked\");");

Rules rules = new Rules();
rules.register(myRule_1);
rules.register(myRule_2);
/** 신규 Rules 정의 소스 **/
// rules 정의
Rule myRule = new MVELRule()
		.name("rule")
		.description("rule step")
		.when("position == true && authLevel > 3")
		.then("System.out.println(\"all process checked !\");");

Rules rules = new Rules();
rules.register(myRule);

검증하고 싶은 rules 두 개가 합쳐진, 변경된 소스를 실행하면 다음과 같은 console 화면을 확인할 수 있다.

 


 

실제 예시 2

다음으로는 값을 return 할 수 있도록 해보겠다. 우선 소스코드를 다음과 같이 수정한다.

public static void main(String[] args) {
	// facts 정의
	Facts facts = new Facts();
	facts.put("position", true);
	facts.put("authLevel", 4);
	facts.put("result", new JSONObject());
	
	// rules 정의
	Rule myRule = new MVELRule()
			.name("rule")
			.description("rule step")
			.when("position == true && authLevel > 3")
			.then("result.put(\"check\", \"It's work\")");
	
	Rules rules = new Rules();
	rules.register(myRule);
	
	// rules engine 정의 및 구동
	RulesEngine rulesEngine = new DefaultRulesEngine();
	rulesEngine.fire(rules, facts);
	
	// 결과값 담은 변수 추출
	JSONObject result = (JSONObject) facts.get("result");
	String check = (String) result.get("check");
	System.out.println("최종 결과 값 : " + check);
}

rule 검증 후, true 로 판단되었을 시 실행되는 then() 구문이 변경된 것을 볼 수 있을 것이다. rules engine 내부적으로 사용되는 변수들이 담긴 facts 내의 JSONObject 형태의 변수에, 추가적인 값을 담도록 하였다.

해당 소스를 실행하게 되면, 다음과 같은 console 화면을 확인할 수 있다.

잘 작동되는 모습을 볼 수 있다. 주의할 점은, 필자는 예제로서 작성하기에 확실한 값을 넣었지만... 결과값을 담은 변수 추출 시, nullPointException 발생에 주의하도록 하자.

728x90