[java] JSP에서의 템플릿 엔진 사용하기

JavaServer Pages(JSP)는 서버 사이드에서 동적 웹 페이지를 생성하는 데 사용되는 Java 표준 기술입니다. JSP를 사용하면 HTML과 Java 코드를 혼합하여 정적 콘텐츠 및 동적 데이터를 처리할 수 있습니다. 그러나 JSP는 간단한 작업에는 유용하지만 복잡한 비즈니스 로직을 처리하기에는 제한적일 수 있습니다.

이러한 경우에는 JSP에 템플릿 엔진을 사용하여 더욱 강력한 동적 웹 애플리케이션을 개발할 수 있습니다. 템플릿 엔진은 JSP에서 프리젠테이션 로직과 비즈니스 로직을 분리하는 데 도움을 주며, 템플릿 파일과 데이터를 결합하여 동적으로 생성된 결과를 출력할 수 있습니다.

1. 템플릿 엔진의 종류

Java에서는 다양한 템플릿 엔진을 사용할 수 있습니다. 가장 인기 있는 템플릿 엔진 중 하나는 Thymeleaf입니다. Thymeleaf는 JSP와 유사한 문법을 사용하며, HTML 파일에 템플릿 속성을 추가하여 동적으로 변경될 부분을 지정할 수 있습니다.

또 다른 인기 있는 템플릿 엔진으로는 Freemarker와 Velocity가 있습니다. 이들은 JSP와는 다른 문법을 사용하며, 컴파일 없이 동적으로 템플릿을 렌더링할 수 있습니다.

2. 템플릿 엔진의 사용법

템플릿 엔진을 JSP에 사용하는 방법은 각각의 엔진에 따라 다를 수 있지만, 일반적으로 다음과 같은 단계를 따릅니다:

2.1. 의존성 추가

프로젝트의 의존성에 템플릿 엔진 라이브러리를 추가해야 합니다. Maven을 사용한다면 pom.xml 파일에 다음과 같이 의존성을 추가할 수 있습니다:

<dependencies>
    <!-- Thymeleaf -->
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf</artifactId>
        <version>3.0.12.RELEASE</version>
    </dependency>

    <!-- Freemarker -->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.31</version>
    </dependency>

    <!-- Velocity -->
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity</artifactId>
        <version>1.7</version>
    </dependency>
</dependencies>

2.2. 템플릿 파일 작성

템플릿 엔진을 사용하려면 템플릿 파일을 작성해야 합니다. 파일은 엔진에 따라 다른 문법을 사용할 수 있습니다. 다음은 Thymeleaf를 사용하는 경우의 예시입니다:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>템플릿 엔진 사용하기</title>
</head>
<body>
    <h1>Hello, <span th:text="${name}">World</span>!</h1>
</body>
</html>

2.3. 엔진 설정

엔진을 설정하기 위해 JSP 파일에서 해당 엔진을 사용하도록 선언해야 합니다.

Thymeleaf 사용하기

web.xml 파일에 다음과 같이 ThymeleafViewResolver를 추가합니다:

<bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine"/>
    <property name="characterEncoding" value="UTF-8"/>
</bean>

<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver"/>
</bean>

<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    <property name="prefix" value="/WEB-INF/templates/"/>
    <property name="suffix" value=".html"/>
    <property name="templateMode" value="HTML"/>
</bean>

Freemarker 사용하기

web.xml 파일에 다음과 같이 FreeMarkerViewResolver를 추가합니다:

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="order" value="1"/>
    <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
    <property name="prefix" value="/WEB-INF/templates/"/>
    <property name="suffix" value=".ftl"/>
</bean>

Velocity 사용하기

web.xml 파일에 다음과 같이 VelocityLayoutViewResolver를 추가합니다:

<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
    <property name="order" value="1"/>
    <property name="layoutUrl" value="/WEB-INF/templates/layout.vm"/>
    <property name="prefix" value=""/>
    <property name="suffix" value=".vm"/>
</bean>

2.4. 컨트롤러 작성

컨트롤러는 엔진에서 렌더링할 템플릿 파일을 선택하고 데이터를 전달하는 역할을 합니다.

Thymeleaf 사용하기

@Controller
public class MyController {

    @RequestMapping("/")
    public String index(Model model) {
        model.addAttribute("name", "John Doe");
        return "index";
    }
}

Freemarker 사용하기

@Controller
public class MyController {

    @RequestMapping("/")
    public String index(Model model) {
        model.addAttribute("name", "John Doe");
        return "index";
    }
}

Velocity 사용하기

@Controller
public class MyController {

    @RequestMapping("/")
    public String index(Model model) {
        model.addAttribute("name", "John Doe");
        return "index";
    }
}

3. 결과 확인

위의 단계를 모두 수행한 뒤 웹 애플리케이션을 실행하면 템플릿 엔진에서 동적으로 생성된 웹 페이지를 확인할 수 있습니다.

이처럼 JSP에 템플릿 엔진을 사용하면 더욱 강력하고 유연한 웹 애플리케이션을 개발할 수 있습니다. 각 템플릿 엔진의 문법과 기능에 익숙해지면 웹 애플리케이션의 프리젠테이션 측면을 더욱 효과적으로 제어할 수 있을 것입니다.

참고 자료