스프링 부트(spring boot)를 사용한다면 타임리프(thymeleaf)의 식 객체(expression object)를 쉽게 확장할 수 있다. 먼저 식 객체를 생성해주는 타임리프 IExpressionObjectDialect를 구현한다. 이 클래스를 스프링 빈으로 등록해야 한다. 아래 예는 @Component를 붙여 컴포넌트 스캔 대상으로 설정했다.
import java.util.Collections;
import java.util.Set;
import org.springframework.stereotype.Component;
import org.thymeleaf.context.IExpressionContext;
import org.thymeleaf.dialect.AbstractDialect;
import org.thymeleaf.dialect.IExpressionObjectDialect;
import org.thymeleaf.expression.IExpressionObjectFactory;
@Component
public class MyFormatDialect extends AbstractDialect implements IExpressionObjectDialect {
protected ScgFormatDialect() {
super("myFormat");
}
@Override
public IExpressionObjectFactory getExpressionObjectFactory() {
return new IExpressionObjectFactory() {
@Override
public Set<String> getAllExpressionObjectNames() {
return Collections.singleton("scgFormat");
}
@Override
public Object buildObject(IExpressionContext context, String expressionObjectName) {
return new MyFormat();
}
@Override
public boolean isCacheable(String expressionObjectName) {
return true;
}
};
}
}
getExpressionObjectFactory() 메서드는 IExpressionObjectFactory 객체를 리턴한다. 이 객체의 buildObject() 메서드가 생성하는 객체가 식 객체가 된다. 이 객체는 타임리프 식에서 사용할 메서드를 제공한다. 다음은 식 객체로 사용할 클래스의 구현 예이다.
public class MyFormat {
public String date(String date) {
if (!StringUtils.hasText(date))
return null;
if (date.length() == 8) {
return date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
} else {
return date;
}
}
public String contractNum(String contractNum) {
if (!StringUtils.hasText(contractNum))
return null;
if (contractNum.length() > 5) {
return contractNum.substring(0, 5) + "-" + contractNum.substring(5);
} else {
return contractNum;
}
}
public String phone(String phone) {
if (!StringUtils.hasText(phone))
return null;
if (phone.length() == 11) {
return phone.substring(0, 3) + "-" + phone.substring(3, 7) + "-" + phone.substring(7);
} else if (phone.length() == 10) {
return phone.substring(0, 3) + "-" + phone.substring(3, 6) + "-" + phone.substring(6);
} else {
return phone;
}
}
}
이제 커스텀 식 객체를 타임리프 식에서 사용하면 된다.
<td th:text="${#myFormat.phone(item.handphone)}"></td>
<td th:text="${#myFormat.contractNum(item.useContractNum)}"></td>