스킬과 레시피
elasticore 스킬은 io.elasticore 플러그인을 쓰는 프로젝트에서, 파일이 //ecd: 줄로 시작할 때, 또는 "ElastiCORE 로"
애플리케이션을 만들어 달라고 할 때 로드됩니다. 원칙은 DSL 이 기준이라는 것입니다 - 애플리케이션이 무엇인지는
YAML 에서 바꾸고, 다시 생성하고, DSL 이 말할 수 없는 것만 생성기가 넘겨준 파일에 손으로 씁니다.
빠른 길
스킬이 에이전트에게 먼저 시키는 것:
- 이미 있는 프로젝트:
build.gradle에architecture = 'hexagonal'이나'ddd'인elasticore { }블록이 있는지 확인합니다. - 새 프로젝트:
references/new-project.md- 좌표, Maven Central 의 최신 3.x 를 찾는 법, CI 가 매주 빌드하는 템플릿. 그다음 맞는 레시피를 복사합니다. - DSL 문법:
references/quick-reference.md한 쪽. 거기 없는 것만 긴 가이드에서. - YAML 을 고치고
./gradlew compileJava(Windows 는 Git Bash 에서도./gradlew.bat), 경고를 모두 YAML 에서 고칩니다. - 실행과 확인:
references/run-and-check.md- jar 를 백그라운드로, 프로세스 ID 로 종료. 도구의 셸에서./gradlew bootRun은 쓰지 않고, 이름으로 프로세스를 끄지 않습니다. - 컨트롤러, DTO, 리포지터리, 보안, 로그인, 오류 처리기를 손으로 쓰지 않습니다. 추가 규칙은
<Entity>Service.beforeSave에, CRUD 에 없는 연산은 거기의 메서드와 작은 컨트롤러 하나로.
또한 에이전트를 프로젝트 안에 둡니다: 템플릿을 찾으려고 PC 의 다른 저장소를 뒤지지 않고, 자기가 만들지 않은 작업을 버리는 git 명령을 쓰지 않으며, ElastiCORE 는 Maven Central 의 릴리스로만 씁니다 - 프로젝트를 위해 소스에서 빌드하지 않습니다.
레시피
완성된 프로젝트 - DSL, 몇 안 되는 손 코드, 모든 요청과 응답 - 이고, 키트의 계약 테스트가 생성·빌드·기동·호출합니다.
| 레시피 | 도메인 | 이럴 때 |
|---|---|---|
recipe-board.md | 게시글과 댓글 | 검증·검색·페이지가 있는 CRUD |
recipe-library.md | 도서, 회원, 대출 | 규칙이 다른 행을 볼 때(빌려줄 권수가 없음 - 409), 서버가 값을 정할 때, CRUD 말고 연산이 있을 때(대출 반납) |
recipe-shop.md | 회원, 상품, 주문 | 로그인해서 자기 것만 보고, 관리자가 더 많은 일을 하고, 기록이 진행되고(접수·배송·취소), 가격을 남기고 합하고, 데이터를 갖고 시작할 때 |
도서관·상점 레시피는 ElastiCORE 3.0.261021 이상 - Maven Central 에서는 3.0.261022-rc1 이상 - 이 필요합니다(생성되는 로그인, 거절된 이동의 409, 없는 참조의 404,
@readonly, @search(isnull), @pattern, ConflictException). 도서관 레시피의 마지막 절은 3.0.261020 에서 손으로 쓸
것을 말합니다.
상점 레시피의 모델 요약:
Member:
meta: entity @root @editable @expose(20) @signin @owner(memberId) @access(read=owner, create=public, update=owner)
@Index(name="uk_member_login", columnList="login", unique=true) -- member
PurchaseOrder:
meta: entity @root @expose(20) @owner(memberId) @access(read=owner, create=user, cancel=owner)
@event(Shipped(total), Cancelled(total)) @sort(orderId-) -- order
fields:
orderedAt: datetime @readonly @default(now) -- ordered at, set by the server
shipTo: Address @Embedded -- delivery address
card: Card! @Embedded -- payment card
total: money(12.2) @compute(sum(lines.subTotal)) -- the lines added up
lines: List<OrderLine> @OneToMany(mappedBy="order") @dtype(List<OrderLineDTO>) @minsize(1, 'an order needs a line')
states:
status:
initial: PLACED
ship: PLACED -> SHIPPED
cancel: PLACED -> CANCELLED
delete: CANCELLED
그리고 새 Java 파일 세 개와 PurchaseOrderService 에 더하는 메서드 하나: CurrentUser.runAsSystem 안의 시작 데이터, 배송·취소 이벤트의 @EventListener,
ACCESS.require(currentUser, "report") 뒤의 관리자 보고서와 작은 컨트롤러 하나.
빠른 참조
references/quick-reference.md 는 hexagonal·ddd 규칙 엔진의 DSL 을 한 쪽에 담고, 그 예제의 모든 줄을 키트의 CI 가
생성·컴파일·호출합니다:
- 필드와 검사(
string!은""를 거절하지 않고@notblank는 거절;@length(min=),@email,@pattern,@min/@max,@past/@future,@writeonly,@password,@minsize),@Embedded값, 참조와 그 키 필드 이름; - 키, 엔티티 줄,
@expose엔티티의 정확한 API(목록과 검색은POST /search, 수정은 본문에 키,PUT /batch,POST /delete,GET /schema/info); - 누가 무엇을 하는지와 생성되는 로그인; 생명주기와 파생 값; 시각(
@readonly @default(now),@EnableJpaAuditing의 감사 필드); - BI 도구를 위한 지표(
metrics.yml,ossie-export); - 내 로직이 들어갈 곳과 내 파일이 쓰는 런타임 클래스 - 에이전트가 jar 를 열지 않도록;
- 다른 언어의 메시지, 피할 이름, 바꿀 때마다 할 일.
파일 소유권, 생성기, 아키텍처
스킬은 에이전트가 파일을 고치기 전에 첫 줄을 읽게 합니다(//ecd: 는 생성기의 것, // Initially generated by ElastiCORE;
는 내 것). //ecd: 없이 다시 쓰이는 파일(schema.yml, semantic_model.yml, 복사된 가이드, 기본 메시지 파일)과 보존
블록을 더하는 법도 알려 줍니다. 그리고 빌드가 어느 생성기를 쓰는지 확인합니다: elasticore { } 블록이 없으면 2.x
생성기가 @access, @owner, @password, @login, states:, @compute, @snapshot 을 경고 없이 무시하고, Java 의
layered 는 2.x 호환 출력이며, ddd 와 hexagonal 이 모두 강제합니다.
-Pforce 실행, 내 파일 삭제, @access/@owner/@login/@password 변경, 필드 삭제·이름 변경, 아키텍처 변경 전에는
사용자에게 묻습니다.
에이전트와 명령
elasticore:modeler | 모델과 생성기를 찾고, 쓸 구문을 프로젝트의 가이드에서 찾고("가이드에 없는 어노테이션은 없는 것"), 가장 작은 DSL 변경을 하고, 경고와 오류가 없을 때까지 생성·컴파일한 뒤 변경 보고서를 돌려줍니다 |
elasticore:reviewer | 바뀐 파일을 나누고(DSL, 내 것, 생성), 생성 파일의 손 수정을 찾고, DSL 을 가이드와 빌드의 생성기에 대조하고, 누가 권 한을 얻거나 잃는지 설명합니다. 보고만 하고 고치지 않습니다 |
/elasticore:generate | 빌드하고(기본 compileJava, -Pforce 는 쓰지 않음) 어느 생성기가 돌았는지, 요약 줄, 모든 경고, 손댄 파일을 DSL 수정과 함께 설명합니다 |
/elasticore:change-report | git diff -- src/main/resources/blueprint 에서: 무엇을 저장하는지, 누가 무엇을 하는지, 생명주기, 파생 값, API - 그리고 결정이 필요한 것 |
/elasticore:review | 리뷰를 reviewer 에게 넘깁니다. full 일 때만 빌드 |
변경 보고서의 "결정이 필요한 것" 에 들어가는 예: 넓어진 @access, 지운·이름 바꾼 필드, 좁아진 타입, 지운 상태·이동,
줄어든 @expose, 바뀐 키, 바뀐 @password·@login.