반응형

타임리프3 5분 이주 가이즈 Thymeleaf 3 five-minute migration guide

원문: http://www.thymeleaf.org/doc/articles/thymeleaf3migration.html

당신은 Thymeleaf 2 사용자로서 새로운 Thymeleaf 3를 써보고 싶으시가요?

먼저, 좋은 소식이 있습니다. 당신이 구현해놓은 타임리프 템플릿들은 거의 100% 타임리프3와 호환될 것이므로, 당신은 단지 몇가지 설정만 바꿔주시면 됩니다.

Thymeleaf 3.0 BETA 버전은 안정적으모 2.1버전의 모든 기능을 지원합니다. 우리는 당신이 새 기능들과 성능 향상의 잇점을 취하도록 가능한한 빨리 타임리프3로 옮기기를 권장합니다.

현재 단계에서 타임리프 버전 2.1의 모든 다이얼렉트dialect들이 옮겨지진 않았다는게 약점이긴 하지만, 당신이 만약 타임리프 3에서 동작하지많은 외부 다이얼렉트를 사용중이라면, 타임리프 3와 호환되는 지 먼저 확인해보세요

템플릿 변경 Template changes

당신의 템플릿에 우리가 권장하는 유일한 변경사항은 아마도 당신이 사용하고있을 th:inline="text" 속성을 없애주는 것입니다. 왜냐하면 이들은 HTML이나 XML템플릿의 인라인 표현식을 출력하기 위해 더이상 필요하지 않기 때문입니다. 아 이건 그저 권장사항입니다 - 템플릿은 지우던 안지우던 어쨋거나 동작할 것입니다 - 하지만 당신이 이것을 지원줌으로서 성능향상이라는 혜택을 받을 수 있습니다.

더 자세한 정보는 밑의 향상된 인라인 메케니즘 섹셕을 참고사헤요

설정 변경 Configuration changes

이제 타임리프 사용자로서 가장 일반적인 선택인 thymeleaf-spring4 통합 패키지와 자바 설정을 사용한 타임리프 3의 설정의 예를 봅시다, 

먼저, 다음과 같이 타임리프3와 스프리4 통합 패키지를 얻기위한 메이븐 의존성을 업데이트합니다.

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.0.0.BETA01</version>
</dependency>
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
    <version>3.0.0.BETA01</version>
</dependency>

두번째로, 스프링 설정:

@Configuration
@EnableWebMvc
@ComponentScan("com.thymeleafexamples")
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
 
    private ApplicationContext applicationContext;
 
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
    }
 
    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }
 
    private TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setTemplateResolver(templateResolver());
        return engine;
    }
 
    private ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setApplicationContext(applicationContext);
        resolver.setPrefix("/WEB-INF/templates/");
        resolver.setTemplateMode(TemplateMode.HTML);
        return resolver;
    }
 
}

타임리프2 설정과의 첫번째 차이점은 이제 스프링 어플리케이션을 위한 추천 템플릿이 SpringResourceTemplateResolver 라는 것입니다. 이는 설정 빈(configuration bean)이 ApplicationContextAware 인터페이스를 구현줘야만 하기 때문에 스프링 ApplicationContext에 참조(reference)가 필요합니다.

두번째 차이점은 템플릿 모드가 TemplateMode.HTMLT의 값을 가지는 것입니다. 템플릿 모드는 더이상 스트링이 아니며, 가능한 값들도 타임리프2와 약간 다릅니다. 잠시후 살펴볼 것입니다.

만일 추가적인 다이얼렉트를 추가해줘야한다면, 당신은 engine.addDialect(...) 메소드를 사용할 수 있습니다. 그러나 먼저 이것이 타임리프 3와 호환가능한 버전인지 확인해보아야 합니다.

Thymeleaf 3 + Spring 4 + Java config exampleThymeleaf 3 + Spring 4 + XML config example 그리고 Thymeleaf 3 + Servlet 3 example에서 간단한 "Hello World" 예제들의 소스코드를 찾아보거나 다운로드 할 수 있습니다.

또는 the Thymeleaf BETA 1 announcement.에서 추가적인 정보를 찾아볼 수 있습니다.

완전한 HTML5 마크업 지원 Full HTML5 markup support

타임리프 3.0은 더이상 XML 베이스가 아닙니다. 이 새 파싱 시스템에 감사하며, XML 유효한 HTML 코드를 더이상 만들 필요도 없습니다. (가독성이좋으므로 여전히 권장되기는 합니다). HTML 모드로, 타임리프는 클로징태그(closed tag), 따옴표 속성(quoted attribute)의 경우 이제 훨씬 더 관대해졌습니다.

따라서 이제 다음과 같이 더 완벽하게 처리능력이 향상된 (약간 가독성이 떨어지지만) 타임리프 템플릿이 되었습니다:

<div><p th:text=${mytext} ng-app>Whatever

새로운 파싱 시스템에 댛의 설명은 Full HTML5 support, new parsing infrastructure를 참고하세요.

템플릿 모드 Template modes

타임리프3는 이전 버전의 템플릿 모드의 묶음을 변경하였습니다. 새로운 템플릿 모드는 다음과 같습니다: 

  • HTML
  • XML
  • TEXT
  • JAVASCRIPT
  • CSS
  • RAW

2개의 마크업markup 템플릿 모드(HTML and XML), 3개의 텍스쳐textual 템플릿 모드 (TEXTJAVASCRIPT, CSS) 그리고 no-op 템플릿 모드 (RAW).

HTML 템플릿 모드는 HTML5, HTML 4 and XHTML을 포함하여 어떤 종류의 HTML 마크업 입력을 허용합니다. 제대로 구조화 했는지 확인하는 마크업 유효성검사를 수행하지않습니다. 템플릿 마크업 코드구조는 출력시 가장 큰 가능성을 가진 규모biggest possible extent를 존중할 것입니다.

다른 템플릿 모드에 대한 자세한 설명은 Thymeleaf 3.0 Template Mode set을 확인하세요.

또한 https://github.com/jmiguelsamper/thymeleaf3-template-modes-example에서 새 템플릿 모드에 대한 간단한 예제를 확인할 수 있습니다.


텍스쳐 템플릿 모드 Textual template modes

타임리프에 추가된 새로운 텍스쳐 템플릿 모드는 CSSJavascript 와 plain text를 출력할 수 있습니다. 당신의 CSS와 자바스크립트 파일들에 서버사이드 변수값을 사용하거나, 이메일 작성과 같은 plain text를 만들기 더 쉽게 되었습니다.

텍스쳐 모드에 대한 타임리프의 모든 기능을 활용하기 위해  새로운 신텍스syntax가 소개되었습니다 예를 들어, 당신은 이와 같이 iterate할 수 있습니다:

[# th:each="item : ${items}"]
    - [# th:utext="${item}" /]
[/]

이 새로운 신텍스에 대한 자세한 설명은 New syntax for textual template modes에서 확인하세요

향상된 인라인 메카니즘 Improved inlining mechanism

다음과 같이 추가적인 태그나 속성을 사용하지 않고 데이터를 손쉽게 출력할 수 있습니다:

<p>This product is called [[${product.name}]] and it's great!</p>

인라인inlining 이라 부르는 이 기능이 상당히 향상되어, 이제 타임리프3에서 훨씬 더 나은 지원이 가능하게 되었습니다. 자세한 정보는 Inlined output expressions를 확인하세요

현존의 인라인 메카니즘 또한 새로운 템플릿 보드에서 잘 작동합니다. 사실 th:inline="text" 속성은 더이상 필요하지 않습니다 왜냐하면 인라인은 이제 HTML 모드 그 자체이기 때문입니다. 자세한 정보는 Refactoring of the inlining mechanism에서 확인하세요

성능 향상 Performance improvements

타임리프 3.0의 주요한 성취는 이전 버전에서 항상 제기되었던 성능의 향상입니다.  2.1 버전까지의 XML기반의 템플릿엔진으로 수많은 훌륭한 강력한 기능들을 구현할 수 있었지만, 때때로 성능의 문제가 있었습니다. 타임리프 랜더링에 걸리는 시간이 많은 주요 프로젝트에서 무시되어 왔지만, 이 위험부담은 (수천개의 열을 가진 테이블을 다루는 고부하가 걸리는 웹사이트와 같은) 특별한 성격을 가지는 프로젝트에서 현저히 드러났습니다. 

타임리프 3 엔진은 성능에 집중하여 처음부터 다시 구현되었습니다. 타임리프3의 성능은 이전버젼보다 훨씬 더 향상되었으므로, 우리는 더욱 더 많은 프로젝트들의 다양한 요구사항을 맞출 수 있게 되었습니다. 그러나 타임리프의 성능은 단지 랜더링 시간뿐만 아니라 더 낮은 메모리 사용과 높은 병렬처리가 필요한 시나리오에 지연시간을 줄일 수 있도록 특별히 디자인되었습니다.

새로운 타임리프 3 아키텍쳐에 대한 기술적 논의는  New event-based template processing engine를 확인하세요

새로운 다이얼렉트 시스템 New Dialect system

타임리프3는 새로운 다이얼렉트 시스템을 특징지었습니다. 만일 이전 버전의 타임리프에서 이 타임리프 다이얼렉트를 개발하려면, 이것을 타임리프3 호환 가능하게 만들어줘야 할 것입니다.

새로운 다이얼렉트 인터페이스는 정말로 간단합니다...

public interface IDialect {
 
    public String getName();
 
}

…그러나 당신이 구현할 IDialecte의 구체적인 서브인터페이스에 의존하여 수많은 기능을 추가할 수 있습니다. 

새로운 다이얼렉트 시스템의 몇가지 기능을 정리해보자면:

  • 처리자processors 뿐만 아니라 선처리자pre-processors 와 후처리자post-processors가 있어 템플릿 컨텐트를 처리 전, 처리 후에 수정이 가능해졌다. 예를 들어, 캐시된 내용을 제공하기위해 선처리자를 사용하고, 출력물을 압축하고 최소화하기위해 후처리자를 사용할 수 있다.
  • 다이얼렉트 우선권Dialect precedence는 다이얼렉트를 가로지르는 프로세서들을 분류할 수 있는 새로운 개념입니다. 프로세서 Processor precedences 이제 다이얼렉트 우선권과 관련있는 걸로 간주되어 특정 다이얼렉트에 있는 모든 프로세서를 단지 다이얼렉트 우선권의 올바른 값을 설정하는 것만으로 다른 다이얼렉트로 부터의 어떤 프로세스 이전에 실행되도록 설정할 수 있습니다.
  • 객체 표현식 다이얼렉트Expression object dialects 는 새로운 객체 표현식 또는 유틸리티 객체 표현식을 제공하여 표준 다이얼렉트가 제공하는  #strings#numbers#dates와 같은 표현식을 템플릿의 어디에서나 사용할 수 있습니다. 
  • provide new expression objects or expression utility objects that can be used in expressions anywhere in templates, such as the #strings#numbers#dates, etc. provided by the Standard Dialect.

이들 기능에 대한 자세한 설명을 다음을 확인하세요:

Core API의 리펙토링 Refactoring of the core APIs

The core API는 아주 많이 리펙터되었습니다. 다음의 디테일을 확인하세요:

결 론 Final thoughts

Thymeleaf 3는 수많은 시간을 들여 공들여 작업한 지난 4년간의 타임리프 템플릿 엔진 프로젝트의 주요한 성과입니다. 훌륭한 새 기능들과 보이지 않는 곳에서의 수많은 성능 향상을 이루어냈습니다.

우리는 이 업데이트가 당신의 프로젝트에 꼭 필요한 요소들을 갖추도록 맞춰왔습니다. 그러니 이것을 시도해보는 것을 망설이지 마시고 피드백을 보내주세요!



반응형

'ReleaseNotes' 카테고리의 다른 글

스프링 부트 1.5 릴리즈 노트  (0) 2017.07.21
스프링 부트 1.4 릴리즈 노트  (0) 2016.08.06
Spring Boot 1.3.0 릴리즈 노트  (0) 2015.11.18
Spring Boot 1.2 릴리즈 노트  (0) 2015.11.18
Spring Boot 1.1 릴리즈노트  (0) 2015.11.18

+ Recent posts