본문으로 건너뛰기
ElastiCORE 3.0 은 릴리스 후보(RC)입니다: Maven Central 의 3.0.261022-rc1. 2.2 라인 프로젝트는 2.2 문서를 보세요.
버전: 3.0

팀 규칙(ruleset) 개요

회사·팀마다 생성된 코드에 원하는 것이 있습니다.

  • "모든 애그리거트 루트에 우리 어노테이션을"
  • "개인정보 필드는 응답 JSON 에 나가면 안 된다"
  • "LIKE 검색은 두 글자 이상"
  • "이벤트를 내는 루트는 토픽 이름을 꼭 적는다 - 안 적으면 빌드 실패"
  • "이벤트마다 메시지 토픽 상수 클래스를 만들어 달라"

생성된 파일을 손으로 고치면 다음 생성 때 사라지거나(생성기 파일), 엔티티마다 반복해야 합니다. 대신 규칙을 한 번 쓰면, 생성할 때마다 모든 도메인·모든 엔티티에 적용됩니다. 규칙은 평범한 Java 클래스이고 메서드 하나가 규칙 하나입니다. ElastiCORE 자신의 Java·Kotlin·DDD·헥사고날 생성도 모두 같은 방식의 규칙입니다 - 팀 규칙은 그 뒤에 하나 더 붙는 것뿐입니다.

ps-rules/src/main/java/com/example/rules/PetstoreRules.java
public class PetstoreRules implements CodeRules {

/** A field marked @pii in the DSL is accepted in requests but never sent back. */
@Rule(value = "ps-pii", target = "dto")
void pii(EntitySpec dto, FieldSpec field) {
if (field.hasDsl("pii")) {
ctx(dto).field(field).ensure(AnnoCode.of("com.fasterxml.jackson.annotation.JsonProperty")
.valRaw("access", "JsonProperty.Access.WRITE_ONLY"));
}
}
}
blueprint/petstore/model/entity.yml
      email:       string(100) @email @pii     # 우리 팀의 DSL 단어
build.gradle
elasticore { rules = ['com.example.rules.PetstoreRules'] }    // 번들 뒤에 더해짐
dependencies { elasticore project(':ps-rules') } // 생성기 클래스패스

언제 규칙을 쓰나​

상황어떻게
엔티티 하나, 필드 하나의 일DSL 에 이미 있는지 먼저 - DSL 레퍼런스
한 엔티티의 업무 로직개발자 파일에 손으로 - 업무 로직 넣기
모든 엔티티·필드·DTO 에 같은 것을, 팀 표준으로규칙
팀만의 DSL 단어(@pii, @topic)규칙이 읽음
모델이 팀 규칙을 어기면 빌드를 막기규칙 (ModelCheck)
ElastiCORE 가 만들지 않는 파일을 모델에서규칙 + 스켈레톤 (새 target)
ElastiCORE 가 만드는 것 중 일부를 빼기suppress 또는 규칙

어떻게 동작하나​

./gradlew build 는 컴파일 전에 생성(elcore3)을 먼저 돌립니다. 팀 규칙은 그 안에서, 파일 하나를 만들 때마다 ElastiCORE 기본 규칙 뒤에 돕니다.

entity.yml ─▶ ① YAML 읽기 ─▶ ② 만들 파일 정하기 ─▶ ③ 기본 규칙 ─▶ ④ 팀 규칙 ─▶ ⑤ .java 쓰기 ─▶ ⑥ 컴파일
env.yml (Spec) Customer.java @Entity, PetstoreRules
CustomerDTO.java … @Column …
  • ③④ 는 파일마다 반복됩니다. Customer.java 를 만들 때 한 번, CustomerDTO.java 를 만들 때 또 한 번.
  • ④ 는 항상 ③ 뒤라서, 기본 규칙이 붙인 것을 빼거나 그 위에 더할 수 있습니다.
  • 규칙은 파일을 직접 쓰지 않습니다. "이 클래스에 이 어노테이션", "이 빈칸에 이 값" 을 말하면 import 정리와 파일 쓰기는 생성기가 합니다. 그래서 같은 규칙이 Java 와 Kotlin 에 모두 적용되고, 여러 규칙이 한 파일에 함께 기여합니다.

모든 규칙은 같은 모양입니다: 읽고(EntitySpec, FieldSpec - YAML 그대로), 판단하고(평범한 if), 쓴다(ctx(entity) - 지금 만드는 파일).

YAML규칙에서 읽으면
Customer:entity.getName() → "Customer"
meta: entity @root @expose(20)entity.aggregateRoot() → true, entity.metaValue("expose") → "20"
email: string(100) @email @piifield.name() → "email", field.hasDsl("pii") → true
name: string(30)! @search(like)field.required() → true, field.dslValue("search") → "like"

무엇을 할 수 있나​

할 수 있는 것API문서
클래스·필드·메서드에 어노테이션 붙이기·빼기·속성 더하기ensureClassAnnotation, field(f).ensure/merge/removeAnnotation, method(n).ensure어노테이션과 메서드
클래스에 메서드 더하기, 엔드포인트 빼기addMethod, excludeMethod어노테이션과 메서드
팀만의 DSL 단어hasDsl, dslValue, hasMeta, metaValueDSL 단어와 모델 검사
경고·빌드 실패, 팀 설정값ModelCheck.warn/fail, config("…")DSL 단어와 모델 검사
DTO·검색·SQL·외부 연동·enum 파일target = "dto" …대상 파일
새 파일 만들기ArtifactContributor, 스켈레톤 .tmpl새 파일 만들기
기본 규칙 끄기, 도메인마다 번들suppress, publisher.rules끄기와 번들
규칙만 빠르게 테스트RuleEngine.run(...).render()테스트
여러 프로젝트에서 같은 룰셋jar 로 배포배포와 공유

순서대로 읽기​

  1. 첫 룰셋 만들기 - 펫스토어에 규칙 모듈을 붙이고 첫 규칙이 생성 결과를 바꾸는 것까지
  2. 어노테이션과 메서드
  3. DSL 단어와 모델 검사
  4. 대상 파일
  5. 새 파일 만들기
  6. 기본 규칙 끄기와 번들 고르기
  7. 테스트
  8. 배포와 공유
  9. API 레퍼런스, 문제 해결

이 문서의 예제는 모두 펫스토어 프로젝트에 ElastiCORE 3.0.261022-rc1 로 실제 빌드·실행해 확인한 것입니다.