계약 테스트와 벤치마크
ElastiCORE 와 보조 맞추기
- 키트는 DSL 문서의 사본을 갖지 않습니다 - 한 쪽짜리 참조와 레시피뿐입니다. 전체 가이드는 생성할 때마다 그 프로젝트가
쓰는 ElastiCORE 버전의 것이
src/main/resources/blueprint/로 복사되고, 스킬이 그 밖의 모든 것을 거기서 찾게 합니다. 프로젝트가 ElastiCORE 를 올리면 Claude 는 새 가이드를 읽습니다. (가이드는 한국어, 키트의 페이지는 영어입니다.) - 키트가 기대는 것은 ElastiCORE 에 대해 테스트합니다.
tests/contract/check.py는 새 프로젝트 템플릿, 작업 예, 2.x 생성기 프로젝트를 Maven Central 의 최신 ElastiCORE 3 릴리스로 빌드하고, 생성·편집·고장·복구·기동해 봅니다. 파일 표시, 두 생성기의 상태 줄과 경고 머리말, 가이드 이름, Gradle 태스크, 기동한 애플리케이션의 응답을 확인하고, 게시판·도서관·상점 레시피를 끝까지 돌려 봅니다(상점의 계약 S1-S12: 가입, 로그인, 권한, 생명주기의 409 ...). 실패하면 더는 맞지 않는 가정과 키트에서 그것을 말하는 곳을 알려 줍니다. - CI 가 변경마다, 그리고 매주 월요일 돌립니다. 키트가 따라가지 못한 ElastiCORE 의 변화가 키트에 커밋이 없어도 드러납니다. 훅 스크립트는 Linux, macOS, Windows 에서, opencode 어댑터는 자체 테스트로 확인합니다.
python3 tests/contract/check.py # PATH 에 JDK 17, Gradle 8.14 이상
ELASTICORE_VERSION=3.0.261015-alpha1 python3 tests/contract/check.py # 특정 릴리스
-SNAPSHOT 으로 끝나는 버전은 로컬 Maven 저장소에서도 찾으므로, publishToMavenLocal 로 올린 ElastiCORE 빌드를 릴리스
전에 확인할 수 있습니다.
벤치마크: 같은 과제, 키트 없이 vs 키트와 함께
benchmarks/library - 에이전트 셋에게 도서 대출 API(13자리 ISBN 도서, 회원, 대출, 빌려줄 권수가 없으면 409, 반납)를 한 번은 그대로, 한 번은 키트와 "ElastiCORE 로 만들어" 를 주었습니다. 실행에 참여하지 않은 별도의 Claude Code 에이전트가 모든 프로젝트를 빌드·기동·호출해 같은 21개 항목으로 채점했습니다. 구성마다 한 번, 작성자들이 직접(2026-10-20/21, Windows PC 한 대, Gradle 빌드 시간 포함, 키트 0.3.0, Codex CLI 0.163.0).
| 에이전트 | 키트 없이 | 키트와 함께 |
|---|---|---|
| Claude Code, Sonnet | 4분 41초, 21 중 20.5 | 2분 18초, 21 중 20.5 |
Codex CLI, gpt-5.6-sol | 7분 13초, 21 중 21 | 3분 45초, 21 중 21 |
opencode, 작은 로컬 모델 (qwen3.8-flash-next-a5b) | 네 번 시도에 최종 보고 없음 (최고: README 없이 21 중 19.5) | 11분 42초, 21 중 21 |
| 실행 | 모델 호출 | 읽은 컨텍스트 | 출력 토큰 | 비용 |
|---|---|---|---|---|
| Claude Code, 없이 | 16 | 657k | 26.0k | $0.48 |
| Claude Code, 함께 | 10 | 437k | 7.5k | $0.26 |
| Codex, 없이 | 29 | 1,000k | 14.6k | (구독) |
| Codex, 함께 | 24 | 859k | 9.5k | (구독) |
키트가 없으면 에이전트가 엔티티, DTO, 리포지터리, 서비스, 컨트롤러, 오류 처리기를 모두 손으로 씁니다. 키트와 함께면 같은 에이전트가 27줄 YAML 하나, 서비스 메서드, 레시피가 주는 컨트롤러 하나를 씁니다.
키트의 도서관 레시피는 1회차 뒤에 이 과제로 쓰였으므로, 키트와 함께한 실행은 과제의 도메인에 맞는 레시피가 있었습니다.
그런 레시피가 없던 첫 실행(키트 0.2.0)은 Claude Code 가 20.5 에 7분 47초 - 키트 없이보다 느렸고 - 레시피가 없는 과제의
숫자입니다. 그 실행이 아직 Java 로 써야 했던 것은 ElastiCORE 의 DSL 추가 다섯 개가 되었습니다(@readonly,
@search(isnull), @pattern('regex', 'message'), 키로 요구하는 필수 참조, ConflictException).
벤치마크: Pet Store
benchmarks/petstore - 키트를 쓴 Claude Code, 세 구성(Java 헥사고날, Java DDD, Kotlin 헥사고날), 별도의 에이전트가 채점. 목적은 점수가 아니라 에이전트가 어디서 DSL 을 벗어나는지 - 찾아본 긴 가이드, 열어 본 jar, 손으로 쓴 Java - 를 보고 거기서 ElastiCORE 나 키트를 고치는 것이었습니다.
| Java 헥사고날 | Java DDD | Kotlin 헥사고날 | |
|---|---|---|---|
| 1회차 - 쇼핑몰 만들기 (24개 항목, 고치기 전) | 23.5, 8분 06초 | 23.5, 8분 40초 | 23.5, 30분 53초 |
| 2회차 - 고친 뒤 | 24, 7분 25초, $0.86 | 23, 8분 49초, $1.01 | 24, 9분 14초 |
| 2단계 - 변경 요청 (20개 항목) | 20, 13분 24초, $1.67 | 19.5, 14분 11초, $2.02 | 20, 13분 58초, $1.77 |
그 때문에 ElastiCORE 와 키트에서 바뀐 것: 생성된 프로젝트 키워 가기.
한계와 팁
- 키트의 페이지는
hexagonal·ddd의 3.0 규칙 엔진용입니다. 2.x 프로젝트에서는 훅만 동작하고 참조와 레시피는 맞지 않습니다. - 훅은 편집 도구와 Bash·PowerShell 의 Gradle 을 봅니다. 스크립트로 한 편집은 막지 못합니다.
- 실패한 명령은 Claude Code 가 처음 10,000자만 넘기므로, 아주 큰 프로젝트에서는 경고가 훅의 시야 밖일 수 있습니다.
- Codex CLI 는 스킬만 받습니다(훅 없음). Windows 의 Codex 와 opencode 에서는 Gradle 데몬을 끄고 빌드합니다
(
--no-daemon또는GRADLE_OPTS=-Dorg.gradle.daemon=false): 아니면 opencode 의 PowerShell 호출이 돌아오지 않고,codex프로세스가 답한 뒤에도 끝나지 않습니다. - 도구의 셸에서
bootRun은 쓰지 않고, 서버는 프로세스 ID 로 끕니다.