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

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

반응형

댓글