JCF3.0™ Rule Engine Guide - xml rule language

From JCFWiKi

Jump to: navigation, search

그림:check.gif

  • 산출물: JCF3.0™ Rule Engine - xml방식 rule 작성 가이드
  • 작성자: 고경철
  • 작성일 : 2007/12/04
  • 버전 : 0.9
  • 개정이력 :

목차

[편집] rule language

그림:forbidden.gif

[편집] 룰 파일 TAG

  • import
    • 자바의 import와 동일하게 룰 파일 내에서 사용할 클래스를 명시
  • java:functions
    • 룰 파일에서 사용될 함수. 자바의 메소드와 동일하다.
  • rule
    • 하나의 규칙을 표현. 룰을 실행할 때 필요한 파라미터, 실행 조건 그리고 조건 충족시 실행될 코드로 구성된다.
    • 여기서 가장 중요한 태그는 rule 태그이다. rule 태그는 하나의 룰을 표현해주는 태그로서 다음의 3가지로 구성된다.
  • parameter
    • 룰을 실행하는 데 필요한 파라미터 값. identifier 속성을 사용해서 룰에서 사용할 파라미터의 이름을 지정한다.
  • java:condition
    • 룰을 실행하기 위한 조건
  • java:consequence
    • 조건이 충족될 경우 실행될 코드

[편집] 예제

[편집] 인사급여 로직 뽑아내기

그림:forbidden.gif

  • 급여 부분의 수당로직을 몇가지 뽑아냄

[편집] model

  • 이름, 기본급, 근속년수, 결혼유무, 자녀수, 직급, 평가

[편집] Rule#1

  • 근속년수에 따른 근속 수당을 매월 지급
    • 근속년수 1~5년 : 근속년수 * 5000원 - 1000원
    • 근속년수 6~10년 : 근속년수 * 6000원 - 2000원
    • 근속년수 11~15년 : 근속년수 * 7000원 - 3000원
    • 근속년수 16~20년 : 근속년수 * 8000원 - 5000원
    • 근속년수 21년 : 정액 170,000원

[편집] Rule#2

  • 가족수당(결혼 유무 , 자녀수)
    • 배우자 10,000원 자녀1명당 5,000 최대 자녀 3명까지
    • 배우자 없는데 자녀 있는경우 자녀 1명당 10,000 최대 자녀 3명까지

[편집] Rule#3

  • 직급수당
    • 대리 20,000
    • 과장 30,000
    • 차장 40,000
    • 부장 50,000

[편집] Rule#4

  • 평가에 따른 보너스 지급
    • 평가 A : 500,000
    • 평가 B : 400,000
    • 평가 C : 300,000
    • 평가 D : 200,000
    • 직급 차장 이하만 보너스 지급 (부장은 지급 안함)

[편집] xml로 구현된 룰

<?xml version="1.0" encoding="euc-kr" ?>
 
<rule-set name="Hello"
          xmlns="http://drools.org/rules"
          xmlns:java="http://drools.org/semantics/java"
          xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
          xs:schemaLocation="http://drools.org/rules rules.xsd
                             http://drools.org/semantics/java java.xsd">
    
    <import>java.lang.Object</import>
    <import>java.lang.String</import>    
    <import>javacan.drools.test.Employee</import>
 
    <rule name="role">
        <parameter identifier="employee1">
            <class>Employee</class>
        </parameter>
        
        <java:condition>employee1.getYear() >= 1 </java:condition>    
        
        <java:consequence>
        <![CDATA[
        if (employee1.getYear() >= 1 && employee1.getYear() <= 5){          
             employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 5000) - 1000);        
            System.out.println(employee1.getName() +":"+ "Role1-1 적용(근속1등급)" + employee1.getBasicpay());        
              }       
         else if 
             (employee1.getYear() >= 6 && employee1.getYear() <= 10){          
              employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 6000) - 2000);        
             System.out.println(employee1.getName() +":"+ "Role1-2 적용(근속2등급)" + employee1.getBasicpay());        
              }      
         else if 
             (employee1.getYear() >= 11 && employee1.getYear() <= 15){          
              employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 7000) - 3000);        
             System.out.println(employee1.getName() +":"+ "Role1-3 적용(근속3등급)" + employee1.getBasicpay());           
              }      
          else if 
             (employee1.getYear() >= 16 && employee1.getYear() <= 20){          
             employee1.setBasicpay(employee1.getBasicpay() + (employee1.getYear() * 8000) - 5000);        
             System.out.println(employee1.getName() +":"+ "Role1-4 적용(근속4등급)" + employee1.getBasicpay()); 
              }      
          else if 
             (employee1.getYear() == 21){          
             employee1.setBasicpay(employee1.getBasicpay() + 170000);        
            System.out.println(employee1.getName() +":"+ "Role1-5 적용(근속5급)" + employee1.getBasicpay());            
              }    
        ]]>                    
        </java:consequence>
    </rule>
 
    
    <rule name="role-1">
        <parameter identifier="employee1">
            <class>Employee</class>
        </parameter>    
                        
        <java:condition>employee1.getChildren() >= 0</java:condition>    
                                        
        <java:consequence>                
        if (employee1.getMarry().equals("Y")){          
             employee1.setBasicpay(employee1.getBasicpay() + (employee1.getChildren() * 5000));                 
            System.out.println(employee1.getName() +":"+ "(배우자 유 + 자녀)" + employee1.getBasicpay());       
              }       
         else if 
             (employee1.getMarry().equals("N")){          
             employee1.setBasicpay(employee1.getBasicpay() + (employee1.getChildren() * 10000));                 
            System.out.println(employee1.getName() +":"+ "(배우자 무 + 자녀)" + employee1.getBasicpay());          
              }                 
        </java:consequence>
    </rule>
    
    <rule name="rule-2">
        <parameter identifier="employee1">
            <class>Employee</class>
        </parameter>        
                        
        <java:condition>employee1.getMarry().equals("Y")</java:condition>        
                        
        <java:consequence>
         employee1.setBasicpay(employee1.getBasicpay() + 10000);        
         System.out.println(employee1.getName() +":"+ "가족수당-배우자" + employee1.getBasicpay());        
        </java:consequence>
    </rule>
    
    <rule name="Rule3 직급수당">
        <parameter identifier="employee1">
            <class>Employee</class>
        </parameter>        
                        
        <java:condition>employee1.getLevel() >= 1 </java:condition>                
        <java:condition>4 >= employee1.getLevel() </java:condition>    
                    
        <java:consequence>    
        if (employee1.getLevel() ==1){          
              employee1.setBasicpay(employee1.getBasicpay() + 20000);
              System.out.println(employee1.getName() +":"+ "Role2 적용(대리))" + employee1.getBasicpay());         
              }
         else if 
             (employee1.getLevel() == 2){          
              employee1.setBasicpay(employee1.getBasicpay() + 30000);
              System.out.println(employee1.getName() +":"+ "Role2 적용(과장))" + employee1.getBasicpay());
              }              
         else if 
             (employee1.getLevel() == 3){          
              employee1.setBasicpay(employee1.getBasicpay() + 40000);
              System.out.println(employee1.getName() +":"+ "Role2 적용(차장))" + employee1.getBasicpay());
              }
         else if 
             (employee1.getLevel() == 4){          
              employee1.setBasicpay(employee1.getBasicpay() + 50000);
              System.out.println(employee1.getName() +":"+ "Role2 적용(부장))" + employee1.getBasicpay());
              }  
        </java:consequence>
    </rule>
    
    
    <rule name="Rule4 보너스">
            <parameter identifier="employee1">
            <class>Employee</class>
        </parameter>        
                        
        <java:condition>employee1.getPoint() >= 1 </java:condition>                
        <java:condition>4 >= employee1.getPoint() </java:condition>    
        <java:condition>3 >= employee1.getLevel() </java:condition>    
                    
        <java:consequence>    
        if (employee1.getPoint() == 1){          
              employee1.setBasicpay(employee1.getBasicpay() + 500000);
              System.out.println(employee1.getName() +":"+ "보너스(평가 A)" + employee1.getBasicpay());         
              }
         else if 
             (employee1.getPoint() == 2){          
              employee1.setBasicpay(employee1.getBasicpay() + 400000);
              System.out.println(employee1.getName() +":"+ "보너스(평가 B)" + employee1.getBasicpay());
              }              
         else if 
             (employee1.getPoint() == 3){          
              employee1.setBasicpay(employee1.getBasicpay() + 300000);
              System.out.println(employee1.getName() +":"+ "보너스(평가 C)" + employee1.getBasicpay());
              }
         else if 
             (employee1.getPoint() == 4){          
              employee1.setBasicpay(employee1.getBasicpay() + 200000);
              System.out.println(employee1.getName() +":"+ "보너스(평가 D)" + employee1.getBasicpay());
              }          
        </java:consequence>
    </rule>
    
    
    
</rule-set>