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

스킬과 레시피

elasticore 스킬은 io.elasticore 플러그인을 쓰는 프로젝트에서, 파일이 //ecd: 줄로 시작할 때, 또는 "ElastiCORE 로" 애플리케이션을 만들어 달라고 할 때 로드됩니다. 원칙은 DSL 이 기준이라는 것입니다 - 애플리케이션이 무엇인지는 YAML 에서 바꾸고, 다시 생성하고, DSL 이 말할 수 없는 것만 생성기가 넘겨준 파일에 손으로 씁니다.

빠른 길​

스킬이 에이전트에게 먼저 시키는 것:

  1. 이미 있는 프로젝트: build.gradle 에 architecture = 'hexagonal' 이나 'ddd' 인 elasticore { } 블록이 있는지 확인합니다.
  2. 새 프로젝트: references/new-project.md - 좌표, Maven Central 의 최신 3.x 를 찾는 법, CI 가 매주 빌드하는 템플릿. 그다음 맞는 레시피를 복사합니다.
  3. DSL 문법: references/quick-reference.md 한 쪽. 거기 없는 것만 긴 가이드에서.
  4. YAML 을 고치고 ./gradlew compileJava(Windows 는 Git Bash 에서도 ./gradlew.bat), 경고를 모두 YAML 에서 고칩니다.
  5. 실행과 확인: references/run-and-check.md - jar 를 백그라운드로, 프로세스 ID 로 종료. 도구의 셸에서 ./gradlew bootRun 은 쓰지 않고, 이름으로 프로세스를 끄지 않습니다.
  6. 컨트롤러, 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-reportgit diff -- src/main/resources/blueprint 에서: 무엇을 저장하는지, 누가 무엇을 하는지, 생명주기, 파생 값, API - 그리고 결정이 필요한 것
/elasticore:review리뷰를 reviewer 에게 넘깁니다. full 일 때만 빌드

변경 보고서의 "결정이 필요한 것" 에 들어가는 예: 넓어진 @access, 지운·이름 바꾼 필드, 좁아진 타입, 지운 상태·이동, 줄어든 @expose, 바뀐 키, 바뀐 @password·@login.