자바 7에서 자바 8 런타임으로 마이그레이션

이 페이지에서는 기존 App Engine 앱을 자바 7 런타임에서 자바 8 런타임으로 이전하는 방법에 대해 설명합니다. App Engine 자바 런타임은 OpenJDK를 기반으로 한다는 점에 유의하세요.

앱에 자바 8 런타임 지정하기

자바 8 런타임에서 앱을 실행하려면 다음 안내를 따르세요.

  1. appengine-web.xml 파일에 <runtime>java8</runtime>를 추가합니다.

    <appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
      <runtime>java8</runtime>
      <threadsafe>true</threadsafe>
    </appengine-web-app>
  2. 앱을 다시 배포합니다.

지원되지 않는 서비스에서 이전

자바 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 언어가 지원됩니다.