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

ElastiCORE 3.0

오래 운영할 업무 시스템을 위해: 업무 규칙은 YAML 몇 줄로, Spring Boot 코드는 거기서 생성 - 매번 똑같이.

ElastiCORE 는 도메인 모델과 업무 규칙(누가 무엇을 하는지, 주문이 어떻게 진행되는지, 값이 어떻게 정해지는지)을 짧은 DSL 로 받아 Spring Boot 애플리케이션을 생성합니다 - JPA 엔티티, DTO, 서비스, REST API, 권한 검사, 상태 전이, 그리고 화면용 TypeScript 클라이언트까지. 업무 규칙은 개발자나 AI 도구가 고치고 리뷰어가 읽는 한 곳에 남고, 빌드가 그 규칙을 서버의 모든 계층에, ./gradlew elcore3ts 가 TypeScript 클라이언트에 반영합니다.

  blueprint/shop/model/*.yml  ──►  Java  · Kotlin  · TypeScript
(업무 규칙) 레이어드 · DDD · 헥사고날
Spring Boot 3 · Spring Boot 4
+ 우리 팀 규칙 (ruleset)

이런 시스템을 위해 만들었습니다. 주문, 정산, 계약, 백오피스처럼 여러 사람의 손을 거치며 몇 년씩 운영되는 업무 시스템 - 권한과 생명주기가 모든 진입점에서 지켜져야 하는 곳입니다. 화면이 대부분인 애플리케이션, 영속이 관계형이나 JPA 가 아닌 시스템, 선언형 모델로 나타내기 어려운 로직에는 맞지 않습니다.

3.0 은 무엇인가​

규칙 엔진3.0 의 생성은 규칙(ruleset) 으로 조립됩니다. 같은 모델을 레이어드·DDD·헥사고날 코드로, Java 나 Kotlin 으로, Spring Boot 3 이나 4 용으로 읽고, 팀의 규칙을 끼워 넣을 수 있습니다. 규칙 엔진 참고.
번들번들은 규칙 묶음에 이름을 붙인 것입니다: jpa-springboot(2.x 출력), jpa-springboot-v3, ddd-springboot, hexagonal-springboot, 그 Kotlin 판, ts-model. build.gradle 의 두 단어(architecture, language)가 하나를 고릅니다.
옵트인새 동작은 DSL 이나 설정으로 켤 때만 켜집니다. 아무것도 선언하지 않은 프로젝트는 예전과 같은 결과를 얻습니다.
2.x 호환elasticore { } 블록에 architecture·language·rules 를 적지 않은 프로젝트는 2.x 생성기로 생성합니다. 풀 리퀘스트마다 규칙 엔진의 jpa-springboot 출력을 기준 프로젝트에서 2.x 출력과 비교합니다: 2.x 가 만드는 229개 파일 중 224개가 같고, 1개는 import 순서만, 4개는 이력에 적은 2.x 버그 수정만큼 다릅니다.

2.2 이후 새로 생긴 것​

  • 업무 규칙이 그 강제 코드를 생성합니다 - 동작별 권한(@access), 행 소유(@owner), 비밀번호와 로그인 (@password, @login, @signin), 생명주기(states:), 파생 값(@snapshot, @compute), 불변식, 도메인 이벤트. 규칙을 어긴 요청은 정해진 HTTP 응답(401, 403, 404, 409, 422)을 받습니다.
  • 세 가지 아키텍처 - 레이어드, DDD(애그리거트, 잠긴 루트, 이벤트), 헥사고날(인바운드 포트, 리포지터리 포트, 어댑터). 아키텍처 참고.
  • Kotlin 과 TypeScript - 같은 모델을 Kotlin 소스로, 그리고 서버의 검증 문구를 그대로 쓰는 타입 있는 TypeScript 클라이언트로. 언어 참고.
  • Spring Boot 3 에 더해 Spring Boot 4 - 생성기가 Boot 버전을 읽어, 예를 들어 enum 을 Jackson 3 에 맞게 씁니다. Spring Boot 3 과 4 참고.
  • 값 타입 money·quantity, 그리고 timestamp, json, clob, blob.
  • 오류 응답: 모든 거절에 code 가 있는 application/problem+json, 문구는 요청 언어로. API 와 오류 응답 참고.
  • 업무 지표(metrics:)와 BI·AI 도구를 위한 Apache Ossie 시맨틱 모델. 업무 지표, Apache Ossie 참고.
  • 빌드가 지켜 주는 바운디드 컨텍스트(env.yml 의 context:).
  • Maven Central 의 Gradle 플러그인 io.elasticore 와 elcore3·elcore3ts 태스크.
  • Claude Code·opencode·Codex CLI 용 에이전트 키트. AI 와 함께 개발하기 참고.

전체 목록은 릴리스 노트에 있습니다.

한 줄이 모든 계층을 정한다​

pet store 의 Item 한 줄과, 그 줄이 만든 것 (생성된 파일에서 그대로 옮김):

unitCost:  money(10.2)!  @min(0.01, 'price must be positive')  @terms(price, 가격)
어디에생성물
JPA 엔티티@Column(name = "unit_cost", nullable = false, precision = 10, scale = 2) + Money 변환기
요청 DTO (400)@NotNull @DecimalMin(value = "0.01", message = "price must be positive")
TypeScript 검증else if (value.unitCost != null && Number(value.unitCost) < 0.01) errors.unitCost = "price must be positive";
의미 모델 (Ossie)unit_cost 필드, synonyms: ["price", "가격"]

손으로 쓰면 같은 사실을 네 곳에 적어야 하고, 하나를 빠뜨려도 컴파일됩니다.

다음으로​

링크​

소스github.com/xsko/ElastiCORE (Apache License 2.0)
릴리스GitHub 릴리스 · Maven Central
이슈github.com/xsko/ElastiCORE/issues
에이전트 키트github.com/xsko/elasticore-agent-kit
라이브 데모petstore.elasticore.io - 공개 데모의 계정 user / user, 관리자 xsko / xsko (예제를 로컬에서 띄우면 admin / admin). 서버가 다시 시작하면 데이터가 초기화됩니다
현재 상태

3.0 은 릴리스 후보(3.0.261022-rc1)입니다. 이력에 적은 버그 수정과 Spring Boot 4 에서 Jackson 3 에 맞춘 enum 을 빼면 2.x 가 만들던 코드는 그대로입니다. v3 번들(jpa-springboot-v3, DDD, 헥사고날, Kotlin, TypeScript)의 출력은 첫 정식 릴리스 전까지 바뀔 수 있고, 바뀔 때마다 그 이유를 이력에 적습니다. 3.0 은 첫 정식 릴리스부터 3년간 지원합니다.