SMALL

Creating a Project


앱엔진용 자바 어플리케이션은 자바 서블릿을 사용하고 웹서버 환경과 상호 작용을 한다. 어플리케이션 파일들은 컴파일된 클래스 형태, 압축파일 형태인 JARs, static files , 설정 파일들이 있고 해당 파일들은 자바 어플리케이션의 표준 레이아웃인 WAR형태로 구조화 되어 있다. (SDK에서 WAR압축은 아직지원하지 않는다고 하네요 무슨 의미 인지 정확히 모름)

The Project Directory

튜토리얼에서 Guestbook/ 디렉토리 명을 사용할 것이다. 서브 디렉토리 명인 src/에는 자바소스가 저장되고, war/서브디렉토리에는 완성된 어플리케이션이 war포맷으로 저장 된다. 빌드 순서는 자바 소스 컴파일 > 컴파일된 클래스 WAR형태로 war/경로 저장 이 된다.

이클립스를 사용하는 경우 툴바에서 New Web Application Project buttonThe New Web Application Project button. 을 클릭 합니다. 프로젝트 명은 "Guest book" 패키지 명은 guestbook. "Use Google Web Toolkit" 체크 해제, "Use Google App Engine" 체크 좀더 자세한 내용은 이클립스용 구글플러그인 사용하기를 보시기 바랍니다. 프로젝트 생성 마법사는 위의 디렉토리 구조를 생성을 해줄 것이다. 그리고 아래의 소스코드로 생성을 할 것입니다.

이클립스 사용하지 않을 경우 설명인데 사용하는 것이 좋을 것 같네요 앞으로 이클립스 사용하지 않는 경우는 제외 하겠습니다.

The Servlet Class

앱엔진 어플리케이션은 자바 서블릿 API를 사용하고, 웹서버와 상호 작용을 합니다.  HTTP 서블릿은 어플 클래스 이고 해당 클래스는 웹의 request에 응답및 처리를 수행 합니다. 서블릿 클래스는 javax.servlet.GenericServlet 클래스를 상속받거나, javax.servlet.http.HttpServlet 클래스를 상속 받습니다.

package guestbook;

import java.io.IOException;
import javax.servlet.http.*;

public class GuestbookServlet extends HttpServlet {
   
public void doGet(HttpServletRequest req, HttpServletResponse resp)
           
throws IOException {
        resp
.setContentType("text/plain");
        resp
.getWriter().println("Hello, world");
   
}
}

The web.xml File

웹서버가 request를 수신 할때 어떤 서블릿 클래스가 호출 될지 configuration file("web application deployment descriptor")을 통해서 결정이 된다. 이런 조건을 결정하는 파일인 바로 web.xml이다. 해당 파일은 WAR파일 내부의 war/WEB-INF 디렉토리 밑에 존재하고, 서블릿 명세서에는 WEB-INF/ web.xml로 존재한다고 명시 되어 있다.

war/WEB-INF 디렉토리 안에 web.xml파일의 내용은 아래와 같다.
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">


<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
   
<servlet>
       
<servlet-name>guestbook</servlet-name>
       
<servlet-class>guestbook.GuestbookServlet</servlet-class>
   
</servlet>
   
<servlet-mapping>
       
<servlet-name>guestbook</servlet-name>
       
<url-pattern>/guestbook</url-pattern>
   
</servlet-mapping>
   
<welcome-file-list>
       
<welcome-file>index.html</welcome-file>
   
</welcome-file-list>
</web-app>

web.xml파일을 보면 서블릿명이 guestbook로 선언이 되어 있고, 해당 서블릿과 맵핑되는 주소URL경로는 /guestbook로 정의 되어 있다. 이 정의의 의미는 URL주소에 대해서 어떤 서블릿에 대해서 항상 맵핑이 되는 것이 아니라는 의미이고, 해당 서버는 index.html 과 같이 정의 된 파일 명이 실제 존재 하는지해당 디렉토리가 있는지 그리고 서비스 여부를 체크 한다.

하루 종일 영어를 보니 피곤 하네요. 제가 원래 영어를 잘 못하거든요. 번역이 좀 어색해도 이해해 주세요. 의미 전달은 확실히 하겠습니다. 저도 지금 하나하나 따라 하는 중입니다.

The appengine-web.xml File

구글 앱엔진에서는 위에 설명했던 web.xml과 같은 또다른 하나의 환경설정 파일이 존재 합니다. 해당 설정 파일은 어플리케이션이 배포 되고 동작하는 것을 정의 하게 됩니다. 소제목에서 눈치를 채셨겠지만, 파일 명은 appengine-web.xml 파일 입니다. 해당 파일은 WEB-INF/ 경로 하위에 web.xml파일과 사이 좋게 위치 해 있습니다. 설정 파일은 내 어플리케이션의 ID를 포함하고 있습니다(이클립스는 프로젝트 생성시 나중에 내 ID를 등록하기 위해 빈 ID로 생성이 됩니다.) 설정 파일은 내 어플리케이션의 버젼 번호, 그리고 정적 파일(이미지,css)의 목록리소스 파일(JSPs, 기타 어플리케이션 정보) 의 정보를 포함 합니다.

아래는 war/WEB-INF 디렉토리 밑에 있는 appengine-web.xml파일의 내용입니다.
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
   
<application></application>
   
<version>1</version>
</appengine-web-app>

appengine-web.xml은 앱 엔진의 명세서 역할을 합니다. 그리고 표준 서블릿기준을 따르지 않습니다. (뭐 구글이 정했다는 말이네요). appengine-java/docs/ 폴더를 보면 appengine-web.xml 파일에 대한 xml 스키마를 찾을수 있습니다. Configuring an App 부분을 보시면 더 많은 내용을 볼 수 있습니다.(전 나중에 보겠습니다. @.@ )

Running the Project

앱엔진 SDK는 웹서버를 내부에 가지고 있어서, 어플리케이션 실행시 해당 기능(웹서버)을 사용 및 앱엔진 환경 과 서비스를 테스트가 가능 하다. 웹서버에는 datastore 와 services 대한 sandbox 제한이 포함 되어 있다.

이클립스 환경에서 개발 서버를 시작 할 수 있다(디버그 모드 사용). 정확하게 "Guestbook"를 선택 하고 메뉴상의 Run >Debug As > Web Application 을 선택 합니다. 아래 그림 첨부 합니다.


Testing the Application

서버를 시작 하고 웹 브라우저로 실행 서버 URL로 접속 합니다. 이클립스 환경에서는 서버의 포트는 8888이 기본 설정 입니다.(음. 전 설정을 바꾼 적이 없는데 안되네요 8080입니다. 여러분들도 로그를 좀 보세요)
제 웹브라우저 실행 화면 입니다.

dev_appserver로 커맨드 모드로 실행을 했으면 기본으로 8080 포트가 사용됩니다.(지난번 첫번째 시간에 한것입니다.)



LIST