본문 바로가기

Spring

스프링에서 프리마커 사용해보기..

spring에서 freemarker 사용해 보기..
그냥 간단하게 사용해 보았다..

(아놔 이거 하고 있을 때 아닌데..괜히 손 대었다가 ㅠㅠ)

프리마커는..음.. UI단의 프레임워크라고 하면 될까..?

일단, 시작 해보자..

기본적인 spring의 설정은 되어있다고 가정하고..
[servletname]-serviet.xml은 action-config.xml로 설정한다.

우선은 라이브러리를 카피해야 하는데, freemarker.jar를 webapp lib에 넣는다.
spring 2.5.5를 받았다면 그 안에서 찾을 수 있다.

그리고, actions-config.xml을 설정한다.
(servletDispatcher가 바라보는 [servletname]-servlet.xml이랑 같은 녀석이다.. 이름만 다를뿐)

<!-- freemarker config -->
 <bean id="freemarkerConfig"
  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
  <property name="defaultEncoding" value="UTF-8" />
  <property name="freemarkerVariables">
   <map>
    <entry key="xml_escape" value-ref="fmXmlEscape" />
   </map>

  </property>
 </bean>

 <bean id="fmXmlEscape" class="freemarker.template.utility.XmlEscape" />

 <!--
  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="contentType" value="text/html; charset=UTF-8" />
  <property name="suffix" value=".ftl" />
  <property name="exposeSpringMacroHelpers" value="true" />
 </bean>



설정의 전부를 알지는 못하는데...
일단 , templateLoaderPath는 프리마커 템플릿 파일이 위치 할 곳을 지정한다고 보면 된다.
defaultEncoding 은 인코딩인데 resolver에도 인코딩 시켜주는 부분이 있다. 처음에는 resolver에서만 인코딩 설정을 해주었는데 계속 한글이 깨지길래 FreeMarkerConfigurer에도 설정 해주니 한글이 정상적으로 나왔다..

근데 뭔가 이상하긴 하다.. 저렇게 이중으로 설정하도록 만들어놨을까..? -_-ㅋ

그리고 freemarker.template.utility.XmlEscape 이게 무슨 역할을 하는건지는 아직 레퍼런스를 찾아보지는 못 했다....


일단,

  <property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
  <property name="defaultEncoding" value="UTF-8" />

요 두개만 설정해도 잘 돌아가긴 한다...


그리고 freemarker/welcome.ftl 파일을 만들어 놓는다.


그 다음 controller를 만들어보자.

@Controller
public class FreeMarkerTestController {
 Log logger = LogFactory.getLog(FreeMarkerTestController.class);

 @SuppressWarnings("unchecked")
 @RequestMapping("/welcome.gs")
 public ModelAndView test(HttpServletRequest request, HttpServletResponse response) throws Exception {
  HashMap map = new HashMap();
  map.put("key1","value1");
  map.put("key2", new Long(3L));

  logger.debug("in cotroller...");

  List list = new ArrayList();
  list.add("list1");
  list.add("list2");
  list.add("list3");
  list.add("list4");

  map.put("key3",list);

  String requestString = "myString";
  long requestLong = 5L;

  request.setAttribute("requestString",requestString);
  request.setAttribute("requestLong",requestLong);

  return new ModelAndView("/welcome","welcomeMap",map);

 }



몇가지 데이터 출력의 예를 살펴보기 위해 map과 list 그리고 request에 String과 long형을 담는다.

welcome.ftl을 만들어보자.

맵객체 꺼내기
${welcomeMap.key1}
${welcomeMap.key2}

request에서 값 받기
requestString : ${Request.requestString}
requestLong : ${Request.requestLong}

맵에 있는 list의 값 꺼내기
welcomeMap.key3[0] : ${welcomeMap.key3[0]}
welcomeMap.key3[1] : ${welcomeMap.key3[1]}
welcomeMap.key3[2] : ${welcomeMap.key3[2]}
welcomeMap.key3[3] : ${welcomeMap.key3[3]}

list 루프 돌려보기
 <#list welcomeMap.key3 as x3>
  ${x3}
  <#if x3 = "list3"><#break></#if>
</#list>


이렇게 하고 해보면 값들이 나오게 된다..

간단한 설정으로 사용 할 수 있는데, 까옥과장님 말씀으로는 그냥 java , jsp 익숙한 사람이
혼자 개발 할 때는 jsp로 하는게 훨씬 빠르다고 한다. 이거는 그냥 jsp와 java를 모르는 사람도 간단한 reference만으로도 데이터 구조만 알면 프론트 작업에 투입이 가능하다는 점이 장점으로 작용 될 수 있다고 합니다.

그외에도.. mvc를 강제 시켜 버리는 효과도 있을 것 같습니다.

일단 해보는게 목적이어서.. 저런 자세한 설정들은 좀 더 찾아봐야겠습니다..

혹시 아시는  분은 덧글로 알려주세요~~~


아... 만약

resolver가 이미

 <!-- bean id="jspViewResolver"
  class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" p:cache="true" p:order="0" /-->


이런식으로 설정 되어 있다면 없애주셔야 제대로 ftl 파일을 찾아가더군요..


<참고: controller와 ftl의 소스 일부는 kkaok 님의 소스를 참고하였습니다.>