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) {
   ...
}
이것보다 쉬울 수 있을까?

2010-12-29

Play 프레임워크 미리보기

Play 프레임워크는 거창한 엔터프라이즈 자바 스택에 대한 깔끔한 대체품이다. 이것은 개발 생산성에 초점을 맞추고, RESTful 아키텍처에 목표를 두고 있다. Play 는 애자일 소프트웨어 개발의 완벽한 동반자이다.
Play 프레임워크의 목적은 Java로 어려움을 겪는 것보다 쉬운 웹 어플리케이션 개발을 하는 것이다. 이것이 어떻게 가능한지 보도록 하자.
Play 는 순수 Java 프레임워크 이며, 당신이 좋아하는 개발툴과 라이브러리를 그대로 사용할 수 있게 해준다. 만약 당신이 벌써 개발환경으로 Java를 사용하고 있다면, 다른 언어, IDE, 라이브러리로 바꿀 필요가 없다. 단지 더욱 생산성 있는 Java 환경으로 바꾸기만 하면된다.

버그를 고치고 리로드 하기

Java 플랫폼은 반복적이고 지루한 컴파일-패키지-배포 순환으로 기인한 낮은 생산성으로 악명이 높다.
이것이 우리가 개발 사이클을 다시 생각한 이유이며, Play로 효과적인 프로세스를 통해서 개발하도록 하였다.
프레임워크는 당신의 Java 소스를 바로 컴파일하며, 서버를 재시작하지 않고도 리로드한다. LAMP 나 Rails 같은 환경처럼 코딩하고 리로드하고 수정사항을 바로 확인할 수 있다.
간단한 텍스트 에디터로도 충분히 작업할 수 있어서, 다양한 기능을 제공하는 Java IDE를 사용하지 않아도 된다는 점은 아주 재미있는 부분이다.
에러가 발생할 때마다, 프레임워크는 당신의 수고를 덜 들일수 있는 방법을 찾고 문제점을 알려준다.
스택 트레이스는 불필요한 것은 줄이고 최적화하여 문제를 더 쉽게 해결할 수 있도록 해준다.

단순한 상태비보존 MVC 아키텍쳐

데이터베이스와 웹브라우저. 왜 이 둘사이의 상태를 가지고 있어야 될까?
상태보존과 컴포넌트 기반의 Java 웹프레임워크는 페이지의 상태를 쉽게 자동으로 저장할 수 있게 해주지만, 다른 많은 문제들을 가져온다 : 만약 당신이 두번째 윈도우를 연다면? 만약 당신이 브라우저의 뒤로가기 버튼을 누른다면?
Share Nothing 아키텍쳐는 PHP, Rails, Django 에 이르기까지 많은 웹프레임워크에 장려되고 있다. 브라우저가 더욱더 강력해짐에 따라서, 클라이언트쪽의 상태 문제를 해결하기 위해서, Ajax 또는 오프라인 스토리지를 사용하는 것이 이제는 쉬워졌다.
우리는 웹위의 위조상태를 리빌드하기 위해서 더이상 HTTP 모델을 해킹할 필요가 없다. 'share nothing'의 다른 면은 병렬로 페이지의 부분을 렌더링하기 쉽게 만들어주고, 부분 페이지 업데이트를(또는 진보적인 향상들) 하게 해준다는 것이다.

HTTP-to-code 매핑

만약 다른 Java 웹프레임워크(서블린 API, 스트럿츠)를 이미 사용하고 있다면, 당신은 벌써 이상한 Java API와 개념을 포함한 HTTP 프로토콜의 추상뷰를 사용하고 있는 것이다. 우리는 다르게 생각한다. 웹프레임워크는 HTTP와 그의 개념에 대한 충분하고 직관적인 접근을 제공해야만 한다. 이것이 Play 와 다른 Java 웹프레임워크들의 기본적인 차이점이다.
HTTP, the Request/Response 패턴, REST 아키텍처 스타일, content-type negotiation, URI 는 모두 Play 프레임워크의 주요 개념들이다.
예를 들어서, URI 패턴에서 Java를 호출하는 바인딩은은 아래처럼 한줄로 끝난다:
GET    /clients/{id}        Clients.show
Ajax, REST, 웹페이지 사이의 뒤로/앞으로의 이동관리 들이 매일 당신이 웹개발시에 접하는 이슈들이라면, 바로 Play를 시도해보기 바란다.

효과적인 템플릿 엔진

우리는 JSP 와 표현식에 대한 아이디어를 좋아한다. 하지만, 태그 라이브러리를 생성하가 위해, 왜 그렇게나 많은 설정파일이 필요한 것인가? 밑단에 존재하는 객체 모델에 완벽한 접근을 할 수 없는 것일까? JSP는 많은 한계들을 가지고 있고, 이것은 정말로 불만스러운 것이다.
누구든 아래와 같이 작성하면 피곤할 것이다:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
 
<c:choose>
    <c:when test="${emails.unread != null && fn:size(emails.unread)}">
        You have ${fn:size(emails.unread)} unread email(s)!
    </c:when>
    <c:otherwise>
        You have no unread emails!
    </c:otherwise>
</c:choose>
우리는 확실하게 아래와 같이 작성하는 것을 좋아하리라 생각한다:
You have ${emails.unread ?: 'no'} ${emails.unread?.pluralize('email')} !
Play 템플린 엔진에서 제공되는 표현식은 Groovy 이며, Groovy는 Java와 일치하는 문법을 제공한다. Play는 템블릿 시스템이 HTML response를 렌더링하는 것을 기본으로 사용하고 있지만, e-mail 메시지, JSON 과 같은 다른 문서형식을 생성하는데에도 자유롭다.

스테로이드 주입한 JPA

Java Persistence API (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);
}

테스트 주도 개발

통합된 테스트 실행기는 테스트 주도 개발(TDD)을 쉽게 해준다. 단순한 유닛테스트부터 수용가능한 모든 종류의 테스트를 작성할 수 있고, Selenium을 사용해서 브라우저에서 직접 수행한다. 코드 커버리지(범위) 또한 측정된다.

풀스택 어플리케이션 프레임워크

Play 프레임워크는 처음에 우리 자신의 Java 어플리케이션의 영감을 받았다. 그것은 현대 웹어플리케이션을 생성하기 위한 모든 도구들을 포함하고 있다:
  • JDBC를 통한 RDBMS 지원.
  • 하이버네이트를 사용한 객체-관계 매핑 (with the JPA API).
  • 통합 캐쉬 지원하며, 필요한 경우 분산 memcached 를 쉽게 사용할 수 있다.
  • JSON 또는 XML 을 사용한 직관적인 웹서비스 (SOAP이 아닌, 실제 웹서비스들을 말함).
  • 분산 인증을 위한 OpenID 지원.
  • 어디에든 배포될 수 있는 웹어플리케이션 (어플리케이션 서버, 구글 앱 엔진, 클라우드, 등…)
  • 이미지 처리 API.
모듈식 아키텍처는 웹어플리케이션을 다른 것을과 결합할 수 있도록 해준다. modules 어플리케이션에 감사하라. 당신의 Java 코드, 템플릿, 정적인 리소스들(Javascript, CSS 등)을 간단하게 재사용할 수 있다.