Google App Engine - Java 개발 환경 설정

오픈소스 비즈니스 컨설팅
Pnuskgh (토론 | 기여)님의 2011년 3월 28일 (월) 11:27 판 (→‎참고 문헌)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
둘러보기로 가기 검색하러 가기

Google App Engine의 Java 개발 환경 설정 방법을 정리 합니다.

GAE for Java 개발 환경

Google App Engine(GAE) for Java 개발 환경은 2009년 4월 Java 개발자에게 공개 되었다. 여기서는 Eclipse를 활용하여 GAE for Java 개발 환경을 구성하고 간단한 GAE Application을 작성해 배포해 보자.

GAE에 회원 가입

  • Google App Engine에서 가입 한다.
  • GAE 사이트에 접속 한다.
  • Google 계정으로 GAE에 가입 한다.
  • Google 계정이 있더라도 GAE에서 사용할 수 있도록 가입 절차를 수행 하여야 한다.

GAE에서 Application 생성

  • GAE로 로그인한 후 "Create an Application" 버튼을 누른다.

GAE install 002.png

  • "Country and Carrier"를 "Other(Not Listed)"를 선택 한다.
  • "Mobile Number"에 자신의 핸드폰 전화 번호를 입력 한다. (예, +82 10 xxxx xxxx)
  • "Send" 버튼을 누른다.

GAE install 003.png

  • "Enter Account Code"에 핸드폰으로 전송되어 온 인증 코드를 입력하고 "Send"를 누른다.

GAE install 004.png

  • "Application Identifier"에 자신의 애플리케이션을 구분을 구분자를 입력 한다.
  • 새로 생성되는 애플리케이션은 여기에 입력한 이름의 URL을 가진다. (예, smartyandroid.appspot.com)
  • 위 URL을 향후 자신의 도메인에 있는 URL로 변경할 수 있다.
  • "Application Title"에 자신의 애플리케이션 제목을 입력 한다.
  • "I accept these terms."를 체크하고 "Create Application"을 누른다.

GAE install 005.png

  • GAE 사이트에 로그인하면 아래와 같이 등록된 애플리케이션을 확인할 수 있다.

GAE install 006.png

  • GAE 사이트에서 애플리케이션을 선택하면 아래와 같은 관리 화면이 표시 된다.

GAE install 007.png

Eclipse 개발 환경 설정

  • Google Plugin for Eclipse 설치
  • Eclipse 3.5에서 "Help -> Install New Software..." 메뉴를 선택 한다.
  • "Work with:"에 http://dl.google.com/eclipse/plugin/3.5 주소를 입력하고 엔터키를 누른다.
  • 목록에 표시되는 것을 모두 선택하고 설치를 진행 한다.

GAE install 001.png

  • Google Plugin for Eclipse 설치 확인, 메뉴 아이콘에서 확인
  • 파란 g 아이콘 : App Engine for Java 프로젝트 작성 마법사
  • 빨간 G 아이콘 : GWT 프로젝트 컴파일
  • 소형 제트기 : App Engine 프로젝트 deploy
GAE install 008.png

GAE Application 개발

  • Eclipse에서 Application 생성
  • 파란 g 아이콘(App Engine for Java 프로젝트 작성 마법사)을 눌러 GAE Application을 생성 한다.
  • Project name : GAE 프로젝트의 이름을 입력 한다.
  • Package : 사용할 패키지명을 입력 한다.

GAE install 009.png

  • GAE Application의 컴파일 환경 조정
  • Google App Engine은 JDK 1.5 버전 이상을 지원 합니다. 컴파일 오류가 발생할 경우 아래와 같이 작업 합니다.
  • 좌측의 "Package Explorer"에서 방금 생성한 GAE Application을 선택하여 오른쪽 마우스를 누른다.
  • "Properties ->Java Compiler"를 선택 한다.
  • "Enable project specific settings"을 체크 한다.
  • "Compiler compliance level"에서 "1.5" 또는 "1.6"을 선택 한다.

GAE install 010.png

  • GAE Application의 컴파일
  • "빨간 G 아이콘"을 눌러 GAE Application을 컴파일 한다.
  • Eclipse에서 Application을 GAE로 deploy
  • 소형 제트기 아이콘(App Engine 프로젝트 deploy)을 누른다.
  • GAE에 deploy하기 위해 접속 Email과 Password를 입력한다.

GAE install 011.png

  • GAE에서 등록한 "Application Identifier"를 등록 한다.
  • "App Engine project setting..."을 클릭 한다.
  • "Application ID"에 GAE에서 등록한 "Application Identifier"를 등록 하고 "OK" 버튼을 누른다.

GAE install 012.png

  • "Deploy" 버튼을 누르면 GAE Application이 컴파일 되고 deploy 된다.

GAE install 013.png

  • GAE Application 확인

GAE install 014.png

JSP 사용 환경 설정

  • 오류 메시지
  • Your Web Application Project must be configured to use a JDK in order to use JSPs.
  • 원인 : JSP를 사용하기 위해서는 JDK에 포함되어 있는 javac를 사용할 수 있어야 한다. 그러므로 JRE 대신에 JDK를 사용하도록 변경 하여야 한다.
  • 조치 방법
  • "Window -> Preferences -> Java -> Installed JREs" 메뉴를 선택 한다.
  • 등록된 JRE를 선택하고 "Edit..." 버튼을 누른다.
  • JRE 폴더를 JDK 폴더로 변경 한다.

Eclipse에서 GAE 실행

  • 오른쪽 마우스를 누른다.
  • "Run As -> Web Application"메뉴를 선택 한다.

개발 환경에서 GAE 실행

위 "Eclipse에서 GAE 실행"을 권장 합니다.

GAE for Java 애플리케이션 개발을 위해서 매번 GAE로 deploy하여 테스트 하는 것은 여러가지 면에서 불편하다. GAE for Java를 위한 개발 환경을 로컬 환경에서 구현해 보자.

Google App Engine의 Google Plugin for Eclipse를 설치하면, Eclipse 설치 디렉토리 아래 $ECLIPSE_HOME/plugins/com.google.appengine.eclipse.sdkbundle.[버전]/appengine-java-sdk-[버전]/ 폴더에 appengine-java-sdk가 설치 된다. (예, D:/appl/eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.3.3_1.3.3.v201004231111/appengine-java-sdk-1.3.3.1) appengine-java-sdk 아래 bin/dev_appserver.cmd 에 애플리케이션의 war 폴더 위치를 전달하여 실행하면 GAE 개발 서비가 실행 된다.

  • 개발 서버 실행 및 종료
  • 아래와 같은 내용으로 runDemo.cmd 파일을 생성 한다.
  • appengine-java-sdk 아래의 bin/dev_appserver.cmd를 실행하고 인수로 실행하고자 하는 애플리케이션의 war 폴더를 전달한다.
set APPENGINE_HOME=D:/appl/eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.3.3_1.3.3.v201004231111/appengine-java-sdk-1.3.3.1
set APPLICATION_HOME=C:/www_project/eclipseWorkspace/SmartyAndroid

%APPENGINE_HOME%/bin/dev_appserver.cmd %APPLICATION_HOME%/war
  • runDemo.cmd 파일을 실행 한다.
  • 종료를 원할 경우 Ctrl_C 를 누른다.
  • 브라우저에서 개발 서버 접속
  • 참고 문헌


GAE/J 개발 환경 설정

Google App Engine for Java에서 Java에서 많이 사용하는 Spring framework를 설정하는 방법을 정리 합니다.

GAE/J 개발 환경 개요

Browse View Control Model
  • Resource Bundle (다국어 지원)
  • Logging
  • File IO
  • DI, AOP

appengine-web.xml

  • 세션 사용 허용
<sessions-enabled>true</sessions-enabled>
  • 로깅 설정 파일 위치
  <system-properties>
    <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
  </system-properties>

HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Content-Script-Type" content="JavaScript">
    <meta http-equiv="Content-Style-Type" content="text/css">
  </head>
</html>
<!DOCTYPE html>
<html lang="ko">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta http-equiv="Content-Script-Type" content="JavaScript">
    <meta http-equiv="Content-Style-Type" content="text/css">
  </head>
</html>
  • JSP
<%@ page language="java" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8" %>
 
<%@ taglib prefix="s"  		uri="/struts-tags"%>
<%@ taglib prefix="c"  		uri="/WEB-INF/tld/c.tld"%>
<%@ taglib prefix="fmt"  	uri="/WEB-INF/tld/fmt.tld"%>
<%@ taglib prefix="fn"  	uri="/WEB-INF/tld/fn.tld"%>
<%@ taglib prefix="sql"  	uri="/WEB-INF/tld/sql.tld"%>

jQuery

<script type="text/JavaScript" src="/js/jquery-1.4.2.js"></script>

SiteMesh

  • sitemesh-2.4.2.jar
  • sitemesh-decorator.tld, sitemesh-page.tld

Freemarker

  • freemarker-2.3.16.jar
	<servlet>   
 		<servlet-name>freemarker</servlet-name>   
 		<servlet-class>com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet</servlet-class>  
  		<init-param>
   		<param-name>TemplatePath</param-name>
   		<param-value>/</param-value>
  		</init-param>
 		<init-param>
  			<param-name>default_encoding</param-name>
  			<param-value>UTF-8</param-value>
 		</init-param>
 		<load-on-startup>1</load-on-startup>
		</servlet>   

	<servlet-mapping>   
 		<servlet-name>freemarker</servlet-name>   
 		<url-pattern>*.ftl</url-pattern>   
	</servlet-mapping>
  • freemarker.core.TextBlock.java 재생성
  • Freemarker에서 JSP TagLibrary 사용 방법
  • struts2-core-2.2.1.jar 파일의 압축을 풀어 /META-INF/struts-tags.tld 파일을 /WEB-INF/tld/struts-tags.tld 로 복사 한다.
<#assign s=JspTaglibs["/WEB-INF/tld/struts-tags.tld"] />
<#assign c=JspTaglibs["/WEB-INF/tld/c.tld"] />
<#assign fmt=JspTaglibs["/WEB-INF/tld/fmt.tld"] />
<#assign fn=JspTaglibs["/WEB-INF/tld/fn.tld"] />
<#assign sql=JspTaglibs["/WEB-INF/tld/sql.tld"] />

Velocity

  • velocity-1.6.4.jar, velocity-tools-2.0.jar
	<servlet>   
  		<servlet-name>velocity</servlet-name>   
 		<servlet-class>com.opensymphony.module.sitemesh.velocity.VelocityDecoratorServlet</servlet-class>  
  		<init-param>
   		<param-name>TemplatePath</param-name>
   		<param-value>/</param-value>
  		</init-param>
 		<init-param>
  			<param-name>default_encoding</param-name>
  			<param-value>UTF-8</param-value>
 		</init-param>
 		<load-on-startup>1</load-on-startup>
		</servlet>   

	<servlet-mapping>   
 		<servlet-name>velocity</servlet-name>   
 		<url-pattern>*.vm</url-pattern>   
	</servlet-mapping>
  • /WEB-INF/velocity.properties

Struts2

  • 참고 문헌

Apache Common

  • commons-logging-1.0.4.jar
  • commons-fileupload-1.2.1.jar
  • commons-io-1.3.2.jar
  • commons-beanutils-1.8.3.jar
  • commons-collections-3.2.1.jar
  • commons-digester-2.0.jar
  • commons-lang-2.5.jar

JSON Simple

  • json_simple-1.1.jar

Spring

  • /WEB-INF/web.xml
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/classes/spring-common.xml,
			/WEB-INF/classes/spring-qrcode.xml
		</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

DWR

  • dwr.jar
  • /WEB-INF/web.xml
	<servlet>
		<servlet-name>dwr</servlet-name>
		<servlet-class>org.directwebremoting.spring.DwrSpringServlet</servlet-class>
		<init-param>
			<param-name>debug</param-name>
			<param-value>true</param-value>
		</init-param>
		<init-param>
			<param-name>crossDomainSessionSecurity</param-name>
			<param-value>false</param-value>
		</init-param>		
	</servlet>
	
	<servlet-mapping>
		<servlet-name>dwr</servlet-name>
		<url-pattern>/dwr/*</url-pattern>
	</servlet-mapping>
  • Spring 설정
	<dwr:configuration>
		<dwr:convert type="exception"  class="java.lang.Exception"></dwr:convert>
		<dwr:convert type="bean"  class="java.lang.StackTraceElement"></dwr:convert>
	</dwr:configuration>

	<bean	id="sampleDwrService"
		class="com.jopenbusiness.gae.qrcode.service.SampleDwrService"
		scope="prototype">
		<dwr:remote javascript="SampleDwrService"></dwr:remote>		
	</bean>
  • HTML에서 사용 방법
<script type="text/javascript" src="/dwr/engine.js"> </script> 
<script type="text/javascript" src="/dwr/util.js"> </script> 
<script type="text/javascript">
function errorHandler (errorString, exception) {
	var msg = "";
 
    if ((errorString) && (errorString != "") && (0 < errorString.length)){       
    	msg = errorString;
    } else {
    	msg = "DWR error occurs.";
    } 
    window.alert(msg);    
}
dwr.engine.setErrorHandler(errorHandler);

<script type="text/javascript" src="/dwr/interface/SampleDwrService.js"> </script>
<script type="text/javascript">
function sampleCallback(result) { 
	var data;
	var rtstr = [];
	
	window.alert(result);
	eval("data = " + result);
	rtstr.push("code : [" + data.code + "]");
	rtstr.push("msg : [" + data.msg + "]");
	rtstr.push("type : [" + data.type + "]");
	rtstr.push("html : [" + data.html + "]");
	window.alert(rtstr.join(", "));
}

function testDWR() {
	SampleDwrService.hello("ghkim", sampleCallback);
}
</script>
  • Java 프로그램
package com.jopenbusiness.gae.qrcode.service;

public class SampleDwrService {
	public String hello(String name) {
		return "Hello, " + name;
	}
}

PHP 개발 환경

  • Java 기반의 PHP 인터프리터인 Quercus을 사용하여 PHP 개발 환경을 구성 한다.
  • 참고 문헌

RESTfull

  • REST (REspresentational State Transfer)
  • URI를 통해 Resource를 요청하고 이를 통해 표현 상태의 변경을 유발하는 통신 Architecture
  • REST 방식의 웹서비스는 세션을 사용하지 않습니다.
  • RESTfull : REST 개변에 충실하게 구현된 웹 Application과 구조
Resource GET
조회
PUT
수정
POST
등록
DELETE
삭제
Collection URI
http://localhost/resources
자료 목록 반환 전체 자료 수정 새로운 자료 생성 전체 자료 삭제
Element URI
http://localhost/resources/123
지정한 자료 반환 지정한 자료 수정/생성 새로운 자료 생성 지정한 자료 삭제
  • JAX-RS
  • JSR-311, Java Annotation API
  • Java API for RESTfull Web Services (2007 ~)
  • 구현체
  • JAX-RS Annotations
  • @Path : 리소스에 대한 접근 경로
  • @GET, @POST, @PUT, @DELETE : Http Request Method
  • @Produces : 반환하는 데이터의 미디어 타입 (XML, JSON)
  • @Consumes : 요청 데이터의 미디어 타입
  • URI matrix parameter
  • Parameter type
  • public static valueOf(String), public static fromString(String)
  • List<T>, Set<T>, SortedSet<T>
  • JAX-RS Sample
@Path("widgets")
@Produces("application/xml")
public class WidgetsResource {
    @GET
    @Path("offers")
    public WidgetList getDiscounted() {
    }

    //--- Sub-resource Method, 요청을 직접 처리
    @GET
    @Path("offers/{id}")
    @Consumes("application/json")
    public Widget findWidget(@QueryParam("id") String id) {
    }

    @GET
    @Produces("text/html")
    public String getAsHtml() {
    }

    //--- Sub-resource Locator, 요청을 처리할 객체를 반환
    //--- @GET과 같은 Request Method 지정 어노테이션을 반드시 생략할 것
    @Path("offers/{id}")
    public WidgetResource findWidget(@QueryParam("id") String id) {
        return new WidgetResource(id);
    }
}

public class WidgetResource {
    public WidgetResource(String id) {
    }

    @Get
    public Widget getDetails() {
    }
}
  • Restlet 설정
  • GAE/J(Google App Engine for Java)에 restlet 환경을 설정해 보자.
  • 다운로드 사이트에서 restlet-1.1.10.zip 파일을 다운로드 한다.
  • restlet-1.1.10.zip 파일의 압축을 풀어 lib 디렉토리에 있는 jar 파일을 GAE/J 애플리케이션의 /war/WEB-INF/lib 디렉토리로 복사 한다.
  • 참고 문헌

참고 문헌

  • 다운로드