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

릴리스 노트

모든 변경과 그 이유, 확인한 것, 관련 파일은 elasticore-history.md 에 있습니다 - 저장소와 모든 프로젝트의 blueprint/ 폴더에. 릴리스: GitHub 릴리스 · Maven Central.

버전은 {major}.{minor}.{YYMMDD} 이고, 사전 릴리스는 -alpha{n}, -beta{n}, -rc{n} 이 붙어 같은 줄의 릴리스보다 앞에 정렬됩니다.

3.0.261022-rc1 - 릴리스 후보​

에이전트에게 같은 요구사항(도서·회원·대출 API), 이어서 Pet Store 를 ElastiCORE 로 만들게 하고, Java 를 손으로 쓴 곳을 모두 살폈습니다. 이 릴리스는 그 자리를 DSL 로 메웁니다. 새 문법을 쓰지 않는 프로젝트의 출력은 바뀌지 않고, 2.x 생성기와 2.x 호환 jpa-springboot 번들도 그대로입니다(elcoreRulesCheck -Pstrict 150 MATCH / 0 DIFF / 2 ACCEPTED, elcoreTreeCheck 0 differ / 0 missing / 0 extra).

DSL 의 새 기능​

  • @readonly / @noinput 은 서버가 정하는 값 - v3 번들에서 매퍼가 DTO 에서 엔티티로 쓰지 않고, DTO 의 @NotNull/@NotBlank 를 빼고, @Schema 에 READ_ONLY 를 적습니다. 동작 변경: 그런 값을 DTO 에 넣어 저장하던 코드는 엔티티에 넣어야 합니다(beforeSave).
  • @search(isnull) - 검색 속성 <필드>Empty: Boolean: true 는 빈 행, false 는 값이 있는 행 (Java, Kotlin, TypeScript).
  • @pattern('정규식', '메시지') - 컴파일되는 @Pattern, @min 처럼 값 다음에 메시지, TypeScript 클라이언트에도 같은 검사. \d 하나는 DSL 경고.
  • 필수 참조(post: Post!)는 저장 요청에서 키 필드(postPostId)를 요구하고 중첩 DTO 는 선택입니다. 중첩 객체만 보내던 클라이언트에는 동작 변경.
  • 엔티티 줄의 @signin 이 POST /signin, POST /signout, GET /me, me(), TypeScript 의 signIn/signOut/me() 를 생성합니다 - 본인과 관리자만 그 행을 바꿀 수 있고 애플리케이션에 @signin 엔티티가 하나일 때만 생성하며, 로그인 컬럼은 unique 가 됩니다.
  • @default(now) 를 @readonly 와 함께 "행을 만들 때의 시각" 으로 문서화. timestamp 에서는 Instant.now() 를 쓰고, timestamp 의 기본값은 DTO 에 들어가지 않습니다.

오류 응답​

  • 잘못된 상태의 생명주기 명령은 409(전에는 422), 없는 행을 가리키는 키는 저장 전에 확인되어 404(전에는 외래 키의 409) (requireReferences - DDD·헥사고날 번들, 다른 애그리거트를 ID 로 참조할 때).
  • ConflictException 과 손으로 쓴 모든 거절이 메시지 코드를 받아 생성된 거절처럼 번역됩니다: BadRequestException, NotFoundException, ConflictException, ForbiddenException, NotSignedInException, PortCallException.
  • PortCallException - 다른 시스템 호출이 실패하면 502 (code: upstream).
  • RequestShapeErrors - Spring MVC 가 컨트롤러 전에 거절한 요청(깨진 JSON, 틀린 타입, 없는 파라미터, 404, 405, 406, 415)도 code 가 있는 problem+json 으로.
  • 생성된 findById·delete 가 없는 행에 같은 모양의 404 본문으로 답합니다.
  • 한 응답은 한 언어: Accept-Language, 아니면 spring.web.locale, 서버 머신의 언어는 쓰지 않음. 한 도메인의 번역이 다른 도메인의 영어에 가려지지 않습니다.

생성기와 빌드​

  • v3 모드(헥사고날, DDD, -Pv3, Kotlin)의 @search(like) 는 대소문자를 무시합니다. @search(%_%) 는 구분.
  • PUT /batch 가 행마다 update(dto) 를 거칩니다. @restExclude(update) 는 batchUpdate 를 함께 빼고, 헥사고날 유스케이스를 더는 깨뜨리지 않습니다.
  • @minsize(1) 은 목록이 없어도 400, 선택으로 담은 임베디드 값의 필수 필드는 NOT NULL 컬럼을 만들지 않음, 참조의 @updatable(false) 가 동작, @readonly 소유자 필드가 소유자를 잃지 않음.
  • 읽지 못한 YAML 파일(LOAD ERROR)이 elcore3 를 멈춥니다. DSL 경고는 한 번만 나옵니다.
  • typescriptClient = true 가 빌드와 함께 elcore3ts 를 돌립니다. 클라이언트가 모델보다 오래되면 elcore3 가 경고하고, 클라이언트는 서버의 모드를 따릅니다.
  • Ossie: 식은 OSSIE_SQL_2026, 서브쿼리 @formula 는 ANSI_SQL. count(엔티티) 는 키 컬럼을 셈.
  • @EnableElastiCore 가 자기 클래스의 패키지를 스캔해 @SpringBootTest 도 포트 빈을 받음. 포트 프록시를 감싼 @Primary 빈이 다시 동작, 2.x 앱의 컴포넌트 스캔이 오류 처리기를 가져오지 않음.
  • 세 차례 리뷰의 수정: @ref 나 cascade DTO 를 통한 로그인·비밀번호 쓰기 차단, 상속한 참조 확인, 다른 도메인의 값 객체, 2.x 와 같은 @rollup 판별값.

3.0.261020-alpha2​

  • 도메인에 Comment 엔티티나 enum 이 있어도 컴파일됩니다(이름이 겹치면 @Comment 를 패키지까지 붙여 씀).
  • README 의 시작하기를 실제 작업 순서로, 그대로 복사해 동작하는 build.gradle, Spring Initializr·Spring Boot 3 안내. ReadmeQuickStartTest 가 README 의 시작하기를 실제로 생성해 봅니다.
  • 3.0 은 첫 정식 릴리스부터 3년간 release/3.0 에서 지원. Spring Boot 3 수정은 3.5.16 에서 테스트.
  • CI 가 2.x 기준 트리가 커밋된 그대로인지도 확인하고, 호환 검사를 실제로 비교하는 대로 설명합니다.

3.0.261015-alpha1 - 첫 공개​

  • 공개 저장소의 첫 릴리스: elasticore-base, elasticore-springboot3, elasticore-springboot4, Gradle 플러그인 io.elasticore 가 Maven Central 에.
  • 생성 결과가 2.x 와 달라지는 2.x 결함 수정: string(n) 과 @length(min=), @formula(컬럼 없음, DTO 에서 매핑하지 않음, 식의 =), 같은 대상을 가리키는 두 @ManyToOne 의 검색 조건, @forceupdate 매핑, 생성 서비스 테스트의 값.
  • 모든 운영체제에서 도메인과 모델 파일을 같은 순서로 읽음.
  • 런타임 보안: multipart 호출의 ignoreSSL 이 JVM 전체의 인증서 검사를 끄지 않음, 로그에서 인증 정보를 가림, IdUtils.newId 가 SecureRandom 을 씀.
  • 런타임 POM 이 고정된 옛 버전 대신 Spring Boot 의 의존성 관리를 따름.

2.2 에서 올리기: 버전만 바꾸면 됩니다.