2016년 9월 27일

Spring 기반 웹 프로그램 개발 Part 2 - Freemarker 사용하기

Spring MVC 의 장점중 하나는 여러 가지 View(JSP, Velocity, Freemarker .. 등) 기술을 손쉽게 사용할 수 있다는 점이다. 어떤기술의 View 를 사용하는 것은 개발자의 개인적인 취향이겠지만 과거부터 freemarker 기술을 사용해왔기 때문에 지금도 Freemarker 를 선호하고 있다. 

1. 환경 만들기 


  • Spring MVC 4.3.2.RELEASE
  • Freemarker 2.3.25-incubating 

Maven 을 사용하고 있어 프로젝트 pom.xml 파일 다음의 의존성을 추가한다.


      org.springframework
         spring-webmvc
        4.3.2.RELEASE
  
  
   org.springframework
   spring-context
   4.3.2.RELEASE
    
  
   org.springframework
   spring-context-support
   4.3.2.RELEASE
   test
  
  
    org.freemarker
    freemarker
    2.3.25-incubating
  


2. 설정

기본적으로 설정은 어노테이션 또는 xml 방식이 있는데 개인적으로 xml방식을 더 선호하여 여기에서는 xml 방식으로 기술하였다. Freemarker 설정 context파일을 추가한다.
아래의 설정은 WEB-INF/template/ftl 경로에 freemarker 파일들이 위치하는 것으로 가정하였다.

freemarkSubsystemContext.xml




 
 
 
   
   
   
  
   
    
    
    
       
    
  
  
   
    /spring.ftl as spring
   
  

 
 

   



위의 설정은 ViewResolver 부문이 제외되어 있는데 이부분은 아래와 같이 설정을 추가하면 된다. 이부분을 분리하여 기술한 것의 앞의 설정은 대부분의 경우에 수정이 요구되지 않지만 ViewResolver 는 프로젝트 환경에 따라 수정이 필요하여 분리하여 기술하였다.
servlet-context.xml


  

   
  

   
  

  
  

  
  
  
  
  
  
  
  
  
  
 

  
  
     
     
     
     
      
     
    
    
      
   



viewClass 는 org.springframework.web.servlet.view.freemarker.FreeMarkerView 클래스를 확장하여 다음과 같은 방법으로 손쉽게 만들수 있다.
sample.spring.freemarker.SampleFreeMarkerView.java
package sample.spring.freemarker;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.servlet.view.freemarker.FreeMarkerView;

import freemarker.ext.beans.BeansWrapper;
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateModelException;

/**
 * 스프링프레임워크에서 디폴트롤 사용하고 있는 FreeMarkerView 클래스를 커스터마이징함.
 * 
 * 
 * @author donghyuck
 *
 */
public class SampleFreeMarkerView extends FreeMarkerView {

 
 protected void exposeHelpers(Map model, HttpServletRequest request) throws Exception {
  BeansWrapper wrapper = (BeansWrapper)getObjectWrapper();
  populateStatics(wrapper, model);
 }

 
 /**
  * 모든 freemarker 템플릿에서 사용하게될 유틸리티들을 정의한다.
  * 
  * @param wrapper
  * @param model
  */
 public void populateStatics(BeansWrapper wrapper, Map model){
  
  /**
   * 정적 Util / Helper 클래스들을 추가하여 ftl 파일에서 쉽게 필요한 유틸리티들을 사용할 수 있도록 한다. 
   */
  TemplateHashModel staticModels = wrapper.getStaticModels();
  try { 
   model.put("SecurityHelper", staticModels.get("neuro.honeycomb.util.SecurityHelper"));
   model.put("ApplicationContextHelper", staticModels.get("neuro.honeycomb.util.ApplicationContextHelper"));
   model.put("WebApplicationContextUtils", staticModels.get("org.springframework.web.context.support.WebApplicationContextUtils"));   
  } catch (TemplateModelException e) {
   
  } 
  
  model.put("statics", BeansWrapper.getDefaultInstance().getStaticModels());  
  
 }
}


3. 사용하기

이제 남은 것은 Spring Controller 가 FreeMarker 템플릿를 사용하여 화면을 출력하도록 하는 것이다. 사실 이부분이 지루한 부분이다.



댓글 없음:

댓글 쓰기