freemarker (개념, jsp와 차이, 문법, spring과 연동 설정, 예제)

2021. 3. 22. 02:54 Template Engine/Thymeleaf, Freemarker

참조문서 : https://freemarker.apache.org/docs/index.html

1. freemarker란?

템플릿 엔진이다. 자바 객체에서 데이터를 생성해서 템플릿에 넣어주면 freemarker에서 템플릿에 맞게 변환하여 HTML 파일을 생성한다. 다른언어도 쓸 수 있지만, JVM 위에서 돌아가므로 주로 자바 서블릿에서 많이 쓴다. freemarker는 HTML 출력만을 위한 엔진은 아니고 텍스트라면 그 어떠한 것도 가능하다. 어떠한 포맷이라도 텍스트에서 텍스트로 변환해서 출력하기 때문이다.freemarker는 웹기반 프레임워크가 아니고 완전한 POJO기반 템플릿 엔진이다. .java + .ftl = .html 이다. 비슷한 템플릿 엔진으로는 velocity 가 있다.

장점 : JSP의 가장 큰 단점을 극복

JSP를 기반으로 EL, JSTL을 사용해도 view를 mvc구조로 아름답게 짤 수 있지만, Java EE에 종속적이라는 단점이 있다.

2. 문법

자세한 문법은 잘 정리된 문서를 보자

기본

  • FTL tag : <# >
  • 주석 : <#-- comment -->
  • <#list [Object code에서 key값 ] as [별칭할 값]>
  • 조건문 : <#if>
  • for 문
  <#list  1..10  as i > 
      ${i}
  <#assign i=i+1?int>
  • 변수 재정의 : <#setting [변수1]=[변수2]> , <#assign x=0>
  • 변수 선언, 할당 : <#assign x=0>
  • int형으로 변수 선언 : <#assign x=0 ? int>
  • x값을 출력 : ${x}

3. freemarker 설정

freemarkerConfig

  • templateLoaderPath : 프리마커 템플릿 경로 지정
  • defaultEncoding
  • freemarkerSettings : 프리마커 세부 설정을 지정

FreeMarkerViewResolver

  • contentType : 기본 컨텐츠타입을 지정
  • cache : 캐시 사용 여부
  • prefix : 뷰 페이지 경로를 지정
  • suffix : 뷰 페이지 확장자명을 입력. 입력하지 않으면 확장자까지 컨트롤러에서 해줘야함

설정 예제

pom.xml

<!-- freemarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker-gae</artifactId>
    <version>2.3.23</version>
</dependency>

applicationContext.xml

<!-- FreeMarker configuration -->
<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="freemarkerSettings">
        <map>
            <entry key="template_update_delay" value="60000"/>
            <entry key="auto_flush" value="false"/>
            <entry key="default_encoding" value="UTF-8"/>
            <entry key="whitespace_stripping" value="true"/>
        </map>
    </property>
</bean>

dispatcher-servlet.xml

<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="order" value="2" />
    <property name="cache" value="true" />
    <property name="suffix" value=".ftl" />
    <property name="contentType" value="text/html; charset=UTF-8" />
    <property name="exposeSpringMacroHelpers" value="true" />
</bean>

 

4. hello world

/WEB-INF/freemarker/hello.ftl

<#ftl encoding="utf-8"/>

<html>
<head>
    <title>네이바 프리마카</title>
</head>
<body>
    <h1>컨트롤러의 메세지: ${message}</h1>
</body>
</html>

HelloController.java

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {
    @RequestMapping("/hello")
    public ModelAndView hello(){
        String message = "프리마커를 해보자~";
        System.out.println("콘솔추울력");

        ModelAndView mv = new ModelAndView();
        mv.setViewName("hello");
        mv.addObject("message", message);
        return mv;
    }
}



출처: https://sjh836.tistory.com/132?category=680970 [빨간색코딩]