Spring Boot는 다양한 템플릿 엔진과의 통합을 지원하며, 그 중에서도 FreeMarker는 동적 페이지 생성 및 정적 파일 렌더링에 효과적으로 사용할 수 있는 강력한 도구입니다. 본 문서에서는 Spring Boot 환경에서 FreeMarker를 설정하고 활용하는 방법을 다룹니다.
FreeMarker로 JSP 대체하기
JSP를 대신해 더 간결하고 유지보수에 용이한 템플릿 엔진이 필요할 때 FreeMarker는 좋은 선택지가 됩니다. 먼저, 프로젝트에 FreeMarker 의존성을 추가해야 합니다. Maven 기준으로 다음과 같은 설정을 pom.xml에 포함합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
의존성 추가 후, Spring Boot는 자동으로 src/main/resources/templates 디렉터리 내에 위치한 .ftl 확장자 파일을 템플릿으로 인식합니다. 예를 들어, 다음과 같은 기본 템플릿 파일 greeting.ftl을 생성할 수 있습니다.
<!DOCTYPE html>
<html>
<head><title>Greeting</title></head>
<body>
<h1>안녕하세요, ${name}님!</h1>
<p>현재 시간: ${now?datetime}</p>
</body>
</html>
다음으로 컨트롤러를 작성하여 모델 데이터를 전달합니다.
@Controller
public class GreetingController {
@RequestMapping("/greet")
public String showGreeting(Model model) {
model.addAttribute("name", "홍길동");
model.addAttribute("now", new Date());
return "greeting";
}
}
애플리케이션을 실행하고 http://localhost:8080/greet에 접속하면 위 템플릿이 렌더링된 HTML 페이지를 확인할 수 있습니다.
정적 파일 생성하기
최근에는 서버 사이드 렌더링보다 API 중심 아키텍처가 일반화되면서, FreeMarker를 정적 콘텐츠 생성 용도로 활용하는 사례도 많습니다. 예를 들어, 자주 변경되지 않는 웹 페이지를 미리 HTML 파일로 생성하여 CDN을 통해 배포할 수 있습니다.
아래 코드는 FreeMarker 템플릿을 기반으로 로컬 디스크에 정적 HTML 파일을 생성하는 예시입니다.
@RestController
public class StaticPageGenerator {
@Autowired
private Configuration freemarkerConfig;
@GetMapping("/generate")
public ResponseEntity<String> generateStaticPage() throws IOException, TemplateException {
Map<String, Object> data = new HashMap<>();
data.put("name", "김철수");
data.put("now", new Date());
Template template = freemarkerConfig.getTemplate("greeting.ftl");
String htmlContent = FreeMarkerTemplateUtils.processTemplateIntoString(template, data);
Path outputPath = Paths.get("generated/greeting.html");
Files.createDirectories(outputPath.getParent());
Files.writeString(outputPath, htmlContent, StandardCharsets.UTF_8);
return ResponseEntity.ok("정적 파일 생성 완료: " + outputPath.toAbsolutePath());
}
}
이 방식을 사용하면 일정 주기로 혹은 관리자 요청 시에 정적 페이지를 자동 생성하여 성능 최적화와 트래픽 분산에 활용할 수 있습니다.
추가 고려사항
- 템플릿 캐싱: 운영 환경에서는 템플릿 캐싱을 활성화하여 성능을 향상시켜야 합니다. Spring Boot는 기본적으로
spring.freemarker.cache=true로 설정합니다. - 인코딩: 한글 출력을 위해
spring.freemarker.charset=UTF-8및spring.freemarker.response-character-encoding=UTF-8설정을 권장합니다. - 예외 처리: 템플릿이 존재하지 않거나 데이터 형식 오류 시 적절한 예외 처리 로직을 구현해야 합니다.