JVM용 Rule Cascade은(는) 무엇을 하나요?
의존성 (Maven): com.rulescascade:rules-cascade-core (Java 17+, 다른 런타임 의존성 없음, 패키지 com.rulescascade). Gradle: implementation("com.rulescascade:rules-cascade-core:<version>"). 번들은 rcas compile --all로 생성되어 build/rules/에 위치합니다. 런타임에 YAML을 평가하지 말고 규칙을 코드에 복사하지 마십시오.
한 번 로드, 요청마다 평가
import com.rulescascade.*;
// 하나의 빈/싱글톤, 시작 시 생성. 여기서 예외가 발생하면 애플리케이션을 중단해야 합니다.
RuleSet rules = RuleSet.fromBundle((Map<String, Object>) Json.parse(Files.readString(Path.of("build/rules/<ruleset-id>.bundle.json"))));
List<String> missing = rules.missingOperators(); // 규칙에 필요한 사용자 정의 연산자
if (!missing.isEmpty()) throw new IllegalStateException("등록되지 않은 연산자: " + missing);
서비스가 Jackson으로 JSON을 파싱할 때 DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS를 활성화하여 금액이 엔진에 정확하게 전달되도록 하십시오.
rules.enforce(request)를 선호하십시오 (1.0.0-alpha.7부터): 허용된 결과를 반환하거나 com.rulescascade.RuleViolationException을 던집니다. 예외의 problem()은 422 응답으로, 모든 Rule Cascade 런타임에서 동일합니다. 하나의 핸들러가 모든 엔드포인트에 대해 응답합니다:
@RestControllerAdvice
class RuleErrors {
@ExceptionHandler(RuleViolationException.class)
ResponseEntity<Map<String, Object>> denied(RuleViolationException e) {
return ResponseEntity.status(e.status()).contentType(MediaType.APPLICATION_PROBLEM_JSON).body(e.problem());
}
}
컨트롤러 메서드에 어노테이션을 사용하려면 @EnforceRules와 RuleEnforcementAspect를 Spring Boot 예제(https://rulescascade.com/reference/examples/backend-spring-boot/)에서 복사하세요. 이 예제는 spring-boot-starter-aspectj (spring-boot-starter-aop for Spring Boot 4 이전)가 필요합니다. 모든 상태 변경 엔드포인트는 다음 네 단계를 따릅니다:
- 서버에서 평가:
rules.evaluate(EvaluationRequest.builder(entity, operation).data(data).original(original).actor(...).build(), Channel.SERVER). actor는 보안 컨텍스트에서 가져오며, 호출자가 제어하는 헤더에서 가져오지 않습니다. - 거부 시 거절:
!result.allowed()인 경우RuleViolationException(result)를 던지고@RestControllerAdvice/ 예외 매퍼에서 한 번에type: urn:rule-cascade:rule-violation및 결과(result.toMap())를 속성으로 포함하는 422ProblemDetail로 매핑합니다. - 영속화:
compute효과(effect.type()은value)를 적용한 후 서버의 값을 저장합니다. - 커밋 후
result.commands()실행: (@TransactionalEventListener(phase = AFTER_COMMIT)또는 outbox 사용)idempotencyKey당 한 번.
배치: Spring은 RuleSet @Bean과 엔티티별로 요청을 구성하는 서비스를 가진 @Configuration 클래스; Quarkus/Micronaut는 @Singleton 프로듀서. Kotlin과 Scala도 동일한 API를 호출합니다. RuleSetHolder는 일정 간격 또는 cron 스케줄로 번들을 다시 로드하고 마지막으로 유효한 규칙을 유지합니다.
기존 검증 대체
rcas analyze --module <module>은 Bean Validation 어노테이션, Spring Validator 및 @PreAuthorize, Drools .drl 규칙, 수동 검사, 명명된 한도(MAX_QUANTITY = 10), 숫자 비교 및 상태에 대한 switch 분기를 나열합니다. drift가 있는 후보는 같은 이름이 프론트엔드에서 다른 값을 가짐을 의미합니다: 하나의 규칙 집합이 이를 결정해야 합니다. DTO에 @NotNull/@Size 유형 검사는 원하면 유지하고, 비즈니스 결정은 규칙으로 옮기십시오. 이전 검사와 엔진 모두에 대해 동일한 입력으로 패리티 테스트(JUnit @ParameterizedTest)를 추가한 다음 이전 검사를 삭제하십시오.
테스트
메시지 텍스트가 아닌 decision 및 찾기 코드를 단언하십시오. 규칙 집합의 골든 테스트(rcas check)는 규칙을 테스트하고, CI는 mvn verify / gradle test 전에 rcas check 및 rcas compile --all을 실행합니다.
참고: https://rulescascade.com/usage/java/ 및 https://rulescascade.com/playbooks/backend-api/