Loading...
Spring Framework Reference Documentation 7.0.2의 Script Views의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
See equivalent in the Reactive stack
Spring Framework는 Spring MVC를 JSR-223 Java 스크립팅 엔진 위에서 실행될 수 있는 어떠한 템플릿 라이브러리와도 함께 사용할 수 있도록 하는 내장 통합을 제공합니다. 우리는 다음과 같은 템플릿 라이브러리들을 다양한 스크립트 엔진에서 테스트했습니다:
| Scripting Library | Scripting Engine |
|---|---|
| Handlebars | Nashorn |
| Mustache | Nashorn |
| React | Nashorn |
| EJS | Nashorn |
| ERB | JRuby |
| String templates | Jython |
| Kotlin Script templating | Kotlin |
다른 스크립트 엔진을 통합하기 위한 기본 규칙은 해당 엔진이
ScriptEngine과Invocable인터페이스를 구현해야 한다는 것입니다.
See equivalent in the Reactive stack
스크립트 엔진을 클래스패스에 두어야 하며, 이에 대한 자세한 내용은 스크립트 엔진마다 다릅니다:
Nashorn JavaScript 엔진은 Java 8+에 포함되어 제공됩니다. 사용 가능한 최신 업데이트 릴리스를 사용하는 것이 강력히 권장됩니다.
Ruby 지원을 위해서는 JRuby를 의존성으로 추가해야 합니다.
Python 지원을 위해서는 Jython을 의존성으로 추가해야 합니다.
Kotlin 스크립트 지원을 위해서는 org.jetbrains.kotlin:kotlin-script-util 의존성과
org.jetbrains.kotlin.script.jsr223.KotlinJsr223JvmLocalScriptEngineFactory
라인을 포함하는 META-INF/services/javax.script.ScriptEngineFactory 파일을 추가해야 합니다.
자세한 내용은
이 예제를 참고하십시오.
스크립트 템플릿 라이브러리가 필요합니다. JavaScript의 경우 이를 위한 한 가지 방법은 WebJars를 사용하는 것입니다.
See equivalent in the Reactive stack
사용할 스크립트 엔진, 로드할 스크립트 파일, 템플릿을 렌더링하기 위해 호출할 함수 등을 지정하기 위해
ScriptTemplateConfigurer 빈을 선언할 수 있습니다.
다음 예제는 Mustache 템플릿과 Nashorn JavaScript 엔진을 사용합니다:
1@Configuration 2@EnableWebMvc 3public class WebConfig implements WebMvcConfigurer { 4 5 @Override 6 public void configureViewResolvers(ViewResolverRegistry registry) { 7 registry.scriptTemplate(); 8 } 9 10 @Bean 11 public ScriptTemplateConfigurer configurer() { 12 ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); 13 configurer.setEngineName("nashorn"); 14 configurer.setScripts("mustache.js"); 15 configurer.setRenderObject("Mustache"); 16 configurer.setRenderFunction("render"); 17 return configurer; 18 } 19}
1@Configuration 2@EnableWebMvc 3class WebConfig : WebMvcConfigurer { 4 5 override fun configureViewResolvers(registry: ViewResolverRegistry) { 6 registry.scriptTemplate() 7 } 8 9 @Bean 10 fun configurer() = ScriptTemplateConfigurer().apply { 11 engineName = "nashorn" 12 setScripts("mustache.js") 13 renderObject = "Mustache" 14 renderFunction = "render" 15 } 16}
다음 예제는 동일한 구성을 XML로 보여줍니다:
1<mvc:annotation-driven/> 2 3<mvc:view-resolvers> 4 <mvc:script-template/> 5</mvc:view-resolvers> 6 7<mvc:script-template-configurer engine-name="nashorn" render-object="Mustache" render-function="render"> 8 <mvc:script location="mustache.js"/> 9</mvc:script-template-configurer>
controller는 다음 예제에서 보듯이 Java와 XML 설정 모두에 대해 동일하게 보일 것입니다:
1@Controller 2public class SampleController { 3 4 @GetMapping("/sample") 5 public String test(Model model) { 6 model.addAttribute("title", "Sample title"); 7 model.addAttribute("body", "Sample body"); 8 return "template"; 9 } 10}
1@Controller 2class SampleController { 3 4 @GetMapping("/sample") 5 fun test(model: Model): String { 6 model["title"] = "Sample title" 7 model["body"] = "Sample body" 8 return "template" 9 } 10}
다음 예제는 Mustache 템플릿을 보여줍니다:
1<html> 2 <head> 3 <title>{{title}}</title> 4 </head> 5 <body> 6 <p>{{body}}</p> 7 </body> 8</html>
렌더링 함수는 다음 매개변수로 호출됩니다:
String template: 템플릿 콘텐츠Map model: 뷰 모델RenderingContext renderingContext: 애플리케이션 컨텍스트, 로케일, 템플릿 로더,
URL(5.0부터)에 대한 접근을 제공하는
RenderingContextMustache.render()는 이 시그니처와 네이티브하게 호환되므로, 이를 직접 호출할 수 있습니다.
템플릿 기술에 커스터마이제이션이 필요한 경우, 커스텀 렌더링 함수를 구현하는 스크립트를 제공할 수 있습니다. 예를 들어, Handlerbars는 템플릿을 사용하기 전에 컴파일해야 하며, 서버 사이드 스크립트 엔진에서 사용할 수 없는 일부 브라우저 기능을 에뮬레이트하기 위한 polyfill이 필요합니다.
다음 예제는 이를 수행하는 방법을 보여줍니다:
1@Configuration 2@EnableWebMvc 3public class WebConfig implements WebMvcConfigurer { 4 5 @Override 6 public void configureViewResolvers(ViewResolverRegistry registry) { 7 registry.scriptTemplate(); 8 } 9 10 @Bean 11 public ScriptTemplateConfigurer configurer() { 12 ScriptTemplateConfigurer configurer = new ScriptTemplateConfigurer(); 13 configurer.setEngineName("nashorn"); 14 configurer.setScripts("polyfill.js", "handlebars.js", "render.js"); 15 configurer.setRenderFunction("render"); 16 configurer.setSharedEngine(false); 17 return configurer; 18 } 19}
1@Configuration 2@EnableWebMvc 3class WebConfig : WebMvcConfigurer { 4 5 override fun configureViewResolvers(registry: ViewResolverRegistry) { 6 registry.scriptTemplate() 7 } 8 9 @Bean 10 fun configurer() = ScriptTemplateConfigurer().apply { 11 engineName = "nashorn" 12 setScripts("polyfill.js", "handlebars.js", "render.js") 13 renderFunction = "render" 14 isSharedEngine = false 15 } 16}
sharedEngine프로퍼티를false로 설정하는 것은 Handlebars나 Nashorn에서 실행되는 React와 같이 동시성을 위해 설계되지 않은 템플릿 라이브러리와 스레드로부터 안전하지 않은 스크립트 엔진을 함께 사용할 때 필요합니다. 이 경우 이 버그 때문에 Java SE 8 업데이트 60이 필요하지만, 일반적으로는 최신 Java SE 패치 릴리스를 사용하는 것이 권장됩니다.
polyfill.js는 Handlebars가 올바르게 실행되는 데 필요한 window 객체만 다음과 같이 정의합니다:
1var window = {};
이 기본 render.js 구현은 템플릿을 사용하기 전에 컴파일합니다.
운영 환경에 적합한 구현은 재사용되는
캐시된 템플릿이나 사전 컴파일된 템플릿도 저장해야 합니다.
이는 스크립트 측에서 수행할 수 있으며(예: 템플릿 엔진 설정 관리와 같은
필요한 커스터마이제이션 처리), 다음 예제는 이를 수행하는 방법을 보여줍니다:
1function render(template, model) { 2 var compiledTemplate = Handlebars.compile(template); 3 return compiledTemplate(model); 4}
더 많은 설정 예제는 Spring Framework 단위 테스트, Java, 및 resources를 참고하십시오.
Groovy Markup
HTML Fragments