개발 환경
- spring boot-2.6.6
- jdk17
상황
JDK 17 버전업 후 다음과 같은 에러 발생
javax.validation.ConstraintDeclarationException: HV000170: No JSR-223 scripting engine could be bootstrapped for language "javascript".
at com.sds.promise.workflow.model.request.WorkflowNodeRequestTest$progress.givenToDoAndProgress0(WorkflowNodeRequestTest.java:37)
Caused by: org.hibernate.validator.spi.scripting.ScriptEvaluatorNotFoundException: HV000232: No JSR 223 script engine found for language "javascript".
at com.sds.promise.workflow.model.request.WorkflowNodeRequestTest$progress.givenToDoAndProgress0(WorkflowNodeRequestTest.java:37)
문제 해결
원인
- validation annotation 중 @ScriptAssert 은 Java Scripting API의 스크립팅 언어를 지원해주는 기능을 사용하고 있음
- JDK11부터 Nashorn script API가 Deprecated되었고, JDK 15부터는 Removed되었다.
- JDK8 ~ JDK14 = NashornVM
Java scripting API는 Rhino -> Nashorn -> GraalVM 순으로 변경이 되었다.
Nashorn은 Java Runtime에 빌트인 되어 있었지만, GraalVM은 아니라서 Oracle에서 설치를 해야한다.
JDK 런타임에 stock으로 올려놓고 쓰는 데모 프로젝트가 graal github에 있긴 한데, JDK11 기준이고 뭔가 데모라고 불려서 실험적 SDK같아서 굳이 따로 받아서 해야할 이유는 없는 것 같다.
조치 방법
1. Nashorn 의존성 추가
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>15.3</version>
</dependency>
2. 생성자에서 validation 진행
3. graalVM 설치 혹은 graalVM on stock JDK11 사용
결과
2번을 선택했다.
가장 간단할 수 있는 1번을 선택하지 않은 이유는 Java Scripting API의 히스토리 중에 JEP 335의 명세를 보면 nashorn engine은 급격하게 발전하고 있는 ECMAscript의 발전 속도에 맞춰 api가 수정되고 유지보수하기가 어렵다는 것을 파악하고 deprecated되었다고 한다.
그리고 3번은 새로운 엔진을 JVM 위에 올려야 하고, 올리기 싫으면 jdk 11에 스톡으로 들어간 데모 버전을 사용하기 때문에 운영적으로 문제가 될 수 있다고 생각해서 선택하지 않았다.
'🧑🏻💻Dev' 카테고리의 다른 글
객체 복사 라이브러리 비교 2편 : ModelMapper (0) | 2022.06.25 |
---|---|
객체 복사 라이브러리 비교 1편 : BeanUtils (0) | 2022.06.25 |
Framework와 Library (0) | 2022.04.03 |
소프트웨어 배포 생명 주기 접미사 (0) | 2022.04.03 |
[예제로 배우는 스프링 입문] 간단 과제 (0) | 2022.03.16 |