1. 개요
이 기사에서는 가장 널리 사용되는 Java용 규칙 엔진 중 일부를 살펴보겠습니다.
미션 크리티컬 애플리케이션 내에서 소스 코드 내에서 비즈니스 로직을 유지 관리하는 프로세스는 너무 복잡해질 수 있습니다. 비즈니스 규칙은 소스 코드에서 비즈니스 로직을 분리하여 개발 및 유지 관리를 용이하게 하는 데 사용할 수 있습니다.
Java 세계에서 대부분의 규칙 엔진 라이브러리는 Java 규칙 API 엔진 으로 알려진 JSR94 표준을 구현 합니다.
2. 잠꼬대
Drools 는 비즈니스 규칙 관리 시스템(BRMS) 솔루션입니다. Drools는 프로세스, 이벤트 활동, 작업 등의 표준화를 위한 비즈니스 프로세스 관리 도구인 jBPM과 통합할 수 있습니다.
자세한 내용을 보려면 여기 에서 Drools에 대한 소개 와 Spring과의 통합 에 대한 기사를 참조하십시오 .
3. OpenL 태블릿
OpenL Tablets 는 Excel 의사 결정 테이블을 기반으로 하는 비즈니스 규칙 관리 시스템 및 비즈니스 규칙 엔진입니다. 이 프레임워크에서 사용하는 테이블 형식은 비즈니스 사용자에게 친숙하기 때문에 비즈니스 사용자와 개발자 간의 격차를 해소합니다.
다음은 의사결정 테이블이 포함된 Excel 파일을 사용하여 프레임워크가 작동하는 방식에 대한 간단한 예입니다. 먼저 org.openl.core 및 org.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 리포지토리 에서 사용할 수 있습니다 .