본문 바로가기
Spring

Freemarker(프리마커) 안전하게 사용하기

by 향로 (기억보단 기록을) 2016. 8. 5.
반응형

Freemarker(프리마커)는 현재 Java 진영에서 가장 대중적인 View Template Engine이다. 

(공식사이트)


JSTL이나 Velocity같은 경우 업데이트가 이미 2~3년 전에 정지된 상태이고, Handlbar.java나 Thymeleaf는 아직까지 널리 퍼지진 않아서 많은 회사에서 사용중이다. (JSP 사용중이라면... 신규 프로젝트는 Freemarker로 바꾸자 아니면 Handlebar.java도 괜찮다)


공식 레퍼런스가 굉장히 잘되어있고, 기능도 좋아 거의 모든 프로젝트에서 Freemarker를 사용중인데 실제 서비스에서 사용하려면 몇가지 안전장치가 필요하여 소개한다.
(문법이나 소개글이 필요하다면 여기를 참고하자)


모든 코드는 Github에서 관리중이니 코드를 보면서 읽으면 더욱 이해하기 쉬울것같다.


어찌됐든 이제 하나하나 상황을 들어보겠다.

예를 들어 아래와 같이 여러 freemarker 파일을 합쳐서 하나의 화면을 구성해야한다고 가정해보자.

이런 경우가 없다고 생각할수 있겠지만 하나의 freemarker로 하나의 화면을 구성하는일은 실제 서비스에서 거의 없다. 

단적인 예로 GNB (Global Navigation Bar : 상단 메뉴버튼),  Footer (하단 소개영역) 등과 같이 공통된 영역의 경우는 각각 하나의 freemarker 파일을 만들어 여러 페이지에서 include 하여 사용하기 때문이다.


아래 화면을 보자.

(클라이언트 화면)


(사용한 코드: index.ftl)


(high.ftl)


(controller - 일부러 null을 주었다. 그결과는...)


index.ftl을 index페이지의 메인 영역이라 보고 higt.ftl과 low.ftl을 공통영역으로 보면 될것 같다.

코드를 보면 알겠지만 high.ftl과 low.ftl을 include 해서 사용하고 있다.

헌데 이방식에는 아주아주 큰 문제가 있다.


include되는 high.ftl과 low.ftl중 하나만 문제가 있어도 화면 전체가 나오지 않는 것이다.

실제 상용서비스에서 이런일은 절대 절대! 있어선 안될일이다. 

만약 정말 QA단계에서 발견하지 못했던 문제가 발생해 하나의 파일에서 문제가 생겼다 하더라도 해당 파일이 담당하는 영역만 나오지 않아야 한다.


(Hell!!!)


자 그래서 이 문제를 해결하기 위해 freemarker의 사용 방법을 조금 바꿔보자.

freemarker가 만드는 결과물이 결국은 HTML을 그리는 문자열이다. 이를 이용해서

1) template(html을 만드는 과정) 를 view에 맡기지 않고, 미리 하자 (pre-compile)

2) template 결과가 success 이면 정상적으로 추가한다.

3) template 결과가 error이면 빈 문자열로 대체하자


위 내용을 코드로 적용하면 아래와 같다.


(template 메소드를 추가한 Controller 코드)


38 ~ 41 Line : high.ftl에서 사용할 데이터를 map으로 만들고 이를 template의 인자값으로 넣어준다.

47 ~ 48 Line : Java 코드내에서 freemarker파일을 호출하기 위해선 Configuration 객체가 필요하기 때문에 이를 선언하고, 기본 패스를 /templates/로 지정하였다.

50 Line : 사용할 freemarker파일 호출

51 ~ 52 Line : template.process()가 우리가 원하는 pre-compile 메소드인데 해당 메소드에는 인자로 템플릿에서 사용할 데이터와 그 결과를 담을수있는 writer객체가 필요하다. 우린 String으로 리턴을 시킬것이기 때문에 StringWriter를 사용했다.

55 ~ 57 Line : try catch로 에러가 발생할 경우 빈문자열을 리턴하도록 하였다. data가 잘못되었거나 process 메소드에 문제가 있을 경우에 pre-compile이 실패하면서 exception을 발생시키는데 이때, 최소한 빈 문자열이 보장이 된다.


이렇게 코드를 짜고 결과를 돌려보면!!


(코드 수정후 결과화면)


짜잔!


에러가 발생하는 "High content" 내용이 없어지고 나머지 freemarker로 구성된 화면을 볼수있다.


다음시간에는 여기에서 다양한 조건으로 템플릿 해야하는 상황에서 어떻게 freemarker를 사용하면 좀더 유연하고, 확장성있는 개발을 할 수있는지에 대해 소개하겠다.




반응형