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
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.