문제 해결과 체크리스트
먼저: 규칙이 도는가
./gradlew elcore3 -PlistRules
첫 줄에 룰셋이 보이고([rules] petstore: hexagonal-springboot + … + com.example.rules.PetstoreRules), 우리 규칙 id 가
의도한 target 아래 보이면 연결된 것입니다. 안 보이면 연결 문제, 보이는데 결과가 없으면 target·파일 소유 문제입니다.
증상별
| 증상 | 원인 | 해결 |
|---|---|---|
Rule set class '…' is not on the generator's classpath | rules 의 클래스 이름 오타, 또는 elasticore project(':ps-rules')(jar 면 좌표) 누락 | 이름과 의존성 확인 |
생성 중 NoSuchMethodError, AbstractMethodError | 규칙 모듈의 elasticore-base 버전이 플러그인 버전과 다름 | 두 버전을 같게 (첫 룰셋) |
Rule set '…' cannot be used: it must be a public class implementing CodeRules with a public no-argument constructor | 룰셋 클래스가 public 이 아니거나 인자 없는 생성자가 없음 | public class … 와 기본 생성자 |
… a class it uses is not on the generator's classpath; add it to the rules module's dependencies. | 규칙이 쓰는 라이브러리가 규칙 모듈에 compileOnly 로만 있음 | 그 라이브러리를 implementation 으로 |
| 규칙이 도는데 결과가 없다 | target 이 다름, 또는 그 파일에 어노테이션을 그리는 자리가 없음 | 대상 파일, 테스트에서 render() 를 출력 |
| 필드 규칙이 안 불린다 | 메서드 모양이 (EntitySpec, FieldSpec) 이 아님, 또는 도메인 파일인데 (EntitySpec) | API 레퍼런스 |
merge 대신 ensure 를 썼더니 아무 일도 없다 | 같은 어노테이션이 이미 있음 (@Schema 등) | 속성을 더하려면 merge |
내 파일(PurchaseOrder.java, 컨트롤러)에 반영이 안 된다 | 개발자 파일 - 처음 한 번만 생성 | 생성 로그의 알림대로 직접 붙이기 (대상 파일) |
생성 로그에 SKIP(user-modified; -Pforce to overwrite) | 생성기 파일을 손으로 고침 | 고친 것을 규칙으로 옮기고 -Pforce |
생성 로그에 SKIP(user-owned) | 개발자 파일 | 정상 - 직접 고치기 |
| 새 파일에 빈 줄만 있고 값이 없다 | 채우지 않은 ${빈칸} - 오류가 아니라 빈 줄이 됨 | 테스트에서 unfilledSlots() (대개 이름 오타) |
새 파일이 Kotlin 프로젝트에서 ERROR | kt/<target>.tmpl 이 없음 - Java 로 떨어지지 않음 | 새 파일 만들기 |
env.yml 에 rules: 를 쓰니 헥사고날 파일이 사라졌다 | publisher.rules 는 번들을 대체 | 빌드의 rules = [...] 를 쓰거나 번들 이름도 적기 |
우리 DSL 단어를 틀리게 써도(@pi) 조용하다 | 모르는 단어는 오류가 아니라 보관만 됨 | 중요한 단어는 검사 규칙을 두기 (DSL 단어와 모델 검사) |
규칙 에서 예외가 나서 한 파일만 ERROR | 규칙이 예외를 던짐 | 모델 문제는 ModelCheck.fail 로 |
TypeScript 클라이언트(elcore3ts)에 우리 규칙이 없다 | 의도된 동작 - 팀 규칙은 서버(Java·Kotlin) 생성에만 | TypeScript 용은 publisher.rules.ts 에 따로 |
| 규칙을 고쳤는데 결과가 그대로 | 규칙 모듈이 다시 컴파일되지 않았거나(jar 버전 그대로), 손으로 고친 파일 | jar 면 버전을 올리고 --refresh-dependencies |
새 규칙을 더할 때
- 규칙 id 가 팀 접두사로 시작한다 (
ps-…) - 기본 규칙과 겹치지 않게 - DSL 에 이미 있는 기능이 아니다 - 규칙을 지워 보고 결과가 그대로면 이미 있는 것
- 팀 DSL 단어가 ElastiCORE 단어(
@event,@search,@label…)와 겹치지 않는다 -
target과 메서드 모양이 맞다 - 어노테이션을 문자열로 이어 붙이지 않았다 (
AnnoCode) - 예외를 던지지 않는다 (
ModelCheck) - 새 파일이면: 조건이 안 맞을 때 빈 목록,
orNamespace,v3/·kt/스켈레톤,requireSyntaxAnyOf - 규칙 테스트가 있고
unfilledSlots()가 비어 있다 - 이미 있는 개발자 파일에 필요한 변경을 팀에 알렸다