Spring에서 Freemarker 사용하기
- Spring은 Freemarker 2.3이상을 지원합니다.
- 사용하는 방법은 간단합니다.
0. 라이브러리 추가.
클래스패스에 freemarker.jar 파일을 추가해 줍니다. 이 파일은 spring-with-depedencies를 받으셨다면, lib에 freemarker에 있습니다.
1. XXX-servlet.xml에 뷰 리졸버와 프리마커 Configurer 객체를 세팅하는 FreeMarkerConfigurer 빈 등록하기
<!-- freemarker config -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/freemarker/"/>
</bean>
<!--
View resolvers can also be configured with ResourceBundles or XML files. If you need
different view resolving based on Locale, you have to use the resource bundle resolver.
-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="cache" value="true"/>
<property name="prefix" value=""/>
<property name="suffix" value=".ftl"/>
</bean>
끝. 매우 간단합니다. freemarkerConfig 빈은 프리마커의 Configuration 객체를 대변하는 객체로 이 객체다가 Configuration 객체에 필요한 설정을 하듯이 세터를 사용해서 설정하면 됩니다. 이 객체는 다른 컴포넌트들에게 공유될 객체가 아니라 순수하게 프리마커 설정을 하기 위해서 사용되는 빈입니다. 따라서 id는 없어도 됩니다. 그리고 FreeMarkerConfigurer 이 빈의 상위 클래스가 제공하는 setFreemarkerVariables 세터를 사용해서 프리마커 탬플릿에서 자주 사용하는 맵 객체를 세팅할 수도 있습니다. 또한 탬플릿 파일들의 기본 위치를 지정해야합니다. 그렇기 때문에 아래에 있는 viewResolver에서 prefix를 굳이 줄 필요가 없습니다.
FreeMarkerViewResolver에서는 인코딩을 설정할 수 있습니다. 위와 같이 레퍼런스에 나와있는 기본 설정대로 하면, 한글이 깨집니다. 그래서 contentType 속성에 text/html; charset=UTF-8 값을 설정해 줍니다.
저는 다음과 같이 설정했습니다.
<property name="templateLoaderPath"
value="/WEB-INF/freemarker/" />
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape" />
</map>
</property>
</bean>
<bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="contentType" value="text/html; charset=UTF-8" />
<property name="suffix" value=".ftl" />
</bean>
그리고 레퍼런스에서 스프링이 제공하는 커스텀 지시자를 사용하려면 페이지 위에 <#import "spring.ftl" as spring /> 이렇게 추가하라고 나와있는데, 제 경우에는 그렇게 하면 못 찾더군요. <#import "/spring.ftl" as spring /> 이렇게 /를 추가해주어야 클래스 패스(spring.jar안에 모모모 패키지에 들어있습니다.)에 있는 탬플릿 파일을 찾아서 사용할 수 있었습니다.