1. 개요

이 기사에서는 가장 널리 사용되는 Java용 규칙 엔진 중 일부를 살펴보겠습니다.

미션 크리티컬 애플리케이션 내에서 소스 코드 내에서 비즈니스 로직을 유지 관리하는 프로세스는 너무 복잡해질 수 있습니다. 비즈니스 규칙은 소스 코드에서 비즈니스 로직을 분리하여 개발 및 유지 관리를 용이하게 하는 데 사용할 수 있습니다.

Java 세계에서 대부분의 규칙 엔진 라이브러리는 Java 규칙 API 엔진 으로 알려진 JSR94 표준을 구현 합니다.

2. 잠꼬대

Drools 는 비즈니스 규칙 관리 시스템(BRMS) 솔루션입니다. Drools는 프로세스, 이벤트 활동, 작업 등의 표준화를 위한 비즈니스 프로세스 관리 도구인 jBPM과 통합할 수 있습니다.

자세한 내용을 보려면 여기 에서 Drools에 대한 소개 와 Spring과의 통합 에 대한 기사를 참조하십시오 .

3. OpenL 태블릿

OpenL Tablets 는 Excel 의사 결정 테이블을 기반으로 하는 비즈니스 규칙 관리 시스템 및 비즈니스 규칙 엔진입니다. 이 프레임워크에서 사용하는 테이블 형식은 비즈니스 사용자에게 친숙하기 때문에 비즈니스 사용자와 개발자 간의 격차를 해소합니다.

다음은 의사결정 테이블이 포함된 Excel 파일을 사용하여 프레임워크가 작동하는 방식에 대한 간단한 예입니다. 먼저 org.openl.coreorg.openl.rules 모듈 에 의존하는 종속 항목을 가져 오겠습니다.

<dependency>
    <groupId>org.openl</groupId>
    <artifactId>org.openl.core</artifactId>
    <version>5.19.4</version>
</dependency>
<dependency>
    <groupId>org.openl.rules</groupId>
    <artifactId>org.openl.rules</artifactId>
    <version>5.19.4</version>
</dependency>

이제 사용자 POJO:

public class User {
    private String name;
    // getters and setters
}

적용된 규칙의 결과를 나타내는 Enum:

public enum Greeting {
    // ...
}

Case 클래스 는 User 개체를 결과로 이어지는 변수로 래핑합니다 .

public class Case {
    // Variables to infer outcomes
    // getters and setters
}

인터페이스 IRule 에는 Excel 파일에서 삽입한 규칙이 포함되어 있습니다.

public interface IRule {
    void helloUser(Case aCase, final Response response);
}

Response 클래스 는 적용된 규칙의 반환을 처리합니다.

public class Response {
    private String result;
    private Map<String, String> map = new HashMap<>();
}

규칙 실행을 트리거하는 기본 클래스:

public class Main {
    private IRule instance;

    public static void main(String[] args) {
        Main rules = new Main();
        // setup user and case here
        rules.process(aCase);
    }

    public void process(Case aCase) {
        EngineFactory<IRule> engineFactory = new RulesEngineFactory<IRule>(
          getClass().getClassLoader()
            .getResource("openltablets/HelloUser.xls"), IRule.class);
        instance = engineFactory.newEngineInstance();
        instance.helloUser(aCase, new Response());
    }
}

4. 쉬운 규칙

Easy Rules는 비즈니스를 정의하는 경량 및 POJO 기반 프레임워크를 제공하는 간단한 Java 규칙 엔진입니다. 복합 패턴을 사용하여 원시 규칙에서 복잡한 규칙을 만들 수 있습니다.

이 프레임워크는 가장 전통적인 규칙 엔진과 달리 XML 파일이나 도메인 특정 언어 파일을 사용하여 응용 프로그램에서 규칙을 분리하지 않습니다. 비즈니스 로직을 애플리케이션에 주입하기 위해 어노테이션 기반 클래스 및 메서드를 사용합니다.

Easy Rules는 개발자가 애플리케이션 자체와 완전히 분리된 비즈니스 논리로 애플리케이션을 만들고 유지 관리하는 데 편리할 수 있습니다. 반면에 이 프레임워크는 JSR94 표준을 구현하지 않기 때문에 비즈니스 로직은 Java 코드로 바로 코딩되어야 합니다.

여기서는 "Hello, world" 예제를 제공합니다. easy-rules-core 모듈 을 기반으로 필수 종속 항목을 가져오겠습니다 .

<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>3.0.0</version>
</dependency>

다음으로 규칙을 정의하는 클래스를 만듭니다.

@Rule(name = "Hello World rule", description = "Always say hello world")
public class HelloWorldRule {

    @Condition
    public boolean when() {
        return true;
    }

    @Action
    public void then() throws Exception {
        System.out.println("hello world");
    }
}

마지막으로 기본 클래스를 만듭니다.

public class Launcher {
    public static void main(String... args) {
        // create facts
        Facts facts = new Facts();

        // create rules
        Rules rules = new Rules();
        rules.register(new HelloWorldRule());

        // create a rules engine and fire rules on known facts
        RulesEngine rulesEngine = new DefaultRulesEngine();
        rulesEngine.fire(rules, facts);
    }
}

5. 룰북

RuleBook은 간단한 BDD 접근 방식을 사용하여 규칙을 정의하기 위해 Java 8 람다와 책임 사슬 패턴을 활용하는 Java 프레임워크입니다.

대부분의 규칙 엔진과 마찬가지로 RuleBook은 규칙에 제공되는 데이터 인 " Facts " 개념을 사용합니다. RuleBook을 사용하면 규칙이 사실의 상태를 수정할 수 있으며, 그런 다음 사슬 아래의 규칙에서 읽고 수정할 수 있습니다. 한 유형의 데이터( Facts )를 읽고 다른 유형의 결과를 출력하는 규칙의 경우 RuleBook에는 Decisions 가 있습니다.

RuleBook은 Java DSL을 사용하여 Spring과 통합될 수 있습니다.

여기에서는 RuleBook을 사용하여 간단한 "Hello, world" 예제를 제공합니다. rulebook-core 모듈 에 의존하는 의존성을 추가해 보겠습니다 .

<dependency>
    <groupId>com.deliveredtechnologies</groupId>
    <artifactId>rulebook-core</artifactId>
    <version>0.6.2</version>
</dependency>

이제 규칙을 만듭니다.

public class HelloWorldRule {
    public RuleBook<Object> defineHelloWorldRules() {
        return RuleBookBuilder
          .create()
            .addRule(rule -> rule.withNoSpecifiedFactType()
              .then(f -> System.out.print("Hello ")))
            .addRule(rule -> rule.withNoSpecifiedFactType()
              .then(f -> System.out.println("World")))
            .build();
    }
}

마지막으로 메인 클래스:

public static void main(String[] args) {
    HelloWorldRule ruleBook = new HelloWorldRule();
    ruleBook
      .defineHelloWorldRules()
      .run(new FactMap<>());
}

6. 결론

이 빠른 기사에서는 비즈니스 논리 추상화를 위한 엔진을 제공하는 잘 알려진 몇 가지 라이브러리에 대해 논의했습니다.

항상 그렇듯이 이 기사의 예제는 GitHub 리포지토리 에서 사용할 수 있습니다 .

Generic footer banner