Cloudera CDH/CDP 및 Hadoop EcoSystem, Semantic IoT등의 개발/운영 기술을 정리합니다. gooper@gooper.com로 문의 주세요.
* 참고1 : http://opennaru.tistory.com/32
* 참고2 : http://opennaru.tistory.com/31
Drools 6.0 으로 비즈니스 룰을 정의하여 실제 업무에 유사하게 적용할 수 있는 예제를 작성해 봅니다.
예제는 출장 경비를 산출하는 간단한 애플리케이션입니다.
1. Drools 프로젝트를 진행하기 위해 새로운 maven 프로젝트 생성
Drools 프로젝트를 개발하기 위한 디렉터리는 구조는 아래와 같습니다.
pom.xml 설정
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.gooper</groupId>
<artifactId>droolsTest</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.0.0.CR1</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>6.0.0.CR1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
2. 출장 지급 규정에 대한 룰에 대한 정의 파일인 sample.drl 작성
다음과 같이 출장 기간에 따라 출장 경비 지급 금액이 분류 되어 있습니다.
- 1 일 출장 시간이 4시간 미만의 경우 출장 일비 없음
- 4 시간 이상 8시간 미만의 경우 출장 일비는 8만원
- 8 시간 이상 12시간 미만의 경우 출장 일비는 12 만원
- 12 시간 이상일 때 출장 일비는 20만원
다음은 위에 정의된 출장 일비 지급 규정을 룰로 정리한 것입니다.
package com.gooper.droolsTest
import com.gooper.droolsTest.BusinessTrip;
rule "출장일비 없음"
when
bt:BusinessTrip (hour < 4.0 , name:name )
then
System.out.println ( name + " 님의 출장 시간은 "
+ bt.getHour ( ) + " 시간 이므로 출장일비가 없습니다. ( 규정 : 출장일비 없음 ) " ) ;
end
rule "출장일비 C"
when
bt:BusinessTrip(hour>=4.0,hour<8.0,name:name)
then
System.out.println ( name + " 님의 출장 시간은 "
+ bt.getHour ( ) + " 시간 이므로, 출장일비는 8만원 입니다. ( 규정 : 출장일비 C ) " ) ;
end
rule "출장일비 B"
when
bt:BusinessTrip(hour>=8.0 , hour < 12.0 , name :name)
then
System.out.println ( name + " 님의 출장 시간은 "
+ bt.getHour ( ) + " 시간 이므로, 출장일비는 12만원 입니다. ( 규정 : 출장일비 B ) " ) ;
end
rule "사용자 찾기"
when
bt:BusinessTrip(name == "사용자2", name :name)
then
System.out.println ( "사용자2를 찾았네요 ! ");
end
rule "max값 찾기"
when
bt:BusinessTrip(maxHour : hour)
not BusinessTrip(hour > maxHour)
then
System.out.println ("출장시간이 가장긴 사람은 "+maxHour+"입니다.");
System.out.println("출장시간이 가장긴 사람은 "+bt.getName() + "이며 시간은 "+bt.getHour()+"입니다");
end
* max(hour)값 찾기
when 절에서 "maxHour 보다 큰 값을 가진 BusinessTrip은 없다는 룰" 을 적용한다.
자신의 hour보다 큰 hour(maxHour)를 가지는 BusinessTrip은 존재하지 않는 다는 것을 적용하면 max값을 구할 수 있다.
3. BusinessTrip 클래스 작성하기
룰의 대상이 되는 오브젝트를 자바 클래스로 정의합니다. 이 샘플 프로그램에서 룰의 대상이 되는 것은 "출장"이라는 개념이므로 BusinessTrip 클래스를 다음과 같이 작성합니다.
package com.gooper.droolsTest;
public class BusinessTrip {
private String name;
private double hour ;
public BusinessTrip(String name, double hour){
this. name = name;
this. hour = hour;
}
public String getName(){
return name;
}
public double getHour(){
return hour;
}
}
4. DroolsTest 클래스를 작성
sample.drl 에 정의된 룰을 테스트하기 위한 애플리케이션을 작성합니다.
package com.gooper.droolsTest;
import org.kie.api.KieBase;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
public class DroolsTest {
public static final void main(String[] args) {
try {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
. newKnowledgeBuilder();
kbuilder.add(ResourceFactory. newClassPathResource("sample.drl"),
ResourceType. DRL );
KieBase kiebase = kbuilder.newKnowledgeBase();
KieSession session = kiebase.newKieSession();
session.insert( new BusinessTrip("사용자1" ,3.5));
session.insert( new BusinessTrip("사용자2" ,5.0));
session.insert( new BusinessTrip("사용자3" ,8.0));
session.insert( new BusinessTrip("사용자4" ,10.0));
session.insert( new BusinessTrip("사용자5" ,13.0));
session.fireAllRules();
} catch (Throwable t) {
t.printStackTrace();
}
}
}
5. 출장 경비 지급 규정에 대한 룰 실행 결과
DroolsTest 애플리케이션에 하드 코드로 작성된 각 사용자의 출장 시간을 입력하여 룰 엔진을 통한 결과를 다음과 같이 확인 할 수 있습니다.
사용자4 님의 출장 시간은 10.0 시간 이므로, 출장일비는 12만원 입니다. ( 규정 : 출장일비 B )
사용자3 님의 출장 시간은 8.0 시간 이므로, 출장일비는 12만원 입니다. ( 규정 : 출장일비 B )
사용자2 님의 출장 시간은 5.0 시간 이므로, 출장일비는 8만원 입니다. ( 규정 : 출장일비 C )
사용자2를 찾았네요 !
출장시간이 가장긴 사람은 13.0입니다.
출장시간이 가장긴 사람은 사용자5이며 시간은 13.0입니다
사용자1 님의 출장 시간은 3.5 시간 이므로 출장일비가 없습니다. ( 규정 : 출장일비 없음 )