구글 앱 엔진 시작하기

서비스 신청

https://cloud.google.com에서 비자 또는 마스터 신용카드나 체크카드로 서비스를 신청할 수 있다. 구글 계정에 로그인해야 서비스 신청을 할 수 있다.

서비스 신청 후 구글은 1년간 사용할 수 있는 300달러 무료 이용권을 제공한다. 1년간 300달러에 해당하는 서비스를 체험하는 것은 무료다. 300달러를 소진하거나 1년이 지나면 구글은 서비스를 계속 사용할지를 묻는다. 서비스를 계속 사용하겠다는 확답을 주면, 구글은 서비스 비용을 0으로 초기화하고 이후 발생한 서비스 비용은 신청 시 등록한 카드로 결제한다. 사용자는 무료 이용권을 사용하는 동안 자신에 맞는 서비스를 정하고 예산을 수립할 수 있는 역량을 키워야 한다.

프로젝트 생성

신청을 완료하고 다시 https://cloud.google.com을 방문하면 '콘솔로 이동' 버튼이 보인다. 버튼을 클릭하여 콘솔 화면으로 이동한다.

왼쪽 위 Google Cloud Platform 옆에서 프로젝트 생성 메뉴를 찾아 실행한다. 새 프로젝트 이름과 아이디 지정 프로젝트 이름을 입력하면 프로젝트 아이디는 프로젝트 이름-숫자 형태로 만들어진다. 프로젝트 이름을 독특하게 지으면 프로젝트 이름과 프로젝트 아이디가 같을 수 있다. 기억해야 할 것은 프로젝트 아이디다.

개발 환경

자바

윈도에서는 자바 8을, 우분투에서는 자바 11을 설치한다. 자바 8이 기본 환경이지만 우분투에서는 Cloud SDK글 설치할 때 자바 8이 같이 설치되므로 자바 11을 설치해도 된다. 윈도에 자바를 설치하는 방법은 아래 링크를 참조한다.
JDK 설치

메이븐

메이븐 설치를 참조하여 최신 버전을 설치한다.

Cloud SDK

https://cloud.google.com/sdk/docs/quickstart-windows
위 주소를 참조해 Cloud SDK를 설치한다.

윈도에서 환경 변수 PATH에 Cloud SDK의 bin 경로를 추가하려면 다음을 관리자 권한으로 실행한다.

.\google-cloud-sdk\install.bat

관리자 권한으로 명령 프롬프트를 열고, 다음 명령을 실행해서 app-engine-java 컴포넌트를 설치한다.

gcloud components install app-engine-java

다음 명령으로 gcloud 초기화를 진행한다.

gcloud init

사용할 프로젝트와 Google Compute Engine의 존(zone) 지정한다. 존 지정은 인스턴스가 생성될 지역을 설정하는 것으로, 주로 서비스되는 지역과 가까운 곳을 지정하는 게 좋다.
존에 대한 정보는 다음 주소를 참조한다.
https://cloud.google.com/compute/docs/regions-zones/

Git

https://git-scm.com에서 최신 바이너리 파일을 다운로드하고 압축을 푼다. 압축을 풀고 생성된 디렉터리를 적당한 곳으로 옮긴 후 Git의 bin 경로를 PATH 환경변수에 추가한다.

사용자 정보를 설정한다.

git config --global user.name "Gildong Hong"
git config --global user.email hong@gmail.org

설정을 확인한다.

git config --global --list

이클립스

http://www.eclipse.org에서 이클립스 인스톨러 파일을 내려받는다. 압축을 풀고 생성된 디렉터리에서 eclipse-inst로 시작하는 이클립스 인스톨러를 실행한 후 Java EE Developers를 설치한다.

구글 앱 엔진 방명록(guestbook) 아키타입 생성

자신이 지정한 워크스페이스에서 다음 명령을 실행한다.

C:\ Command Prompt
C:\Lab>mvn archetype:generate -Dappengine-version=1.9.84 -Dfilter=com.google.appengine.archetype:

Choose archetype:
1: remote -> com.google.appengine.archetypes:appengine-flexible-archetype
2: remote -> com.google.appengine.archetypes:appengine-skeleton-archetype
3: remote -> com.google.appengine.archetypes:appengine-standard-archetype
4: remote -> com.google.appengine.archetypes:endpoints-skeleton-archetype
5: remote -> com.google.appengine.archetypes:guestbook-archetype
6: remote -> com.google.appengine.archetypes:hello-endpoints-archetype
7: remote -> com.google.appengine.archetypes:skeleton-archetype (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 5 
Choose com.google.appengine.archetypes:guestbook-archetype version: 
1: 1.7.4
2: 1.7.4.1
3: 1.7.5
4: 1.7.6
5: 1.7.7
6: 1.8.4
7: 2.0.0-1.9.10
8: 3.0.0-1.9.20
9: 3.0.1-1.9.21
10: 3.0.1-1.9.25
11: 3.0.2-1.9.38
12: 3.1.0-1.9.42
13: 4.0.0
14: 4.0.1
15: 4.0.2
Choose a number: 15: 14 
Define value for property 'groupId': : net.java_school.guestbook
Define value for property 'artifactId': : guestbook
Define value for property 'version':  1.0-SNAPSHOT: : 
Define value for property 'package':  net.java_school.guestbook: : 
[INFO] Using property: CloudSDK_Tooling = true
[INFO] Using property: appengine-version = 1.9.84
[INFO] Using property: application-id = your-app-id
[INFO] Using property: java8 = true
[INFO] Using property: service = default
Confirm properties configuration:
groupId: net.java_school.guestbook
artifactId: guestbook
version: 1.0-SNAPSHOT
package: net.java_school.guestbook
CloudSDK_Tooling: true
appengine-version: 1.9.84
application-id: your-app-id
java8: true
service: default
 Y: : 
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Archetype: guestbook-archetype:4.0.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: net.java_school.guestbook
[INFO] Parameter: artifactId, Value: guestbook
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: net.java_school.guestbook
[INFO] Parameter: packageInPathFormat, Value: net/java_school/guestbook
[INFO] Parameter: CloudSDK_Tooling, Value: true
[INFO] Parameter: groupId, Value: net.java_school.guestbook
[INFO] Parameter: service, Value: default
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: application-id, Value: your-app-id
[INFO] Parameter: package, Value: net.java_school
[INFO] Parameter: artifactId, Value: guestbook
[INFO] Parameter: java8, Value: true
[INFO] Parameter: appengine-version, Value: 1.9.84
[INFO] project created from Archetype in dir: C:\Lab\guestbook
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

빌드가 완료되면 artifactId 값과 같은 이름의 서브 폴더가 생긴다. artifactId 값이 guestbook 이므로 guestbook 서브 폴더가 생긴다. guestbook 폴더로 이동하여 mvn clean package 명령을 실행한다.

C:\ Command Prompt
C:\Lab>cd guestbook
C:\Lab\guestbook>mvn clean package

로컬 테스트

로컬 테스트를 위해 mvn appengine:run 명령을 실행한다.

C:\ Command Prompt
C:\Lab\guestbook>mvn appengine:run

Dev App Server is now running이 보이면, 웹 브라우저로 http://localhost:8080을 방문하여 테스트한다. 테스트가 끝나면 Ctrl + C로 종료한다.

서버 테스트

pom.xml을 열고 <!-- <app.deploy.project>your-app-id</app.deploy.project> --> 에서 your-app-id를 자신의 프로젝트 아이디로 수정한 후 주석을 제거한다.

<properties>
    <app.deploy.project>프로젝트 아이디</app.deploy.project>

서버로 앱을 배포하려면 명령 프롬프트에서 mvn appengine:deploy를 실행한다.

C:\ Command Prompt
C:\Lab\guestbook>mvn appengine:deploy

빌드가 성공하면 https://프로젝트 아이디.appspot.com을 방문한다. 로컬 테스트와 달리 다음과 같은 서버 에러를 만날 수 있다. First Server Error 하지만 몇 분 후 다시 접속하면 서버 에러가 사라지고 방명록 화면을 볼 수 있다. First Remote Test

에러 원인은 데이터스토어 인덱스가 생성되기 전에 방문했기 때문이다. 데이터스토어 인덱스는 생성되는 데 몇 분 정도 소요된다. 인덱스가 없어서 발생하는 서버 에러의 경우, 구글 클라우드는 로그 메시지를 통해 자세한 내용을 알려준다. log message

데이터스토어 인덱스는 구글 클라우드 콘솔에서 확인할 수 있다. datatore indexes

Git 저장소 생성

gcloud source repos create "저장소 이름" 으로 구글 클라우드에 개인 저장소를 생성한다.

gcloud source repos create firstGaePjt

firstGaePjt 저장소를 구글 클라우드에 생성했다.

gcloud source repos clone "저장소 이름" 으로 로컬 저장소를 생성한다.

C:\Lab>gcloud source repos clone firstGaePjt

firstGaePjt라는 이름으로 로컬 저장소를 개발 시스템에 생성했다.
원격 저장소에 아무런 내용이 없으므로 warning: You appear to have cloned an empty repository.라는 메시지가 보이는 것은 당연하다. 생성된 firstGaePjt라는 디렉터리가 소스가 위치할 곳이다. C:\Lab\guestbook의 모든 파일을 C:\Lab\firstGaePjt 디렉터리에 복사한다.

이후는 일반적인 git 사용법과 같다.

git add . -A
git commit -m "First Commit"
git push origin master
참고