팀 규칙(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 또는 규칙 |