릴리스 노트
모든 변경과 그 이유, 확인한 것, 관련 파일은 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, 서버 머신의 언어는 쓰지 않음. 한 도메인의 번역이 다른 도메인의 영어에 가려지지 않습니다.