scala case class와 freemarker를 활용한 구현

2016-01-09 10:23

scala의 case class를 활용하면 class의 멤버 필드와 필드 접근 메서드가 자동으로 생성된다. case class를 쓸 때의 상당히 큰 장점 중의 하나다.

case class와 freemarker를 같이 사용할 경우 freemarker는 기본적으로 자바빈 규약에 따라 getter method가 필요한데 case class에서 생성하는 메서드가 멤버 필드의 이름을 따르기 때문에 이 메서드를 사용할 수 없다. 이 문제를 해결하기 위해 getter 메서드를 추가하는 것은 case class를 100% 활용하지 못하기 때문에 아쉬움이 있다. 그런데 freemarker에 class의 method를 직접 호출하는 것이 가능하다. 이 기능을 활용해 scala case class와 freemarker를 다음과 같이 구현해 깔끔하게 구현 완료했다.

case class FacebookComment(id: String, userId: String, name: String, createdTime: Date, message: String, groupId: String, groupName: String)
  extends Comparable[FacebookComment] {
  def getMessage = {
    br(links(message))
  }

  def compareTo(target: FacebookComment) = {
    (createdTime.getTime - target.createdTime.getTime).toInt
  }

  override def toString: String = {
    return "FacebookComment [id=" + id + ", userId=" + userId + ", name=" + name + ", createdTime=" + createdTime + ", message=" + message + "]"
  }
}

위와 같이 case class를 생성한다. freemarker에서는 댓글 목록을 전달할 경우 다음과 같이 구현하면 된다.

<#ftl encoding='UTF-8'>
<#list comments as comment>
<article class="article">
    <div class="article-header">
        <div class="article-header-thumb">
            <img src='//graph.facebook.com/${comment.userId()}/picture' class="article-author-thumb" alt="" />
        </div>
        <div class="article-header-text">
            <a href="//facebook.com/profile.php?id=${comment.userId()}" class="article-author-name">${comment.name()}</a>
            <div class="article-header-time">
                ${comment.createdTime()?string("yyyy-MM-dd HH:mm")}
            </div>
        </div>
    </div>
    <div class="article-doc comment-doc">
        <p>${comment.getMessage()}</p>
    </div>
</article>
</#list>

즉, 위 freemarker 파일을 보면 알 수 있겠지만 기존에 ${comment.user}로 구현했던 부분을 ${comment.userId()}로 구현해 메서드 이름을 직접 지정하는 방식이다.

0개의 의견 from SLiPP

의견 추가하기