 |
|
난이도 : 중급 Andrew Glover, Author and developer
원문 게재일 : 2009 년 8 월 18 일 번역 게재일 : 2009 년 11 월 03 일 오픈 소스 솔루션과 그 인프라스트럭처 덕택에 Java™ 개발의 특성이 변하고 있으며 더 나은 소프트웨어를 낮은
비용으로 신속하게 제공하는 것이 가능해졌다. Andrew Glover는 이러한 현상이 누적되어 생긴 영향력을 요약한
용어인 Java development 2.0을 만들었으며 이와 관련된 일부 도구와 기술에 관한 새로운 시리즈를
시작하였습니다. 첫 번째 기사에서는 Java development 2.0의 도래를 예고하고 Java용 Google App Engine을 사용하여
그 개념을 실현하는 방법을 설명합니다.
Java 영역은 다양한 개발자, 비즈니스 및 애플리케이션(가장 중요함)으로 구성된 풍요로운 생태계이며
이들은 대부분 10년 이상 잘 커가고 있다. 세계적인 Java 커뮤니티에서 Java 플랫폼에 많은 자금과 시간, 인력을 투자하였으며
이러한 기여 덕택에 성공적인 오픈 소스 및 상용 도구, 프레임워크 그리고 사실상의 솔루션을 다양하게 얻게 되었다.
Java 플랫폼에 대한 이러한 막대한 투자로 인해 Java 개발을 수행하는 방법이 미묘하게 변화되었다. 다음과 같은 두 가지 경향으로 인해 Java 개발의 특성이 빠르게 변하고 있다.
 |
이 시리즈의 정보
처음 Java 기술이 개발된 이후로 Java 개발 환경이 빠르게 변경되었다. 성숙한 오픈 소스 프레임워크와 신뢰할 수 있는 임대용 전개 인프라스트럭처 덕택에
이제 Java 애플리케이션을 신속하고 경제적으로 어셈블하고, 테스트하고, 실행하고, 유지할 수 있게
되었다. 이 시리즈에서는 이러한 새로운 Java 개발 패러다임을 가능하게 하는 다양한 기술과 도구를 살펴본다.
|
|
- 오픈 소스 도구와 프레임워크를 완전히 이용한 하향식 애플리케이션 개발
- 애플리케이션을 실행하는 것은 물론이고 소프트웨어 수명주기를 관리하는 데 필요한 애플리케이션 인프라스트럭처 빌려오기
Java development 2.0이라는 현상이 새롭거나 혁신적인 것은 아니지만, Java 기술의 역사에서 이전에는 불가능했던 기술이 이제는
가능졌으며 더 나은 애플리케이션을 지구 상에서 최우선 과제 중 하나인 낮은 비용으로 그리고 빠르게 만들 수 있을 정도로 성숙해졌다.
새로운 시리즈의 시작인 이 기사에서는 Java development 2.0을 상세하게 살펴본다. Amazon EC2, Google App Engine, 웹을 위한 데이터베이스인
CouchDB 및 이전보다 낮은 비용으로 즉시 애플리케이션을 어셈블하고, 테스트하고, 전개할 수 있는 빌딩 블록을 제공하는 기타 도구와 기술을 사용하여
웹 애플리케이션을 빌드하고 전개하는 방법을 학습한다.
첫 번째 단계: Java용 Google App Engine(참고자료 확인). 전통적인 "Hello World" 방법론을 통해 Java 플랫폼을 소개한 다음
Groovy, JDO(Java Data Object) 및 Google App Engine용 Eclipse 플러그인을 사용하여 웹 애플리케이션을 작성하는 방법을
보여준다. 먼저, Java development 2.0의 비즈니스 가치에 대한 개요를 잠깐 살펴본다.
빠르고 경제적으로
빠르고 경제적이다라는 말이 Java 개발과 연관이 없는 경우도 있다. 사실상 이 말은 자원이 거의 없는 작은 회사에서 별로
중요하지 않은 소프트웨어를 개발하는 경우에 해당한다. 그러나 진정한 문제는 기업의 규모에 관계없이 IT는 다수의 기업에서 비용이 많이 들어가는 영역이며
이로 인해 기업에서는 IT 비용을 낮게 유지하면서 가능한 많은 가치를 이끌어내려고 노력한다는 점이다.
이점이 Java development 2.0에서 해결해야 할 과제이다. 오픈 소스 도구, 프레임워크 및 솔루션을 활용하면 기업에서는
그만큼의 코드를 작성할 필요가 없어서 소프트웨어를 신속하게 어셈블할 수 있다. 10년 전에 Java 기술을 사용하여 처음 개발을 시작했을 때 개발을 위해
사용할 수 있는 도구와 프레임워크는 그다지 다양하지 않았다. 게다가 이러한 도구는 자유롭게 사용할 수도
없었다. 애플리케이션을 전개할 시스템은 물론이고 IDE, 데이터베이스, ORM(Object-Relational Mapping) 프레임워크를 구입해야 했다. (데이터베이스와 통신하기 위해
필요한 드라이버를 구매 해야했을 수도 있다.) 그러나 현재는 그렇지 않다. 열거한 모든 것을 포함해서 고품질의 많은 도구를 자유롭게 사용할 수 있다.
더욱이 Amazon EC2나 Google App Engine에서 제공하는 인프라스트럭처를 빌려씀으로써 필수 인프라스트럭처를 완전히
구매하는 경우에 비해 애플리케이션을 매우 낮은 비용으로 전개할 수 있다.
빌드, 구입, 임대 중에서 결정하기
비즈니스에는 대부분 데이터베이스, 애플리케이션 서버, 변경 관리 시스템 및 결함 추적 도구와 같은 애플리케이션을
실행하는 데 필요한 하드웨어 목록이 있다. 현재에도 다른 사업자의 인프라스트럭처에서 이러한 소프트웨어 패키지를 서비스 형태로
실행하면 이러한 목록이 필요 없어진다.
팀에서 개발 프로세스를 관리하기 위해 사용할 수도 있는 전체 애플리케이션 스택을 빌려쓸 수도 있다. 다시 말해서 애플리케이션을 실행하는 데 필요한 하드웨어를
약간의 비용을 지불하고 빌려씀으로써 기업은 이러한 하드웨어에 투자해야 하는 부담을 줄일 수 있다. 예를 들어, 자유롭게 사용할 수 있는 오픈 소스인
Subversion이나 Git와 같은 변경 관리 시스템을 실행할 시스템을 구입하는 대신 GitHub 같은 공유 변경 관리 시스템을 사용할 수
있다. GitHub를 운영하는 기업은 하드웨어 자산에 대한 비용을 부담하고 Git를 사용할 다른 조직에 통상 매월 사용자 기준으로
명목상의 비용을 청구한다. 예를 들면 Hosted JIRA 또는 Pivotal Tracker를 통해 요구사항을 관리하고, 결함을 추적하고, 테스트 사례를
관리하는데 있어서도 다른 제공업체로부터 서비스 형태로 소프트웨어를 임대한다는 원칙을 동일하게 활용할 수 있다.
본래 사용자에 맞게 조정된 다양한 소프트웨어 플랫폼을 실행하는 기본 하드웨어 자산에 대해서도 동일하게
적용할 수 있다. Amazon, Google 또는 동일한 서비스를 제공하는 다른 제공업체에서 제공한
하드웨어에서 애플리케이션을 실행하면 특정 웹 애플리케이션에 필요한 기본 하드웨어를 비즈니스에서 더 이상 고려할 필요가 없다.
이러한 기업에서 애플리케이션을 정확하게 호스트할 수 있는 다양한 수준의 하드웨어를 임대할 수
있다. 더욱이 이러한 기업에서는 확장성과 백업, 보안도 관리한다. Amazon과 Google에서 이와 같은 다양한 문제를 오래전에
파악했으며 소프트웨어 플랫폼을 효과적으로 실행한다는 면에서 더 낫고 혁신적이라는 점을 잠시 생각해 보라. (정말로 그렇다. 실제로 체험해 보라.)
예를 들어 Google의 App Engine을 사용하면 IT 기업은 필요한 애플리케이션을 실행할 수 있는 인프라스트럭처에
대한 전체 구입비용을 줄일 수 있다. 그리고 애플리케이션을 전개하고 관리하는 과정에서 발생하는 막대한 크로스커팅 문제를 이미 고려하여
대부분 우수한 방식으로 인프라스트럭처를 제공하기 때문에 해당 애플리케이션을 더 빠르게 전개할 수 있다.
이제는 빠르고 저렴하다고 해서 품질이 낮은 것은 아니다. 이와는 반대로 Java development 2.0은
일종의 전술적 접근 방식으로 품질을 강조하는 Solid Process를 표방하고 있다.
Google App Engine을 사용하는 간단한 과정
Google App Engine은 Google의 확장 인프라스트럭처에서 Java 및 Python 웹 애플리케이션을 빌드하고 전개하는 데
필요한 실제 플랫폼이다. 이 인프라스트럭처에서 활용할 수 있는 일부 소프트웨어 라이브러리를 제외하면 이 플랫폼을 사용하는 데
필요한 라이센스 비용은 없으며 대역폭이나 공간에 대한 계약금도 없다. 사용량이 임계값(스토리지 500MB와 5백만 페이지 뷰를 처리할 수
있는 CPU와 대역폭 - Google에서 산출한 값)을 초과할 때까지 이 App Engine 인프라스트럭처는 완전히
무료이다. Google에서 비용을 청구하기 시작하는 단계에 도달하면 사용자의 웹 애플리케이션에서 분명히 상당한
트래픽이 생성되었다고 할 수 있다.
Google App Engine을 얻고 실행하는 과정은 매우 쉽다. Google에서는 심지어 거의 모든 것을 처리할 수 있는
Eclipse 플러그인을 제공한다. 그리고 이 플러그인에는 이 플랫폼에서 시작할 수 있도록 도움을 주는 "Hello World" 서블릿 애플리케이션
필수 구성요소가 포함되어 있다. developerWorks에 있는 Rick Hightower의 최근 소개 기사("Google App Engine for Java, Part 1: Rev it up!")에서
Rick Hightower는 Hello World 애플리케이션(스크린샷 포함)을 전개하는 과정을 설명하고 있다. 아직 Rick의 기사를 살펴보지 않았다면 다음 단계를 따라가 보자.
 |
버전화
Google App Engine에서는 다양한 버전으로 전개를 할 수 있다. 다시 말해서 사용자가 버전을 의미하는 문자열 패턴을 전개에 할당할 수 있다. 이는
다양한 버전을 관리해야 하는 경우에 유용하다. 전개를 제거하지 않았다면 버전화된 모든 전개를 URL을 통해 액세스할 수 있기는 하지만,
URL과 Google의 대시보드를 통해 존재하거나 그렇지 않은 버전을 표시할 수도 있다. 따라서 Google 인프라스트럭처에 새로운 버전의
프로젝트를 전개할 경우에는 언제나 유효한 버전을 지정해야 한다. 문자열 패턴에 기간이 있어서는 안 된다. (1.1은 동작하지만 1-1은
동작하지 않는다.) 새로운 프로젝트를 작성할 때 이미 생성된 war/WEB-INF 디렉토리에 있는 appengine-web.xml 파일에서 버전을
할당할 수 있다. Google에서는 appengine-web.xml에서 첫 번째 버전을 1로 지정하기 때문에 프로젝트를 맨 처음 전개하는 경우에는
버전을 처리할 필요가 없다.
|
|
- http://code.google.com/appengine/의 Getting Started 밑에 있는 Sign up 링크를 눌러서 Google App Engine 계정(무료)을 작성한다.
- http://code.google.com/appengine/downloads.html에서 Eclipse용 Google App Engine 플러그인을 다운로드하여 설치한다.
- Eclipse의 New Web Application Project 단추를 눌러서 새 프로젝트를 작성하고 나타나는 대화 상자에서 Use Google Web Toolkit
옵션의 선택을 취소한다. 프로젝트와 원하는 해당 패키지 이름을 지정한다.
- 계층 구조에서 프로젝트를 선택하고 Deploy App Engine Project 단추를 누른다.
- 1단계에서 App Engine 계정을 작성할 때 사용한 신임을 입력한다.
- 로컬 프로젝트를 처음 App Engine 계정을 작성할 때 생성한 애플리케이션 ID와 연관시킨다. (ID는 최대 10개까지 작성할 수 있다.)
- Deploy 단추를 누른다. 그러면 Eclipse 콘솔에 많은 텍스트가 표시된다. (Eclipse 플러그인은 Google의 유용한 데이터 스토리지
서비스를 활용하는 모든 필수 클래스의 기능을 개선할 뿐만 아니라 보이지 않는 곳에서 다양한 일을
수행한다.) 모든 작업이 올바르게 수행되어 이러한 텍스트가 더 나타나지 않게 되면 "Deployment completed successfully"라는 메시지가 표시된다.
- Google App Engine 계정 페이지로 이동하여 Google 대시보드에서 Versions 링크를 찾는다. 여기에서 전개한 버전과
해당 URL을 확인할 수 있다. 해당 URL을 누른 다음 생성된 서블릿의 링크를 누르면 낯익은 "Hello, world"가 텍스트로 표시된다.
Groovlet을 사용한 코드 줄이기
한 라인의 코드도 작성하지 않고 첫 번째 Google App Engine 애플리케이션을 성공적으로 전개했다. 실제로 Google App Engine을 활용하면
약간의 코드만 작성하면 되지만 여기에는 작업을 더 쉽게 하도록 도움을 주는 재사용 가능한 다양한 코드가
있다. 이러한 재사용 가능한 코드에는 데이터 저장소나 Google 계정 서비스와 같이 Google에서 제공하는 서비스나 Google의
인프라스트럭처에서 작동하도록 포팅된 오픈 소스 라이브러리가 있다. 다른 개발자의 코드를 재사용하면 일반적으로 코드를
덜 작성하게 되며 코드가 적어지면 결함이 줄어들 확률이 높아진다.
필자가 선호하는 오픈 소스 라이브러리(사실상 플랫폼)는 Groovy이며 이 라이브러리를 사용하면 코드를 더 적게 사용하고도 작동하는 애플리케이션을 만들 수 있다.
(참고자료를 확인한다.) Groovy 팀은 최근에 Google App Engine에서 동작하는 다양한 버전의 플랫폼을 릴리스했으며 이 플랫폼을 사용하면
서블릿 대신 Groovlet을 활용하여 즉시 애플리케이션을 만들 수 있다. Groovlet은 간단한 Groovy 스크립트로 서블릿처럼
동작한다. 이미 서블릿을 사용하여 "Hello, world"를 출력해 보았으므로 Groovlet을 사용하면 같은 작업이 얼마나 쉬워지는지 그리고 코드가
얼마나 줄어드는지 살펴보도록 하자.
Eclipse 플러그인을 사용하여 Google App Engine에서 Groovlet을 전개하려면 몇 가지 간단한 단계를 수행해야 한다.
- http://groovy.codehaus.org/Download에서 Groovy 최신 버전(이 기사를 쓰는 현재 1.6.3)을 다운로드한다.
- groovy-all-1.6.3.jar를 찾아서 App Engine 프로젝트의 war/WEB-INF/lib 디렉토리에 저장한다. 그런데 이 디렉토리에
해당 애플리케이션에 필요한 모든 라이브러리를 저장할 수도 있으며 그러면 경고가 발생할 수 있다. (이점은 잠시 후에 살펴 본다.)
- Listing 1(Groovlet을 특정 요청에 맵핑함)의 구문을 war/WEB-INF 디렉토리에 있는 web.xml 파일에 추가한다.
Listing 1. web.xml 파일을 갱신하여 Groovlet 지원하기
<servlet>
<servlet-name>GroovyServlet</servlet-name>
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GroovyServlet</servlet-name>
<url-pattern>*.groovy</url-pattern>
</servlet-mapping>
|
- WEB-INF 디렉토리에 Groovlet을 저장할 Groovy 디렉토리를 추가한다. Groovy 디렉토리에서 helloworld.groovy라고 하는 새로운 파일을
작성한다. 이 새 파일에
println "Hello, Groovy baby!"를 입력한다.
- 해당 애플리케이션의 버전을 1 - 1로 갱신하고 다시 전개한다. Google 대시보드를 통해 해당 URL을 찾은 후 브라우저에 /helloworld.groovy를 입력하여
Google 인프라스트럭처에서 Groovy를 통해 출력된 멋진 힙 메시지를 확인한다.
이 과정은 매우 간단했다. Groovy JAR를 추가하고, web.xml 파일을 갱신하고, 새 Groovy 디렉토리를 작성하고,
Groovlet을 쓰고 전개하기만 하면 모든 작업이 끝난다. 또한 Eclipse 플러그인에서 생성한 기본 서블릿으로 그것도 한 라인의 코드만을
사용하여 Groovlet에서 어떻게 동일한 작업을 수행했는지 확인하라. 같은 작업을 처리하기 위해 쓰고 유지하기 좋은 것은 대형
클래스와 작은 클래스 중 어떤 것일까?
Groovy + Java = 신속한 애플리케이션 작성
이제 Google App Engine과 Groovy를 사용하여 애플리케이션을 바로 만드는 방법을 살펴보도록
한다. 이벤트(이 경우에는 트라이애슬론)를 유지하기 위해 간단한 HTML 페이지와 Groovlet, JDO-enhanced Java
클래스를 사용한다. 이번에는 간단하게 하지만 이 애플리케이션을 확장하여 다른 기능을 추가할 수도 있다.
신속한 JDO
Google App Engine에는 데이터 유지를 위한 Java 표준(참고자료 확인)인 JDO를 사용하여 데이터를 유지할 수 있는
기능이 있다. 대부분의 Java 개발자에게 데이터를 유지한다는 것은 일반적으로 관계형 데이터베이스에 정보를 저장하는 것을
의미하지만 Google의 경우에 기본 스토리지 메커니즘은 관계형 데이터베이스가 아닌 자체적으로 보유하고 있는
Big Table이다. 그렇지만 이점이 문제가 되는 것은 아니며 Google에서 특정 속성을 유지하는 자세한 방법은 대부분
비밀이다. 일반적인 Java 오브젝트(실제로는 Groovy 오브젝트)를 사용하여 다른 애플리케이션에서와같이 정보를 저장할 수 있는
애플리케이션을 빌드할 수 있으면 그것으로 충분하다. Google에서는 JDO만을 사용해야 한다. (Java용 ORM 프레임워크 중 가장
인기있는 Hibernate는 Google App Engine에서 동작하지 않는다.)
JDO는 매우 단순하다. 클래스 레벨 @PersistenceCapable 어노테이션을 통해 유지 가능형으로 선언한 순수한 기존 Java 오브젝트(다른
Java 오브젝트와 관계가 있을 수 있음)를 작성한다. @Persistent 어노테이션을 통해 유지할 오브젝트의 특성을
지정한다. 예를 들면 필자는 트라이애슬론 이벤트를 저장하려고 하며 이 경우에는 트라이애슬론과 관련된 다양한 결과 즉, 이벤트의 이름, 설명(트라이애슬론 유형)
및 날짜보다는 해당 이벤트를 집중적으로 살펴본다. 지금까지의 JDO는 Listing 2와 같다.
Listing 2. 간단한 트라이애슬론 이벤트 JDO
import java.util.Date;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.IdentityType;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Triathlon {
@Persistent
private Date date;
@Persistent
private String name;
@Persistent
private String description;
}
|
관계형 데이터베이스나 Google Big Table과 같은 기본 메커니즘에 관계없이 데이터를 유지하려면 여전히 다양한 데이터의 고유성을
보장하는 방법인 키를 표시하여 데이터의 충돌을 방지해야 한다. 예를 들어 트라이애슬론의 경우에 이 키는 트라이애슬론의
이름이 될 수 있다. 이름이 같은 두 개의 트라이애슬론이 있는 경우 이 키는 이름과 날짜를 조합한 것일 수
있다. Google App Engine과 JDO에서 키를 표현하는 방법과 관계없이 @PrimaryKey 어노테이션을 통해 해당 JDO 오브젝트에서
키를 지정해야 한다. 또한 키를 생성하는 방법에 대한 전략(Google 인프라스트럭처에서 할 것인지 직접 할 것인지)을 선택할 수
있다. 여기에서는 Google을 활용할 것이며 그 과정은 간단하다. 트라이애슬론 오브젝트의 키는 일반적인 Java Long 오브젝트로 표현되며
가치 전략(value strategy)을 지정하여 Google에서 실제 값을 선택하도록 할 것이다. Listing 3에서는 다음과 같이 1차 키를 추가한다.
Listing 3. 트라이애슬론 JDO에 1차 키 추가하기
import java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import javax.jdo.annotations.IdentityType;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ReflectionToStringBuilder;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Triathlon {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private Date date;
@Persistent
private String name;
@Persistent
private String description;
public Triathlon(Date date, String name, String description) {
super();
this.date = date;
this.name = name;
this.description = description;
}
//...setters and getters left out
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
public boolean equals(Object obj) {
return EqualsBuilder.reflectionEquals(this, obj);
}
}
|
Listing 3에서 알 수 있듯이 이제 트라이애슬론 JDO에는 Google 인프라스트럭처에서 관리하는 키가 있으며 디버깅, 로깅 및 기능에 상당한
도움을 주는 몇 개의 표준 메소드(toString, hashCode 및 equals)가 추가되었다. 이러한 메소드를 직접 작성하는 대신 Apache commons-lang
라이브러리(참고자료 확인)를 사용하였다. 또한 완전히 초기화된 오브젝트를 다수의 세터 메소드를 호출하는 것보다 더 쉽게 작성할 수 있도록
하는 생성자를 추가했다.
이 JDO를 목적에 맞게 간단하게 작성했지만 알 수 있는 바와 같이 여기에는 많은 기능이 빠져 있다. 다시 말해서 간결하게 하기 위해
모든 관계와 게터(getter), 세터(setter)를 생략했다. 해당 도메인을 간단히 모델링한 후 이 모델에 몇 개의 어노테이션을
추가하면 나머지는 Google에서 처리한다.
마지막 단계에서는 유지 가능형으로 선언한 오브젝트를 사용한다. 기본 데이터 저장소와 상호작용을 하려면 JDO 표준 클래스인
PersistenceManager를 사용해야 하며 이 클래스는 Hibernate의 Session 오브젝트와 같이 기본 데이터 저장소에서 오브젝트를
저장하거나 갱신, 검색, 제거한다. 이 클래스는 오히려 중량급 팩토리(PersistenceManagerFactory)를 통해 작성된다. 따라서
Google에서는 필요할 때 해당 PersistenceManager를 리턴하는 하나의 팩토리 인스턴스를 관리하는 싱글톤 오브젝트를
작성할 것을 권장한다. 따라서 Listing 4와 같이 PersistenceManager 인스턴스를 리턴하는 데 필요한 간단한 싱글톤 오브젝트를 정의한다.
Listing 4. PersistenceManager 인스턴스를 리턴하는 데 필요한 간단한 싱글톤 오브젝트
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
public class PersistenceMgr {
private static final PersistenceManagerFactory instance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PersistenceMgr() {}
public static PersistenceManager manufacture() {
return instance.getPersistenceManager();
}
}
|
알 수 있는 바와 같이 이 PersistenceMgr는 매우 단순하다. manufacture라는 하나의 메소드가 하나의 PersistenceManagerFactory 인스턴스에서
하나의 PersistenceManager 인스턴스를 리턴한다. 또한 Listing 4에는 Google에 특정된 코드나 JDO를 사용하는 다른 코드가 없으며 표준 JDO 클래스와
인터페이스만을 참조하고 있다는 것을 알 수 있다.
새롭게 작성한 두 가지 Java 오브젝트는 해당 프로젝트의 src 디렉토리에 있으며 war/WEB-INF/lib 디렉토리에 commons-lang 라이브러리를 추가했다.
유용한 PersistenceMgr 오브젝트와 정의한 간단한 트라이애슬론 JDO POJO를 사용하면 순조롭게 진행된다. 이제 트라이애슬론 정보를 캡처하는 방법만 남았다.
웹 인터페이스를 이용한 데이터 캡처
웹 애플리케이션은 대부분 HTML 양식을 통해 정보를 캡처하고 이것을 서버측 자원으로 제출하여 처리하는 패턴을
따른다. 물론 다양한 기술을 여러 곳에서 사용하고 있지만 이러한 패턴은 기본 기술이나 인프라스트럭처와 관계없이
동일하게 유지된다. 이미 서버측 자원을 코드화하여 트라이애슬론 데이터를 저장하는 과정을 처리했듯이 Google App Engine도
다르지 않다. 이제 남은 것은 정보(양식)를 캡처하여 서버측 자원과 이 양식을 서로 연결하는 방법만 남아있다. MVC(Model-View-Controller)에서
서블릿에 해당하는 제어기가 필요하지만 코드를 줄이기 위해 여기에서는 Groovlet을 사용한다.
HTML 양식은 간단하다. 단순한 CSS(Cascading Style Sheet) 코드를 활용하는 HTML 페이지를 작성하기만 하면 HTML 페이지 circa 1998보다는
Web 2.0을 닮은 그림 1과 같은 양식을 만들 수 있다.
그림 1. 간단한 HTML 양식
그림 1에서 알 수 있는 바와 같이 이 양식을 이용하여 이름과 설명, 날짜를 캡처한다. 그러나 날짜는 다소 복잡하여 3개의 날짜 속성으로 분리되어 있다.
Groovlet을 사용하여 빠르게 코딩하기
Groovlet를 이용하면 제어기를 신속하게 코딩할 수 있으며 적은 코드를 사용하여 필요한 오브젝트를 자동으로
작성할 수 있다. Groovlet에서는 request 및 response 오브젝트를 통해 사용자가 각각 HTML 요청 및 응답에 대해 묵시적으로
액세스 권한을 갖게 된다. 다음 Groovlet에서는 그림 5와 같이 request.getParameter("name")를 호출하여 제출된 HTML 양식의 모든 속성을 가져온다.
Listing 5. 작동 중인 Groovlet
def triname = request.getParameter("tri_name")
def tridesc = request.getParameter("tri_description")
def month = request.getParameter("tri_month")
def day = request.getParameter("tri_day")
def year = request.getParameter("tri_year")
|
앞서 코딩한 JDO에서는 Java Date 오브젝트를 활용했지만 Listing 5에서는 Date 속성을 3개로 구분하여 처리하고
있다. 따라서 Listing 6과 같이 month, day, year 조합을 일반적인 Java Date로 변환하려면 DateFormat 오브젝트가 필요하다.
Listing 6. 작동 중인 날짜 포맷팅
def formatter = new SimpleDateFormat("MM/dd/yyyy")
def tridate = formatter.parse("${month}/${day}/${year}")
|
마지막으로, 제출된 HTML 양식에서 얻은 모든 매개변수와 더불어 Listing 4의 PersistenceMgr 오브젝트와 JDO를 사용하여
Google의 인프라스트럭처에 데이터를 유지할 수 있다.
Listing 7. JDO를 사용하여 쉽게 유지하기
def triathlon = new Triathlon(tridate, triname, tridesc)
def mgr = PersistenceMgr.manufacture()
try {
mgr.makePersistent(triathlon)
} finally {
mgr.close()
}
|
모든 작업이 끝났다. 물론 이러한 간단한 애플리케이션에 특정 트라이애슬론의 결과를 캡처하는 것과 같은 다양한 기능이
추가되면 이러한 정보를 캡처할 다른 양식으로 전달하거나 경로를 재지정하게 된다. 그럼에도 일반적인 Java로 코딩한 JDO와
Groovy로 코딩한 Groovlet를 사용하여 Google 인프라스트럭처에 데이터를 유지하는 간단한 웹 애플리케이션을 짧은 코드로
구성하였다. 이 애플리케이션을 전개하려면 appengine-web.xml 파일에서 버전을 지정하고 Deploy 단추를 누르면 된다.
트라이애슬론 이벤트를 캡처하기 위한 이 웹 애플리케이션(하나의 양식으로 구성된)이 그다지 유용하지 않지만
정형화되지 않은 일반적인 환경에 대한 전개 사례로 볼 수는 있을 것이다. 웹 컨테이너를 활성화하거나 심지어 애플리케이션을 전개할 위치도 지정하지
않았다. (그렇다면 이 애플리케이션이 어디에 있단 말인가?) 이점은 Google에서 처리하기 때문에 아무런 문제가 되지
않는다. 이러한 모든 부분을 Google에서 처리한다. 더욱이 인도에서 애플리케이션을 보는 사용자가 아르헨티나에 있는
사용자와 같은 경험을 할 수 있을 정도로 전세계적으로 규모를 조정하는 방법을 Google에서 알아냈다고 해도 과언이 아니다.
앞서 언급한 내용과 더불어 몇 가지 사항을 기억해야 한다. Google 인프라스트럭처는 Java 기술을 지원하지만 모두를 지원하는 것은
아니며 수 년 전에 J2ME가 나왔을 때를 기억한다면 App Engine의 한계도 본질적으로 유사하다는 점을 알 수 있을
것이다. 다시 말해서 모든 코어 Java 라이브러리와 관련 오픈 소스 라이브러리를 지원하는 것은 아니다. 언급한 바와 같이
Google App Engine에서는 관계형 데이터베이스를 사용하지 않기 때문에 Hibernate를 사용할 수 없다. 또한 base64 인코딩에 삽입된 일부 오픈 소스 라이브러리를
사용하는 데 다소 문제가 있었다. (그 대신 Google에서는 URL Fetch 서비스를 사용해야 한다.) Google App Engine은 하나의
플랫폼으로 사용자는 이 플랫폼에 맞춰 개발해야 하며 당분간은 그렇게 될 수밖에 없다.
미래는 이미 우리 곁에 있다.
오브젝트 지향 프로그래밍의 대부인 Alan Kay는 "미래를 예측하는 가장 좋은 방법은 창조하는 것이다"라고 말했다. 필자는 Alan Kay의 말에
동의한다. 다른 사람들이 Java 기술에 대한 미래를 어떻게 생각하든지 간에 미래는 이미 우리 곁에 와있다.
이 기사에서 살펴보았듯이 사용자가 Java를 사용한다면 Google App Engine은 미래를 위한 플랫폼이 될것이다. (여기에서는 단지 일부만을 살펴보았으며
Google App Engine에는 다양한 기능이 있다는 점을 기억해야 한다.) 유연성을 더 확보하고 싶은 경우 즉, 관계형 데이터베이스와 Hibernate가
꼭 필요하다면 그러나 다른 사업자의 확장 가능한 인프라스트럭처를 임대할 생각이 있다면 여러 가지 대안이 있을 수 있다. Amazon EC2는
말 그대로 정형화되지 않은 인프라스트럭처에서 동작하는 가상 서버이며 사용자도 온디맨드로 호출할 수 있다. 다음 달에 공개될 Java development 2.0 연재물에서 확인할 수 있다.
참고자료 교육
-
Google App Engine: Google App Engine 홈 페이지를 방문해 보자.
- Using the Google Plugin for Eclipse에서 Google Plugin for Eclipse를 사용하고, 새로운 App Engine 프로젝트를 작성하고,
Eclipse 내에서 실행 중인 개발 서버를 사용하여 디버그하는 방법을 학습할 수 있다.
-
"Google App Engine for Java"(Rick Hightower, developerWorks, 2009년 8월): 세 부분으로 구성된 이 시리즈에서 Java용 Google App Engine을 자세히 살표볼 수 있다.
-
"Stop writing so much code!"(Andrew Glover, developerWorks, 2008년 12월): Commons Lang을 표준
java.lang API로 확장하는 방법을 찾을 수 있다.
-
"Fluently Groovy"(Andrew Glover, developerWorks, March 2008): 이 튜토리얼에서는 Groovy에 익숙하지 않은 Java 개발자를 위해 Groovy에 대한 기본 사항을 빠르고 쉽게 소개하고 있다.
-
"Secrets of lightweight development success, Part 6: Persistence strategies"(Bruce Tate, developerWorks, 2005년 9월): 이 기사에서는 Java 플랫폼과 JDO에서 사용할 수 있는 다양한 유지 옵션을 검토하고 있다.
-
"Hands-on Java Data Objects"(Paul Monday, developerWorks, 2002년 7월):이 튜토리얼에서는 샘플 코드와 실제 예제 그리고 다양한 검토를 통해 실용적인 JDO 애플리케이션을 실제로 보여준다.
-
Cloud Computing: IBM® Cloud Computing Central에서 다양한 클라우드 리소스를 볼 수 있다.
-
기술 서점에서 다양한 기술 주제와 관련된 서적을 살펴보자.
-
developerWorks Java 기술 영역: Java 프로그래밍과 관련된 모든 주제를 다루는 여러 편의 기사를 찾아보자.
제품 및 기술 얻기
토론
필자소개  | 
|  | Andrew Glover는 개발자이자 저자이며 또한 강사이자 기업가로 동작 지향적 개발 및 연속적인 통합, 신속한 소프트웨어
개발에 대한 열정으로 가득 차 있다. 그의 블로그에서 그에 관한 다양한 정보를 얻을 수 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|