본문 바로가기
카테고리 없음

[Freemarker] 데이터 모델 메소드 (Data model Methods) 정의

by 왕 달팽이 2019. 8. 8.
반응형

사용자의 자바 객체를 데이터 모델로 사용할 때, 데이터 모델을 위한 메소드를 만들어 제공할 수도 있다. 예를 들어 템플릿을 작성할 때 데이터 모델에 'user_,method()'라는 메소드를 정의해 줄 수 있다. 'user_method()'는 템플릿에서 다음과 같이 사용할 수 있다.

 

${user_method(“abc”, x)}

 

이와 같은 사용자 정의 메소드는 TemplateMethodModelEx 인터페이스를 구현함으로써 제공할 수 있다. TemplateMethodModelEx 인터페이스는 다음과 같은 메소드를 가지고 있다.

 

Object exec(java.util.List arguments);

 

템플릿 언어에서 사용자 정의 메소드를 호출하면, 메소드 이름에 대응되는 TemplateMethodModelEx 구현체의 exec() 메소드가 수행된다. 이 때, 사용자 정의 메소드에 입력된 파라미터들이 java.util.List에 담겨서 exec() 메소드에 전달된다. 

 

TemplateMethodModelEx 인터페이스를 구현한 사용자 정의 메소드를 살펴보자. 

 

import java.util.List;
import freemarker.template.SimpleNumber;
import freemarker.template.TemplateMethodModelEx;
import freemarker.template.TemplateModelException;

public class TestAdder implements TemplateMethodModelEx {

    @Override

    public Object exec(List arguments) throws TemplateModelException {

        if (arguments == null)
            throw new TemplateModelException();

        int sum = 0;
        for (Object elem : arguments) {
            SimpleNumber number = (SimpleNumber)elem;
            sum += number.getAsNumber().intValue();
        }
        
        return sum;
    }
}

 

파라미터로 Number 타입을 입력받아서 모두 더한 값을 리턴해주는 메소드 타입이다. 이 클래스를 구현하여 

 

root.put("adder", new TestAdder());

 

데이터 모델에서 루트의 자식으로 메소드 이름에 설정을 해주면 된다. 이 데이터 모델을 사용하는 템플릿에서 다음과 같이 위에서 구현한 사용자 정의 메소드를 호출 할 수 있다. 

 

${adder(1,2,3)}

 

이외에 TempateDirectiveModel 인터페이스를 구현하여 사용자 정의 디렉티브를 만들어 제공할 수도 있다. 이 내용은 너무 깊게 들어가는 것 같으니 이 포스트에서 다루지는 않을 예정이고, 프리마커 메뉴얼의 가이드 문서를 참고하길 바란다. 

반응형

댓글