블로그 이미지
App 개발에 대한 내용을 다룰 예정입니다. AppleSherbet

카테고리

분류 전체보기 (39)
한국프로야구 어플 (18)
세미나 (2)
Java Development (13)
Android App소개 (3)
기타 (2)
당근마켓 (1)
Total299,563
Today15
Yesterday32

Play! framework는 쉽게 말해 요즘 뜨는(?) 자바 기반 웹 프레임워크이다. 
아 또 무슨 프레임워크야???!!! 하는 분들이 많겠지만 늘 그렇듯 그냥 재밌고 신기하니 공부하기도 한다. 나처럼...
한 2~3년전 대학원에서 공부할때 Ruby on Rails를 공부한적이 있다. 이유는? 1번 Ruby 언어가 신기하고 매력적이어서 2번 Rails 또한 매력적이고 신기해서.  Play framework은 겉모습은 rails의 자바 버전이라고 할만큼 유사하다. 
얼마전 자바 개발자 컨퍼런스를 갔다가 양수열님의 Play framework에 대한 소개를 듣고 아~ 이건 또 뭘까 하고 바로 책을 사들고 왔다.
현재 국내에 번역서는 'Play Framework Cookbook' 이란 책이 1권 있으나 처음 시작하기에는 적절하지 못한 것 같다. 
그래서 바로 책은 덥어두고(항상 반복되는...) framework 홈페이지 가이드 및 ebook을 한권 구매해서 차근차근 공부를 시작했다.
이번에 시작할 튜토리얼은 홈페이지에 있는 Play Framework로
"YABE" - Yet Another Blog Engine" 블로그를 만드는 튜토리얼을 해석한 내용으로 튜토리얼 자체가 자세한 설명이 빠져있는 관계로 약간의 자세한 설명과 함께 진행하려 한다.
난 항상 어떤일의 기획/과정 보단... 끝까지 진행하느냐가 더 중요하다고 생각한다. 이번 튜토리얼을 끝까지 진행하기를 바라며 시작해본다. 

** 제가 실제 이 튜토리얼을 따라가보면서 내용을 업데이트 할 예정이라서 업데이트 주기가 조금 늦을 수도 있습니다. 양해 바랍니다. :)

프로젝트 시작하기

소개
 
이 튜토리얼은 Play 어플리케이션을 만드는데 필요한 대부분의 기술을 다루면서 설치부터 완성까지 모든 과정을 함께 할 것이다. 각오하시라...ㄷㄷㄷ

YABE 

Yet Another Blog Engine - YABE. 우리가 만들 블로그 엔진 이름이다. 일반적인 브로그가 포함할 기술을 대부분 갖게 될 것이며 차후 블로그에 Admin 계정등을 추가하여 만들 예정이다. (블로그 자체는 평범하나 실제 웹 개발에 필요한 많은 기술들을 사용하는데 적절한 예제라고 생각된다)

준비사항(Prererquisites)

Play framework 가 java기반이므로 당연히 JDK가 설치되어 있어야 한다.  JDK의 최신 버전은 오라클 홈페이지에서 다운받을 수 있다. 다운로드 링크: http://www.oracle.com/technetwork/java/javase/downloads/index.html
이 튜토리얼에서는 JAVE EE 에 대한 지식은 요구하고 있지 않으며 JAVA 에 대한 지식과 html/css 등의 개념을 조금만 알고 있으면 어느정도 따라가는데 무리가 없을 것이다.
개발을 진행하기 위해서는 IDE또한 필요하다. 다음은 사용하기 무리가 없는 몇몇 IDE 리스트이다.
추천 IDE: Eclipse, Netbeans, Textmate, E-TextEdit, Intellij IDEA

써본봐로는 기존의 자바 개발자라면 역시 Eclipse가 편할 것이다. 각각의 프로젝트를 Play framework에 맞게 설정하는 방법은 이곳: http://www.playframework.org/documentation/1.0.1/ide 에 잘 설명돼어있다. 아주 간단한 방법으로 가능하니 설명은 생략하겠다.

Play 설치하기

Play를 설치하는 것은 아주 간단하다. 홈페이지에서 최신 안정 버전을 다운로드 받아 원하는 디렉토리에 압축을 풀면 된다.
다만 play 폴더의 홈 디렉토리를 os별로 path를 지정해 주어야 한다. 예) 윈도우의 내컴퓨터 - 속성 - 고급 - 환경변수 - path 에 play경로 추가. 
주의: window 유저라면 설치 경로에 공백이 없는 것을 추천한다. (이유는 모르겠음.. 하지만 한글역시 없는것을 추천)
자! 설치가 됐다면 이제 command line(윈도우면 도스창, Mac이면 terminal) 에 play 라고 쳐보자. OS와 상관없이 help 메세지가 나오면 성공적으로 설치된 것이다. 

Project 만들기

이제 Play가 성공적으로 설치됐으므로 우리 프로젝트를 생성해보자. Comment line 에서 원하는 디렉토리 (프로젝트를 생성하고 싶은 디렉토리)로 이동해 다음과 같이 쳐보자.
 
~$ play new yabe
다음과 같이 프롬프트에 어플리케이션의 full name 을 입력하라고 나올 것이다. Yet Another Blog Engine 이라고 입력하자.
 

 
이제 play 는 자동으로 yabe라는 디렉토리를 만들고 그 안에 필요한 여러 서브 디렉토리 및 파일들을 만들었다.  
생성된 디렉토리에 대해 간단히 알아보자

app/ - 어플리케이션의 core 부분으로 (가장 중요한 역할을 한다는 말씀) model, controller, view 의 세부 디렉토리로 나뉜다. 이 세 폴더에 .java 파일들이 존재하게 된다.

conf/ - 어플리케이션의 모든 설정 파일이 들어있는 디렉토리이다. 대표적으로 application.conf 파일, route파일 그리고 messages 파일등이 존재하게 된다. application.conf 파일을 열어보면 대부분은 어플리케이션과 관련된 많은 설정들이 주석 처리 되어있는 것을 볼 수 있다.(db, cache, JPA 등등) route파일은 특정 컨트롤러에 대한 URL을 매핑 해놓은 것으로 차후 다시 설명된다. messages 파일은 다국어 지원을 위한 설정 파일이다.

lib/ - 필요한 자바 라이브러리를 저장하기 위한 곳이다.

public/ -  public으로 사용할 리소스들이 저장되는 곳으로 javascript(js파일), image(이미지 리소스), style (css)의 디렉토리가 생긴다. 

test/ - 이곳에는 모든 어플리케이션 테스트와 관련된 코드가 저장된다.

만약 자바 개발자라면 .class 파일은 어디 저장되는지 궁금할 것이다. 결과적으로 어디에도 없다. Play 는 순수 java 소스 파일만을 사용한다 그리고 이 소스 파일을 컴파일 하는 것은 framework 안에 있는 eclipse compiler 가 담당하게 된다. (개발자는 그런 과정에 대해 모르고 있어도 무방하다.)
** 여기서 말하는 eclipse compiler는 play framework 에서 auto compiling 을 위해 채택한 complier인것 같다. 

위와 같은 구조는 개발과정을 아주 편하게 바꿔준다. 첫번째로 Play는 자동으로 소스 코드가 수정된 것을 감지하고 런타임시에 동적으로 reload (컴파일) 하게 된다. 이것은 우리가 따로 컴파일을 수행한다던가 서버를 재실행 하지 않아도 변경사항을 바로 브라우져로 확인 할 수 있어 매우 생산성이 높아진다. 두번째로 에러가 발생 할 경우 exception 스택이 아닌 정확한 소스의 에러 위치를 찾아내 준다. (물론 콘솔에서는 exception 스택또한 표시해 준다.)
** 실제 play에서는 바이트 코드의 캐쉬를 tmp/ 디렉토리에 저장해두고 어플리케이션을 새로 로드할때 사용한다고 한다. 이는 새로 로드할때의 속도를 빠르게 하기 위함이며 play clean 명령어로 지울 수 있다.
 

Application 시작해보기 (Running the application)

이제 어플리케이션을 새로 만들었으므로 실행을 해 볼 수 있다. 방금전 생성한 yabe 디렉토리로 이동 후 콘솔(command line)에서 play run 을 입력해보자.

서버가 시작되고 브라우져를 통해 결과를 볼 수 있다. 브라우져를 실행해 url 창에 http://localhost:9000 을 입력해보자. Welcome 화면이 뜨며 이것은 어플리케이션이 정상적으로 실행 됐다는 것을 의미한다.


이 어플리케이션이 어떻게 이런 페이지를 띄우는지 한번 살펴보자.
브라우져가 URL 을 입력 받으면 웹서버의 즉 Play framework의 /conf/route 파일을 제일 먼저 참조하게 된다. route 파일을 열어 보면 아래와 같은 첫번째 route를 볼 수 있다.
GET     /                                       Application.index
이 route는 단순히 웹서버가 / path로 GET 요청(request)을 받으면 Application 컨트롤러의 index 메소드(play서는 이 index메소드를 액션이라고 부른다.)를 호출 하라는 의미이다. 

일반적으로 자바 어플리케이션을 만들게 되면 우리는 일반적으로 아래와 같은 main 메소드를 만든다. 이는 어플리케이션의 최초 시작지점이기도 하다.
public static void main(String [] args){
 ...
} 
이와는 다르게 Play 에서는 요청 URL에 기반한 여러 시작지점(Entry point)이 있게 된다. 그리고 우린 이러한 메소드를 Action 메소드(액션 메소드) 라고 한다. 이러한 액션 메소드들은 모두 controller 클래스에 정의된다. (index 메소드도 action 메소드 이다.)
즉, URL 에 따라 route 에 맵핑된 액션 메소드 중 하나가 실행 될 수 있는 것이다. 

이제 controller.Application 이란 이름의 컨트롤러가 어떻게 구성돼어있는지 살펴보자. 이를 위해 yabe/app/controllers/Application.java 파일을 열어보자.
package controllers;
 
import play.mvc.*;
 
public class Application extends Controller {
 
	public static void index() {
		render();
	}

}
모든 controller 클래스는 play.mvc.Controller 클래스를 상속 받는다. 이 클래스는 controller 를 위한 많은 유용한 메소드를 제공하고 있다. 그 대표적인 메소드가 위 예제의 index() 메소드에 있는 render() 메소드이다. 
index 메소드는 public static void 로 정의돼있다. 이와 같이 모든 액션 메소드는 public static void 로 정의해야 한다. static을 사용하는 이유는 controller 클래스가 인스턴스화 (new) 되지 않기때문이며, public으로 정의된 것은 play framework에서 URL을 통해 액션 메소드를 수행할 수 있는 권한을 갖기 위함이다. (객체지향의 기본적인 내용이므로 자세한 내용은 생략하겠다.)
위에서 보여지는 index() 액션 메소드는 render() 메소드를 호출 하고 있다. 이는 Play에게 특정 view template를 랜더링하라(보여줘라) 라는 의미이다. 일반적으로 이 템플릿은
/app/view 디렉토리에 있는 html 파일(항상 그렇지는 않다)이 될 것이고 render() 메소드에 의해 적절한 html 파일이 웹 브라우져에 보여지게 될 것이다.   

설정보다 관례가 우선한다(Convention Over Configuration) 란 말이 있다. 레일즈를 공부할 때 처음 나왔던 말이다. 이는 Play framework에서도 그대로 사용된다. 기존의 많은 web framework들은 너무 많은 설정을 필요로 한다. "설정보다 관례가 우선한다" 란말은 우리가 framework를 사용하여 개발할때 어떤 약속들(관례들)을 지켜주면 기존에 필요로 했던 많은 설정들을 대체할 수 있다는 뜻이다. (좀 더 궁금한 분들은 Convention Over Configuration 를 검색해보길 바란다)
여기서
/app/view/index.html이 default template으로 랜더링 되는 이유는 바로 관례가 작용한 예이다. 즉, 우리는 "컨트롤러에 액션 메소드 이름과 mapping 된 template 이름을 동일하게 하자" 라는 관례를 만든것이다.  그래서 index()액션 메소드에서 단지 render()만 호출 했음에도 불구하고 "같은" 이름의 index.html이 불리는 것이다. 

이제 index.html을 열어보자.
Play에서 expression 언어는 Groovy를 사용한다. 이는 개발의 속도/편의를 위해 사용된다. 만약 Groovy에 대한 이해가 없다하더라도 이 튜토리얼을 진행하는데는 무리가 없다.
아래는 많이 사용되는 
expression 언어 문법에 대한 요약설명이다.

Expressions - ${....} 

${...} 는 dynamic (동적인) 내용(contents)를 view에 삽입하는 대표적인 notation이다. 예를 들면 <h1>${myTitle}</h1> 과 같이 view에 넣었다면 myTitle 변수 값에 따라 브라우져에 표시된다. 간단히 변수의 내용을 표시(출력)할때 사용된다.

Tags - #{....}

#{...} 는 view fragment (뷰 조각) 이라고 이해할 수 있다. 즉 개발의 편의를 위해 사용된다. 예를들면 <a href ...> 는 많이 사용되는 html 태그이다. 이는 Play에서 #{a @Application.index()}Go to Home #{/a} 와 같이 사용될 수 있다. 랜더링된 브라우져의 소스보기를 하면 해당 태그는 <a href...> 식의 html 태그로 바뀐것을 볼 수 있다. 이외에 #{list..}, #{if} 등 다양한 태그가 있다.

Actions - @{...}

@{...} 는 route파일을 기반으로 컨트롤러의 액션으로 링크를 표현할때 사용된다. 위의 #{a @Application.index()}Go to Home{/a} 와 같이 "/index" 경로를 입력하는 것이 아닌 @controller.action 형태로의 소스 코딩이 가능해진다. 

다시 위의 index.html로 돌아가보자. 여기서 사용된 #{extends /} 태그는 Play에게 현재 template이 'main.html' 이라는 다른 template을 상속하고 있다는 것을 알려준다. 이는 공통으로 사용되는 부분을 재사용할 수 있는 강력한 기능이다. 

자 이제 /yabe/app/views/main.html파일을 보자

    
    
    #{get 'moreStyles' /}
    
    
    #{get 'moreScripts' /}
  
  
    #{doLayout /}
  

위 소스에 #{doLayout /} 태그가 보인다. 즉, 우리의 index.html 은 실제론 mail.html의 <body>#{doLayout /}</body> 위치에 삽입되는 것이다.
여기서 잠깐 Play가 실제 소스의 수정만으로 어플리케이션을 다시 로딩하는지 확인해보자.
다시 
yabe/app/controllers/Application.java 파일을 열어서 render() 함수에 세미콜론을 빼고 저장한다.
package controllers;
import play.mvc.*;
 
public class Application extends Controller {
 
	public static void index() {
		render()
	}

}
이제 브라우져로 돌아가서 Refresh 버튼을 눌러보자(F5).


위에서 언급했던 기능으로 신기하게 에러를 낸 소스코드를 찾아가 보여준다. 또한, 단지 소스를 수정하는 것 만으로 수정내용이 적용되는 것을 알 수 있다. 이제 다시 에러를 수정하자. 

이제
yabe/app/views/Application/index.html 을 열고 아래와 같이 수정하자.
#{extends 'main.html' /}
#{set title:'Home' /}
 

A blog will be here

방금전과 같이 저장을 하고 브라우져를 refresh 해보면 변경된 사항을 확인 할 수 있다.

데이터 베이스 설정하기

본격적으로 블로그를 만들기에 앞서 우리가 사용할 데이터베이스가 필요하다. 개발의 목적으로 Play는 자체적으로 H2 라는 DBMS를 가지고 있다. 이것은 우리가 개발의 목적으로 사용하기에 좋은 선택이 될 것이다. 우리는 file system기반 데이터 베이스와 메모리 데이터 베이스중에 선택 할 수 있다. 하지만 편의상 메모리 데이터 베이스로 개발을 진행 하도록 하겠다. 차 후 mysql 등의 데이터 베이스와 연동하는 것은 비교적 쉽다. (메모리 데이타베이스는 서버에 있는 동적 메모리 영역에 데이터를 저장하기때문에 서버가 종료되면 데이터는 날라간다.)
데이터베이스를 설정하기 위해
yabe/conf/application.conf 파일의 아래 라인의 주석을 제거한다.
db=mem
자! 이제 데이터베이스를 위한 설정은 모두 끝났다. 메모리 디비를 사용할 경우 놀라울 정도로 쉽게 데이터베이스를 설정할 수 있다. 브라우져로 돌아가서 refresh를 눌러보자. console (도스, 쉘..) 에서 자동으로 데이터베이스를 시작하는 것을 볼 수 있다.

-  Play framework으로 블로그 개발하기 (1) - 끝
저작자 표시
신고
Posted by AppleSherbet

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

티스토리 툴바