이 페이지에서는 기존 App Engine 앱을 자바 7 런타임에서 자바 8 런타임으로 이전하는 방법에 대해 설명합니다. App Engine 자바 런타임은 OpenJDK를 기반으로 한다는 점에 유의하세요.
앱에 자바 8 런타임 지정하기
자바 8 런타임에서 앱을 실행하려면 다음 안내를 따르세요.
appengine-web.xml
파일에<runtime>java8</runtime>
를 추가합니다.앱을 다시 배포합니다.
지원되지 않는 서비스에서 이전
자바 7 런타임에 제공되는 서비스 중 지원이 중단된 서비스는 자바 8 런타임에서 지원되지 않습니다. 애플리케이션을 권장 옵션으로 이전하여 해당 변경 사항을 적용한 상태에서 자바 7 런타임에서 앱을 테스트한 후에 자바 8로 이전할 것을 권장합니다.
지원이 중단된 다음과 같은 서비스는 자바 8 런타임에서 제공되지 않습니다.
지원이 중단된 서비스 | 권장 옵션 |
---|---|
Cloud Endpoints v1 | v2로 이전하며 제품 이름이 Cloud Endpoints Frameworks로 변경되었습니다. 이 경우 Web, Android, iOS 애플리케이션을 변경해야 할 수도 있습니다. |
AppStats(appengine-api-labs jar) | Cloud Trace로 마이그레이션합니다. SDK는 자바 8 런타임에서 com.google.appengine.tools.AppstatsFilter 클래스를 사용하여 앱에 오류를 생성합니다. web.xml 에서 AppstatsFilter 에 대한 모든 참조를 삭제해야 합니다. |
리패키지 클래스는 자바 8에서 새 가져오기 경로를 요구합니다. 예를 들어 앱에서 com.google.appengine.repackaged.com.google.common.base.Optional
을 사용하는 경우 클래스 이름 앞에 $
프리픽스를 추가하여 com.google.appengine.repackaged.com.google.common.base.$Optional
을 가져와야 합니다.
java.net.HttpURLConnection을 사용하는 무료 앱 마이그레이션
앱에 결제가 사용 설정되어 있지 않고 java.net.HttpURLConnection
클래스를 사용하거나 클래스를 사용하는 Google 클라이언트 라이브러리를 사용하여 HTTP(S) 요청을 보내면 런타임 오류가 발생합니다.
이를 방지하려면 앱의 appengine-web.xml
에서 <url-stream-handler>
를 urlfetch
로 설정합니다.
<?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <!-- ... --> <url-stream-handler>urlfetch</url-stream-handler> <!-- ... --> </appengine-web-app>
또는 urlfetch
를 지정하는 대신 애플리케이션 결제를 사용 설정하고 기본 native
설정을 사용할 수 있습니다. 자바 7에서 실행할 때보다 앱의 비용이 증가하지 않을 것입니다. 앱에서 모듈 간 통신에 사용되는 X-Appengine-Inbound-Appid
HTTP 헤더를 사용하면 urlfetch
를 사용해야 합니다.
기본 파일 인코딩 변경
App Engine이 기본 파일 인코딩을 자바 7의 US-ASCII
에서 자바 8의 UTF-8
로 변경했습니다. 기본 인코딩을 다시 자바 8에서 US-ASCII
로 변경하려면 다음을 appengine-web.xml
에 추가합니다.
<system-properties>
<property name="appengine.file.encoding" value="US-ASCII"/>
</system-properties>
ASCII 집합에 일부 문자가 없고 애플리케이션이 someString.getBytes().length == someString.length()
와 같은 특정한 가정을 수행하면 오류가 발생할 수 있습니다. US-ASCII 인코딩에서는 비 ASCII 문자가 '?'로 매핑되므로 이 가정이 사실이지만 UTF-8 인코딩의 경우에는 반드시 그렇지는 않습니다.
예를 들어 Éamonn.getBytes()
를 호출하여 16진수 바이트를 출력하면 UTF-8에서는 결과가 c3 89 61 6d 6f 6e 6e
(Éamonn
)가 되지만 US-ASCII에서는 다른 인코딩 값인 É
로 인해 3f 61 6d 6f 6e 6e
(?amonn
)를 얻게 됩니다.
자바 8 런타임 기능 최대한 활용하기
다음은 자바 8 런타임으로 이전할 경우의 장점 중 일부를 나열한 것입니다.
- Jetty 9는 서블릿 주석을 포함한 서블릿 2.5와 3.1 웹 애플리케이션을 모두 지원합니다.
- 이제 모든 표준 자바 클래스를 사용할 수 있고 클래스 허용 목록이 없습니다.
/tmp
파일 시스템에 쓰기가 가능합니다. 이 작업은 앱의 RAM 할당량을 사용합니다.- 이제 모든 자바 스레드에서 네트워크 I/O를 수행할 수 있습니다. App Engine API 호출은 여전히 요청 스레드나 Thread Manager API를 통해 만든 스레드상에서만 가능합니다.
- 이제 Stream API, Lambdas, Date/Time API 등 모든 자바 8 언어가 지원됩니다.