Community코딩 & 개발github.com

JVM용 Rule Cascade

JVM(Java 17+, Kotlin, Scala)에서 Rule Cascade 규칙을 적용합니다. Spring Boot, Quarkus, Micronaut, Jakarta EE를 지원하며, com.rulescascade:rules-cascade-core를 사용해 규칙을 서비스에 연결하고 Bean Validation이나 수동 검사를 대체하며 규칙 결과를 HTTP 오류에 매핑합니다.

JVM용 Rule Cascade란 무엇인가요?

이 기술은 JVM 기반 애플리케이션에서 Rule Cascade 엔진을 통합하고 사용하는 방법을 설명합니다. Java 17 이상, Kotlin, Scala를 지원하며 Spring Boot, Quarkus, Micronaut, Jakarta EE와 같은 주요 프레임워크에서 동작합니다. 핵심 의존성은 Maven과 Gradle에서 제공되며, 규칙 번들은 빌드 시 `rcas compile --all`로 생성되며 런타임에 YAML을 평가하지 않습니다. `RuleSet`을 싱글톤으로 로드하고 요청별로 `enforce()` 또는 `evaluate()` 메서드를 호출하여 검증하며, 위반 시 `RuleViolationException`을 발생시켜 422 Problem Detail 응답으로 일관되게 매핑합니다. 또한 기존 Bean Validation, Spring Validator, 수동 검사 등을 `rcas analyze`로 분석하고 대체할 수 있으며, 단위 테스트와 CI 파이프라인에서 규칙 검증을 지원합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/YarlisAISolutions/rule-cascade-skills/tree/main/plugins/rules-cascade/skills/rules-cascade-java

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

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 이전)가 필요합니다. 모든 상태 변경 엔드포인트는 다음 네 단계를 따릅니다:

  1. 서버에서 평가: rules.evaluate(EvaluationRequest.builder(entity, operation).data(data).original(original).actor(...).build(), Channel.SERVER). actor는 보안 컨텍스트에서 가져오며, 호출자가 제어하는 헤더에서 가져오지 않습니다.
  2. 거부 시 거절: !result.allowed()인 경우 RuleViolationException(result)를 던지고 @RestControllerAdvice / 예외 매퍼에서 한 번에 type: urn:rule-cascade:rule-violation 및 결과(result.toMap())를 속성으로 포함하는 422 ProblemDetail로 매핑합니다.
  3. 영속화: compute 효과(effect.type()은 value)를 적용한 후 서버의 값을 저장합니다.
  4. 커밋 후 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/

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

관련 스킬