본문으로 건너뛰기
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.261023 - 다음 릴리스 (main 에 있고, 아직 Maven Central 에는 없음)​

Pet Store 에 팀 규칙을 붙여 rc1 로 만들며 규칙 가이드의 예제를 하나씩 다시 확인했고, 규칙이 쓴 것이 실행 중인 애플리케이션에 닿지 않는 두 자리를 고쳤습니다. 런타임 라이브러리가 Spring Boot 자동 구성을 갖게 되어 포트에 @EnableElastiCore 가 필요 없습니다. 2.x 생성기와 jpa-springboot 번들의 출력은 그대로입니다(컴파일되지 않던 return: decimal 포트만 바뀝니다).

팀 규칙​

  • v3 검색 엔드포인트가 요청 본문을 검증 (@Valid @RequestBody - v3, DDD, 헥사고날, Kotlin): 규칙이 검색 DTO 에 붙인 제약 (@Size(min = 2))이 이제 create 처럼 400 으로 답합니다. 지금 생성되는 검색 DTO 에는 제약이 없으므로, 규칙·손으로 고친 것· sortableInterface/pageableInterface 의 getter 가 제약을 더하지 않으면 달라지는 것이 없습니다. 이미 고친 컨트롤러는 그대로입니다.
  • 메서드 없는 클래스의 addMethod - 필드만 있는 엔티티, enum, interface, record - 가 아무 말 없이 버려지던 것을, 이제 닫는 중괄호 앞에 씁니다. 더하는 것이 없는 파일은 바이트까지 같습니다.

문서​

  • rule dev guide 10장 규칙 API 레퍼런스(@Rule, EntitySpec, SourceCode, addMethod, excludeMethod 와 엔드포인트 이름, ModelCheck, ArtifactContributor 등) - 이 사이트에만 있던 것을 모든 프로젝트에 복사되는 가이드에도 두었습니다. 규칙 API 의 javadoc 은 더 이상 프로토타입이라고 하지 않습니다.

가이드 색인​

  • blueprint/elasticore-guide-index.md - 가이드의 절마다 한 줄: <가이드>:<첫 줄>-<끝 줄> <제목> [단어]. 복사된 가이드에서 쓰므로 단어(@access)로 검색하면 읽을 범위가 나옵니다. blueprint/ 에 파일 하나가 더해질 뿐 생성 코드는 바뀌지 않습니다.

@EnableElastiCore 없는 포트​

  • 자동 구성 io.elasticore.springboot.autoconfigure.ElastiCoreAutoConfiguration(elasticore-springboot3 / -springboot4): @SpringBootApplication 클래스의 패키지와 그 아래에서 포트(@ExternalService, @DbmsService)를 찾고, 있을 때만 포트, DbTransactionGateway(EntityManagerFactory 하나 또는 @Primary 하나), ApplicationContextProvider, 배너를 등록합니다. 포트가 없는 애플리케이션에는 아무것도 등록하지 않습니다.
  • @EnableElastiCore 는 그대로 동작하고 각각 한 번씩만 등록됩니다. 이미 있는 빈이 이깁니다. 끄기는 elasticore.autoconfigure.enabled=false, 배너만 끄기는 elasticore.banner.enabled=false.
  • 애플리케이션 클래스의 패키지 밖의 포트(scanBasePackages 포함)는 찾지 못합니다 - @AutoConfigurationPackage(basePackages = ...), 그 패키지의 @EnableElastiCore, 또는 @Bean. EntityManagerFactory 가 둘 이상이고 @Primary 가 없으면 하나를 @Primary 로 하거나 DbmsSqlExecutor 를 선언합니다. 포트 참고.
  • 단순 이름이 같은 포트는 전체 클래스 이름으로 등록하고 경고를 남깁니다(전에는 기동이 멈췄습니다). 포트 프록시는 빈을 자기 빈 팩토리에서 찾습니다 - 컨텍스트를 여럿 띄우는 테스트에서 중요합니다.

값 하나를 다루는 DBMS 포트​

  • 값 하나(long, string, boolean, decimal)를 돌려주는 메서드는 첫 열을 바꿔 돌려주고, NULL 값이나 행이 없으면 null 입니다. 숫자는 Failed to map tuple to DTO 로 실패했고 String 은 빈 문자열이었습니다.
  • return: decimal 과 List<decimal> 은 java.math.BigDecimal 로 생성됩니다(전에는 컴파일되지 않는 decimal).
  • 값 파라미터 하나(long, string, 날짜, enum)는 이름으로 :이름 에 묶입니다(-parameters 필요 - Spring Boot 의 Gradle·Maven 플러그인이 켭니다). 전에는 long 하나가 묶이지 않았습니다. DBMS 포트 참고.

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 에서 올리기: 버전만 바꾸면 됩니다.