b

플레이 프레임워크2 - 실전#2 ( 기본 웹어플리케이션 이해하기 ) 본문

play framework

플레이 프레임워크2 - 실전#2 ( 기본 웹어플리케이션 이해하기 )

dev.bistro 2012. 7. 24. 20:29

1. 기본 프로젝트 실행하기

C:\workspace_spring3\tutorial>play new tutorial

커맨드로 tutorial 이름을 가지는 java 프로젝트를 생성하였다.  

C:\workspace_spring3\tutorial>play

[info] Loading project definition from C:\workspace_spring3\tutorial\project

[info] Set current project to tutorial (in build file:/C:/workspace_spring3/tutorial/)

       _            _

 _ __ | | __ _ _  _| |

| '_ \| |/ _' | || |_|

|  __/|_|\____|\__ (_)

|_|            |__/


play! 2.0.2, http://www.playframework.org


> Type "help play" or "license" for more information.

> Type "exit" or use Ctrl+D to leave this console.


[tutorial] $ run


--- (Running the application from SBT, auto-reloading is enabled) ---


[info] play - Listening for HTTP on port 9000...


(Server started, use Ctrl+D to stop and go back to the console...)

이후 Play Command Line에서 [run]을 실행하면 하단의 메시지 처럼 9000 port에서 서버가 실행되었다는 메세지를 확인 할 수 있다. (Ctrl + D를 통하여 Play Command Line으로 복귀 할 수 있으며, 다양한 작업을 수행 할 수 있다)

 http://localhost:9000  에서 해당 서버의 실행 모습을 확인 할 수 있다. 해당 웹어플리케이션은 Play framework가 제공하는 기본 skeleton code가 근본이며, 이것을 실행하고 해당 내용을 읽는 정도로도 많은 부분을 파악 할 수 있을 것이다.


2. 기본 Controller

위치 : conf 폴더의 routes 파일

# Home page

GET     /                           controllers.Application.index()

Get Method로 / URL에 접근하면, controllers.Application.index()를 Action Method로 인지하여, 해당 메소드를 수행한다. 해당 메소드는 app/controllers 폴더에 Application.java 내에 위치하고 있다.

package controllers;

import play.*;


public class Application extends Controller {


  public static Result index() {

    return ok(index.render("Your new application is ready."));

  }

}

CoC ( Convention Over Configuration ) 는 설정이상, 설정을 넘은 관례라고 생각할 수 있다. 개발자가 일일히 지정해야 하는 설정이 아닌 관례를 따른다면, 많은 결정들을 하지 않고 단순함과 유연함을 추구할 수 있다. 많은 부분에서 이러한것을 확인 할 수 있을 것이다.


예로, Get /main 으로 접근하는 페이지를 추가해보록 하자.

routes 에 1줄 추가

# Home page

GET     /                           controllers.Application.index()

GET   /main         controllers.HelloApplication.main()


app/controller/HelloApplication.java 파일 생성후 입력

public class HelloApplication extends Controller {

public static Result main(){

return TODO;

}

}

a. Action Method는 public static 이어야 하는점

b. routes의 Action Method정의 부분은 JavaClass.MethodName 호출하는 것은 어떤 설정이 아닌, 원래 그렇게 하기 때문이다.CoC


코딩을 완료한후 http://localhost:9000 을 다시 브라우저에서 확인해보면  (Ctrl+D를 누르고 Clean->Compile->Run 해도 되지만, Play의 강점중 하나는 그러한 서버 재시작을 안하는거다!)

Console에는 아래의 메시지가 나타나고

[info] Compiling 4 Scala sources and 3 Java sources to C:\workspace_spring3\tutorial\target\scala-2.9.1\classes..

--- (RELOAD) ---

[info] play - Application started (Dev)

아래의 기본적은 TODO layer를 확인할 수 있다. 아래페이지는 어떻게 만드냐고 고민하지 말자. 기본적으로 return TODO로 볼수 있고 해당 템플릿은 play-2.0.2\framework\src\play\src\main\scala\views\defaultpages 에 위치한다.


3. 기본 View 

기본 View 파일들은 app/views 폴더에 위치 한다 물론, 자바의 package처럼 폴더를 이용하여 패키징 할수 있다. 기존에 Play Framework가 Groovy를 템플릿언어로 이용하였다면, 2.0에서는 Scala를 완전히 흡수하여, 기본 언어 및 템플릿 언어로 사용한다. 그 이유일까?  suffix는 .scala.html으로 따르면 된다

사용자의 요청에 의해서(GET /)에 의하여 Application.java 의 index() 펑션을 호출하게 되는데  뷰 파일명.redner(arguments) 형식으로 랜더링할 뷰파일을 정할 수 있다.

Eclipse에서 쓰다보면 신기하다. 단순히 Text 파일인데 이클립스의 Java Editor는 코드 어시스트를 계속 지원해준다. 해당 index.scala.html은  target/scala-2.9.1/classes/view/html 으로 컴파일되어서 class 파일로 존재하고 index.class를 확인해보면

C:\workspace_spring3\tutorial\target\scala-2.9.1\classes\views\html>javap index

Compiled from "index.template.scala"

public final class views.html.index extends java.lang.Object{

    public static final views.html.index$ ref();

    public static final scala.Function1 f();

    public static final play.api.templates.Html render(java.lang.String);

    public static final play.api.templates.Html apply(java.lang.String);

    public static final scala.collection.Iterator productElements();

    public static final scala.collection.Iterator productIterator();

    public static final boolean canEqual(java.lang.Object);

    public static final java.lang.Object productElement(int);

    public static final int productArity();

    public static final java.lang.String productPrefix();

    public static final boolean equals(java.lang.Object);

    public static final java.lang.String toString();

    public static final int hashCode();

    public static final play.templates.Format copy$default$1();

    public static final play.templates.BaseScalaTemplate copy(play.templates.Format);

    public static final play.templates.Appendable _display_(java.lang.Object, scala.reflect.Manifest);

    public static final play.templates.Format format();

}

위와 같은 method 들을 확인 할 수 있다. (이제 이러한 것을 천천히 알아가는게 목표다)

index.scala.html 과 main.scala.html

file - index.scala.html

@(message: String)

@main("Welcome to Play 2.0") {

    @play20.welcome(message, style = "Java")

}


file - main.scala.html

@(title: String)(content: Html)

<!DOCTYPE html>

<html>

    <head>

        <title>@title</title>

        <link rel="stylesheet" media="screen" href="@routes.Assets.at("stylesheets/main.css")">

        <link rel="shortcut icon" type="image/png" href="@routes.Assets.at("images/favicon.png")">

        <script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")" type="text/javascript"></script>

    </head>

    <body>

        @content

    </body>

</html>



각 1라인은 Action Method의 Parameter를 할당한다. CoC  변명이 아니다. 단순한 스트링뿐 아니라 @(tasks: List[Task], taskForm: Form[Task]) 처럼 Object도 어사인 할 수 있다. 

템플릿언어로서 Scala를 사용하기 때문에 변수명:타입 의 형식을 사용하고 @는 special character로서 많이 사용하게 될것이다.


2라인에는 main 템플릿에 String, Html 의 파라미터를 넘겨준다. 

@play20.welcome이라는 상식스럽지 않은 네이밍은 무시하자. (기본 웹 어플리케이션의 화면 랜더링을 위한 예약어 정도로 생각하면 되겠다 - play-2.0.2\framework\src\play\src\main\scala\views\play20\welcome.html 파일을 보면 내가 거짓말 안하는거 알꺼다)



지금까지 기본적으로 생성되는 Play Framework의 [ Welcome to Play 2. ] 웹어플리케이션을 살펴 보았다.

단순하고 유연하고 빠르게 개발을 할수 있는 Play Framework라는데 벌써 SBT Scala Ivy 좀 있으면 Ebean Akka등이 나온다 제기랄 참 쉽다


다음에는 CRUD나 Dummy Data의 사용등에 대해서 한번 해볼련다.





Comments