JBoss EAP & Wildfly

초보자를 위한 룰엔진 프로그램밍

Drools 6.0 룰 엔진에서 선언적 프로그래밍 형태의 간단한 룰 애플리케이션을 작성해 봅니다.
선언적 프로그래밍은 ‘어떻게 해야 하는가’(How to do it) 아닌 무엇을 해야 하는가 ’What to do’에 집중하여 프로그래밍하는 방법입니다.
예를 들자면 “최댓값 구하기”를 절차적 프로그래밍 언어로 구현한다면  루프를 이용하여 값의 집합에서 각 값을 반복적으로 비교하고 최종적으로 최댓값을 구하는 코드로 작성할 것입니다. 
만약 이 문제를 룰 시스템을 이용하여 해결한다면 최댓값은 값의 집합 중에 가장 큰 값이 될 것입니다. 즉 “값의 집합에서 그 값보다 큰 값이 존재하지 않는 값” 이라고 할 수 있습니다.
JBoss Drools

아래의 룰에 선언되어 있는 것처럼 HR 이라는 부서에 height 가 maxheight 보다 큰 값이 존재 하지 않는 것입니다.

when
    memMaxHeight: Member( section == "HR", maxheight : height )
    not Member( section == "HR", height > maxheight)

선언적 프로그래밍은 최댓값이 필요한 경우 위와 같이 최댓값의 정의 그대로 프로그램에 적용하는 것입니다.

1. 샘플 애플리케이션 작성

이제부터 HR 부서에서 가장 키가 큰 사람을 찾아내는 프로그램을 룰 엔진을 이용해 작성합니다.

앞으로 작성하는 프로젝트는 다음과 같은 형태이니 참조합니다.

Drools 샘플 프로젝트 구조

2. pom.xml을 다음과 같이 작성하여 프로젝트 dependency 를 정의

drools 6.0.0.Final 을 기반으로 Eclipse 프로젝트를 생성합니다. 로깅을 위하여 org.slf4j 도 dependency 에 함께 포함합니다.


<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>drools.sample3</groupId>
     <artifactId>drools.sample3</artifactId>
     <version>0.0.1-SNAPSHOT</version>
     <properties>
          <droolsVersion>6.0.0.Final</droolsVersion>
     </properties>
     <dependencies>
          <dependency>
               <groupId>org.drools</groupId>
               <artifactId>drools-compiler</artifactId>
               <version>${droolsVersion}</version>
          </dependency>

          <dependency>
               <groupId>org.slf4j</groupId>
               <artifactId>slf4j-simple</artifactId>
               <version>1.7.2</version>
               <scope>runtime</scope>
          </dependency>
     </dependencies>
</project>

3. 회사의 개별 직원을 나타내는 Member 클래스를 정의


package com.sample;

public class Member {
     private String name;
     private String section;
     private int height;

     public Member(String name, String section, int height) {
          super();
          this.name = name;
          this.section = section;
          this.height = height;
     }

     public String getSection() {
          return section;
     }

     public void setSection(String name) {
          this.section = name;
     }

     public int getHeight() {
          return height;
     }

     public void setHeight(int height) {
          this.height = height;
     }

     public String getName() {
          return name;
     }

     public void setName(String name) {
          this.name = name;
     }

}

4. 마지막으로는 앞서도 간단히 언급한 룰에 대한 정의 파일

sample.drl 의 파일 내용은 다음과 같습니다.


package com.sample

import com.sample.Member;

rule "maxHeight"
  when
    memMaxHeight: Member( section == "HR", maxheight : height )
    not Member( section == "HR", height > maxheight)
  then
    System.out.println("가장 키가 큰 사람의 키는?、"+maxheight+"cm 입니다.");
    System.out.println("가장 키가 큰 사람은 "
         +memMaxHeight.getName()
         +"이며, 키는  "
         +memMaxHeight.getHeight()
         +"cm 입니다.");
end

when 절에서 “maxheight 보다 큰 값을 가진 멤버는 없다는 룰” 이 적용된 결과 입니다.
when 절의 첫 번째 룰은 ‘section ==”HR” 전체 멤버이며, 두 번째 룰은 HR 멤버 중 자신의 키보다 큰 키를 가지는 멤버는 존재하지 않는 다는 것입니다.

5. Java Application 실행 결과는 다음과 같습니다.

앞에서 작성한 룰 애플리케이션은 Java Application 으로 실행하며 결과는 다음과 같이 출력됩니다.


가장 키가 큰 사람의 키는?、172cm 입니다.
가장 키가 큰 사람은 사용자2이며, 키는  172cm 입니다.

Drools 6.0 룰 엔진에서 선언적 프로그래밍 형태로 룰을 사용하는 간단한 샘플을 작성해 보았습니다.

References & Related Links

  • https://www.drools.org/learn/documentation.html

거침없이 배우는 JBoss10점
전준식 엮음/지&선(지앤선)