Post

Spring 템플릿 엔진

1. Spring 뷰 기술

Spring MVC 애플리케이션의 문제가 한 뷰 기술에서 다른 뷰 기술로 완전히 분리되어 있다는 점을 고려하면 기본적으로 구성 문제이다.

각 뷰 유형을 렌더링하려면 각 기술에 해당하는 ViewResolver 빈을 정의해야 한다. 이는 일반적으로 JSP 파일을 반환하는 것과 동일한 방식으로 @Controller 매핑 메서드에서 뷰 이름을 반환할 수 있음을 의미한다.

Java Server Pages와 같은 보다 전통적인 기술과 Spring에서 사용할 수 있는 기본 템플릿 엔진인 Thymeleaf, Groovy, FreeMarker, Jade에 대해 설명한다.

이들 각각에 대해 표준 Spring 애플리케이션과 Spring Boot를 사용하여 구축된 애플리케이션 모두에 필요한 구성이다.

2. 자바 서버 페이지

JSP는 Java 애플리케이션에 가장 널리 사용되는 뷰 기술 중 하나이며 Spring에서 기본적으로 지원된다. JSP 파일을 렌더링하기 위해 일반적으로 사용되는 ViewResolver 빈 유형은 InternalResourceViewResolver이다.

1
2
3
4
5
6
7
8
9
10
11
@EnableWebMvc
@Configuration
public class ApplicationConfiguration implements WebMvcConfigurer {
    @Bean
    public ViewResolver jspViewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setPrefix("/WEB-INF/views/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

/WEB-INF/views 위치에 JSP 파일 생성을 시작할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
    <head>
        <meta http-equiv="Content-Type" 
          content="text/html; charset=ISO-8859-1">
        <title>User Registration</title>
    </head>
    <body>
        <form:form method="POST" modelAttribute="user">
            <form:label path="email">Email: </form:label>
            <form:input path="email" type="text"/>
            <form:label path="password">Password: </form:label>
            <form:input path="password" type="password" />
            <input type="submit" value="Submit" />
        </form:form>
    </body>
</html>

Spring Boot 애플리케이션에 파일을 추가하는 경우 ApplicationConfiguration 클래스 대신 application.properties 파일에 다음 속성을 정의할 수 있다.

1
2
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp

이러한 속성을 기반으로 Spring Boot는 필요한 ViewResolver를 자동 구성한다.

3. Thymeleaf

Thymeleaf는 HTML, XML, 텍스트, JavaScript 또는 CSS 파일을 처리할 수 있는 Java 템플릿 엔진이다. 다른 템플릿 엔진과 달리 Thymeleaf는 템플릿을 프로토타입으로 사용할 수 있다. 즉, 템플릿을 정적 파일로 볼 수 있다.

1) 메이븐 종속성

Thymeleaf를 Spring과 통합하려면 thymeleaf 및 thymeleaf-spring4 종속성을 추가해야 한다.

1
2
3
4
5
6
7
8
9
10
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring5</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

Spring 4 프로젝트가 있는 경우 thymeleaf-spring4를 추가해야 한다.

2) Spring 구성

다음으로 SpringTemplateEngine 빈과 뷰 파일의 위치와 유형을 지정하는 TemplateResolver 빈이 필요한 구성을 추가해야 한다.

SpringResourceTemplateResolver는 Spring의 리소스 확인 메커니즘과 통합된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Configuration
@EnableWebMvc
public class ThymeleafConfiguration {
 
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(thymeleafTemplateResolver());
        return templateEngine;
    }

    @Bean
    public SpringResourceTemplateResolver thymeleafTemplateResolver() {
        SpringResourceTemplateResolver templateResolver 
          = new SpringResourceTemplateResolver();
        templateResolver.setPrefix("/WEB-INF/views/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        return templateResolver;
    }
}

또한 ThymeleafViewResolver 유형의 ViewResolver 빈이 필요하다.

1
2
3
4
5
6
@Bean
public ThymeleafViewResolver thymeleafViewResolver() {
    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(templateEngine());
    return viewResolver;
}

3) Thymeleaf 템플릿

WEB-INF/views 위치에 HTML 파일을 추가할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>
    <head>
        <meta charset="ISO-8859-1" />
        <title>User Registration</title>
    </head>
    <body>
        <form action="#" th:action="@{/register}" 
          th:object="${user}" method="post">
            Email:<input type="text" th:field="*{email}" />
            Password:<input type="password" th:field="*{password}" />
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>

Thymeleaf 템플릿은 HTML 템플릿과 구문이 매우 유사하다.

Spring 애플리케이션에서 Thymeleaf를 사용할 때 사용할 수 있는 일부 기능은 다음과 같다.

  • 양식 동작 정의 지원

  • 양식 입력을 데이터 모델에 바인딩

  • 양식 입력에 대한 유효성 검사

  • 메시지 소스의 값 표시

  • 템플릿 조각 렌더링

참고: Spring MVC Thymeleaf

4) Spring Boot의 Thymeleaf

Spring Boot는 spring-boot-starter-thymeleaf 종속성을 추가하여 Thymeleaf에 대한 자동 구성을 제공한다.

1
2
3
4
5
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.5.6</version>
</dependency>

명시적인 구성은 필요하지 않다. 기본적으로 HTML 파일은 resources/templates 위치에 배치되어야 한다.

4. FreeMarker

FreeMarker는 Apache Software Foundation에서 구축한 Java 기반 템플릿 엔진이다. 웹 페이지를 생성하는데 사용할 수 있을 뿐만 아니라 소스 코드, XML 파일, 구성 파일, 이메일 및 기타 텍스트 기반 형식도 생성할 수 있다.

생성은 FreeMarker 템플릿 언어를 사용하여 작성된 템플릿 파일을 기반으로 수행된다.

1) 메이븐 종속성

프로젝트에서 템플릿 사용을 시작하려면 freemarker 종속성이 필요하다.

1
2
3
4
5
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>

Spring 통합을 위해서는 spring-context-support 종속성도 필요하다.

1
2
3
4
5
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

2) Spring 구성

FreeMarker를 Spring MVC와 통합하려면 템플릿 파일의 위치를 ​​지정하는 FreemarkerConfigurer 빈을 정의해야 한다.

1
2
3
4
5
6
7
8
9
10
11
@Configuration
@EnableWebMvc
public class FreemarkerConfiguration {
 
    @Bean 
    public FreeMarkerConfigurer freemarkerConfig() { 
        FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); 
        freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/views/");
        return freeMarkerConfigurer; 
    }
}

다음으로 FreeMarkerViewResolver 유형의 적절한 ViewResolver 빈을 정의해야 한다.

1
2
3
4
5
6
7
8
@Bean 
public FreeMarkerViewResolver freemarkerViewResolver() {
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
    resolver.setCache(true);
    resolver.setPrefix("");
    resolver.setSuffix(".ftl");
    return resolver;
}

3) FreeMarker 템플릿

WEB-INF/views 위치에서 FreeMarker를 사용하여 HTML 템플릿을 만들 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<#import "/spring.ftl" as spring/>
<html>
    <head>
        <meta charset="ISO-8859-1" />
        <title>User Registration</title>
    </head>
    <body>
        <form action="register" method="post">
            <@spring.bind path="user" />
            Email: <@spring.formInput "user.email"/>
            Password: <@spring.formPasswordInput "user.password"/>
            <input type="submit" value="Submit" />
        </form>
    </body>
</html>

위의 예에서는 양식 입력을 데이터 모델에 바인딩하는 것을 포함하여 FreeMarker의 양식 작업을 위해 Spring에서 정의한 매크로 세트를 가져왔다.

또한 FreeMarker 템플릿 언어에는 컬렉션, 흐름 제어 구조, 논리 연산자, 문자열 형식 지정 및 구문 분석, 숫자 및 기타 다양한 기능을 사용하기 위한 수많은 태그, 지시문 및 표현식이 포함되어 있다.

4) Spring Boot의 FreeMarker

Spring Boot 애플리케이션에서는 spring-boot-starter-freemarker 종속성을 사용하여 필요한 구성을 단순화할 수 있다.

1
2
3
4
5
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.5.6</version>
</dependency>

스타터는 필요한 자동 구성을 추가한다. 템플릿 파일을 resources/templates 폴더에 배치한다.

5. Groovy

Groovy Markup Template Engine을 사용하여 Spring MVC 뷰를 생성할 수도 있다. 이 엔진은 빌더 구문을 기반으로 하며 모든 텍스트 형식을 생성하는 데 사용할 수 있다.

1) 메이븐 종속성

groovy-templates 종속성을 pom.xml에 추가한다.

1
2
3
4
5
<dependency>
    <groupId>org.codehaus.groovy</groupId>
    <artifactId>groovy-templates</artifactId>
    <version>2.4.12</version>
</dependency>

2) Spring 구성

마크업 템플릿 엔진을 Spring MVC와 통합 하려면 GroovyMarkupConfigurer 빈과 GroovyMarkupViewResolver 유형의 ViewResolver를 정의해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Configuration
@EnableWebMvc
public class GroovyConfiguration {
 
    @Bean
    public GroovyMarkupConfigurer groovyMarkupConfigurer() {
        GroovyMarkupConfigurer configurer = new GroovyMarkupConfigurer();
        configurer.setResourceLoaderPath("/WEB-INF/views/");
        return configurer;
    }
    
    @Bean
    public GroovyMarkupViewResolver thymeleafViewResolver() {
        GroovyMarkupViewResolver viewResolver = new GroovyMarkupViewResolver();
        viewResolver.setSuffix(".tpl");
        return viewResolver;
    }
}

3) Groovy Markup 템플릿

템플릿은 Groovy 언어로 작성되었으며 다음과 같은 몇 가지 특징을 가지고 있다.

  • 바이트코드로 컴파일된다.

  • 조각과 레이아웃에 대한 지원이 포함되어 있다.

  • 국제화를 지원한다.

  • 렌더링이 빠르다.

데이터 바인딩이 포함된 “사용자 등록” 양식을 위한 Groovy 템플릿을 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
yieldUnescaped '<!DOCTYPE html>'
html(lang:'en') {
    head {
        meta('http-equiv':'"Content-Type" ' +
          'content="text/html; charset=utf-8"')
        title('User Registration')
    }
    body {
        form (id:'userForm', action:'register', method:'post') {
            label (for:'email', 'Email')
            input (name:'email', type:'text', value:user.email?:'')
            label (for:'password', 'Password')
            input (name:'password', type:'password', value:user.password?:'')
            div (class:'form-actions') {
                input (type:'submit', value:'Submit')
            }
        }
    }
}

4) Spring Boot의 Groovy Template Engine

Spring Boot에는 spring-boot-starter-groovy-templates 종속성을 포함하여 추가되는 Groovy 템플릿 엔진에 대한 자동 구성이 포함되어 있다.

1
2
3
4
5
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-groovy-templates</artifactId>
    <version>2.5.6</version>
</dependency>

템플릿의 기본 위치는 /resources/templates이다.

6. Jade4j

Jade4j는 Javascript용 Pug 템플릿 엔진(원래 Jade라고 함)을 Java로 구현한 것이다. Jade4j 템플릿은 HTML 파일을 생성하는데 사용할 수 있다.

1) 메이븐 종속성

Spring 통합을 위해서는 spring-jade4j 종속성이 필요하다.

1
2
3
4
5
<dependency>
    <groupId>de.neuland-bfi</groupId>
    <artifactId>spring-jade4j</artifactId>
    <version>1.2.5</version>
</dependency>

2) Spring 구성

Spring과 함께 Jade4j를 사용하려면 템플릿의 위치를 ​​구성하는 SpringTemplateLoader 빈과 JadeConfiguration 빈을 정의해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Configuration
@EnableWebMvc
public class JadeTemplateConfiguration {
 
    @Bean
    public SpringTemplateLoader templateLoader() {
        SpringTemplateLoader templateLoader 
          = new SpringTemplateLoader();
        templateLoader.setBasePath("/WEB-INF/views/");
        templateLoader.setSuffix(".jade");
        return templateLoader;
    }
 
    @Bean
    public JadeConfiguration jadeConfiguration() {
        JadeConfiguration configuration 
          = new JadeConfiguration();
        configuration.setCaching(false);
        configuration.setTemplateLoader(templateLoader());
        return configuration;
    }
}

일반적인 ViewResolver 빈이 필요하다. 이 경우 JadeViewResolver 유형이다.

1
2
3
4
5
6
@Bean
public ViewResolver viewResolver() {
    JadeViewResolver viewResolver = new JadeViewResolver();
    viewResolver.setConfiguration(jadeConfiguration());
    return viewResolver;
}

2) Jade4j 템플릿

Jade4j 템플릿은 사용하기 쉬운 공백 구분 구문이 특징이다.

1
2
3
4
5
6
7
8
9
10
11
doctype html
html
  head
    title User Registration
  body
    form(action="register" method="post" )
      label(for="email") Email:
      input(type="text" name="email")
      label(for="password") Password:
      input(type="password" name="password")
      input(type="submit" value="Submit")

Spring Boot는 Jade4j 스타터를 제공하지 않으므로 Boot 프로젝트에서는 위에서 정의한 것과 동일한 Spring 구성을 추가해야 한다.

7. 기타 템플릿 엔진

Velocity는 오래된 템플릿 엔진으로 매우 복잡하지만 Spring이 버전 4.3부터 더 이상 사용하지 않고 Spring 5.0.1에서 완전히 제거된다는 단점이 있다.

JMustachespring-boot-starter-mustache 종속성을 사용하여 Spring Boot 애플리케이션에 쉽게 통합할 수 있는 템플릿 엔진이다.

Pebble에는 라이브러리 내에 Spring 및 Spring Boot에 대한 지원이 포함되어 있다.

Nashorn과 같은 JSR-223 스크립트 엔진 위에서 실행되는 Handlebars 또는 React와 같은 다른 템플릿 라이브러리도 사용할 수 있다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.