2010-12-31

Play 로 할 수 있는 다섯 가지 멋진 것들

본 문서에서는 Play 프레임워크의 철학을 보여주는 다것가지 예제들을 확인할 수 있다.

HTTP 파라미터와 Java 메소드 파라미터 바인딩

Play로 Java 코드에서 HTTP 파라미터를 가져오는 것은 정말 간단하다. HTTP 파라미터와 같은 이름의 메소드 파라미터를 선언하기만 하면 된다.
예를 들어, 다음과 같은 요청이 있다고 하자:
/articles/archive?date=08/01/08&page=2
Java 메소드 파라미터를 선언함으로써 date 와 page 파라미터를 가져올 수 있다:
public static void archive(Date date, Integer page) {
    List<Article> articles = Articles.fromArchive(date, page);
    render(articles);
}
Play는 메소드 파라미터의 정적 타입을 이용할 것이며, HTTP 값을 Java 객체로 변환할 것이다.
똑똑한 바인딩은 어느 클래스와도 또한 동작한다.
public class Person {
    public String name;
    public Integer age;
}
다음은 Person 객체를 추가하는 아주 단순화한 컨트롤러 액션이다:
public static void add(Person p) {
    p.save();
}
HTML 폼은 합성 이름으로 필드를 정의한다:
<form action="/Directory/add" method="POST">
    Name: <input type="text" name="p.name" />
    Age: <input type="text" name="p.age" />
</form>

상응하는 Java 메소드를 호출함으로써 액션으로 리다이렉트하기

Play 에는 Java 서블릿 forward 에 대응되는 것이 없지만, 다른 액션으로 리다이렉트하는 것은 정말 쉽다. 단지 대응하는 Java 메소드를 호출하는 것으로 HTTP 'Redirect' 응답을 발생시킨다.
public static void show(Long id) {
    Article article = Article.findById(id);
    render(article);
}
 
public static void edit(Long id, String title) {
    Article article = Article.findById(id);
    article.title = title;
    article.save();
    show(id);
}
edit 액션의 마지막에 어떻게 되어 있는지 확인해보기 바란다. show 액션을 호출하여 리다이렉트하고 있다.
어떠한 템플에서도 링크를 생성하기 위해서 같은 문법을 사용할 수 있다:
<a href="@{Article.show(article.id)}">${article.title}</a>
That will generate the following HTML:
<a href="/articles/15">My new article</a>

Java 객체를 템플릿에 전달할 때, 반복하지 마라

대부분 Java 프레임워크에서, Java 객체를 템플릿 시스템에 전달할때, 다음과 같은 것들을 작성할 필요가 있다:
Article article = Article.findById(id);
User user = User.getConnected();
Map<String, Object> model = new HashMap<String,Object>();
model.put("article", article);
model.put("user", user);
render(model);
Play에서는 단지 아래와 같이 간단히 작성하기만 하면된다:
Article article = Article.findById(id);
User user = User.getConnected();
render(article, user);
그리고, 템플릿에서는 Java 로컬이름으로부터 객체를 가져온다. 이런 것들이 많은 필요없는 코드들을 줄여준다.

스테로이드 주입한 JPA

JPA는 Java 환경에서 확실하게 가장 좋은 객체-관계 매핑 (ORM) API 이다. 만약 당신이 벌써 알고 있다면, 당신은 Play와 함께하면서 얼마나 더욱 간단하게 되었는지 놀라게 될 것이다. 설정할 것 없이, Play는 자동으로 JPA 엔티니 매니저를 시작하고 코드가 리로드 되는 동안에 마술적으로 동기화한다.
게다가, 당신이 제공되는 play.db.jpa.Model 수퍼클래스를 사용한다면, 그것은 더욱 당신의 코드를 예쁘게 만들어줄 것이다:
public void messages(int page) {
    User connectedUser = User.find("byEmail", connected()).first();
    List<Message> messages = Message.find(
        "user = ? and read = false order by date desc",
        connectedUser
    ).from(page * 10).fetch(10);
    render(connectedUser, messages);
}

직관적인 파일 업로드 관리

Play에서 파일 업로드 관리는 매우 간단하다.
HTML 폼:
<form action="@{Article.uploadPhoto()}" method="POST" enctype="multipart/form-data">
    <input type="text" name="title" />
    <input type="file" id="photo" name="photo" />
    <input type="submit" value="Send it..." />
</form>
그리고 Java 코드는:
public static void uploadPhoto(String title, File photo) {
   ...
}
이것보다 쉬울 수 있을까?

댓글 없음:

댓글 쓰기