빠른 시작: Azure Spring Apps에 첫 번째 Java 네이티브 이미지 애플리케이션 배포

참고 항목

처음 50 vCPU 시간과 100GB 메모리 시간은 매달 무료입니다. 자세한 내용은 Azure의 앱 블로그에서 가격 인하 - Azure Spring Apps로 더 많은 기능을 더 저렴하게!를 참조하세요.

참고 항목

Azure Spring Apps는 Azure Spring Cloud 서비스의 새 이름입니다. 서비스에 새 이름이 지정되었지만, 자산을 업데이트하는 동안 스크린샷, 비디오, 다이어그램과 같은 일부 위치에서는 당분간 이전 이름이 표시됩니다.

이 문서의 적용 대상:❌ 기본/표준 ✔️ 엔터프라이즈

이 빠른 시작에서는 Spring Boot 애플리케이션을 Azure Spring Apps에 네이티브 이미지로 배포하는 방법을 보여 줍니다.

네이티브 이미지 기능을 사용하면 Java 애플리케이션을 독립 실행형 실행 파일(네이티브 이미지라고도 함)로 컴파일할 수 있습니다. 이러한 실행 파일은 기존 JVM(Java Virtual Machine)에 비해 더 빠른 시작 시간 및 더 낮은 런타임 메모리 오버헤드를 포함하여 상당한 이점을 제공할 수 있습니다.

샘플 프로젝트는 Spring Petclinic 애플리케이션입니다. 다음은 이 애플리케이션을 보여 주는 스크린샷입니다.

Screenshot of a Spring Petclinic application in Azure Spring Apps.

1. 사전 요구 사항

2. Spring Petclinic 프로젝트 준비

다음 단계를 따라 앱을 로컬로 복제하고 실행합니다.

  1. 다음 명령을 사용하여 GitHub에서 Spring Petclinic 프로젝트를 복제합니다.

    git clone https://github.com/Azure-Samples/spring-petclinic.git
    
  2. 다음 명령을 사용하여 Spring Petclinic 프로젝트를 빌드합니다.

    cd spring-petclinic
    ./mvnw clean package -DskipTests -Pnative package
    
  3. 다음 명령을 사용하여 Maven으로 Spring Petclinic 애플리케이션을 실행합니다.

    java -jar target/spring-petclinic-3.1.0-SNAPSHOT.jar
    
  4. 사용하는 브라우저에서 http://localhost:8080으로 이동하여 Spring Petclinic 애플리케이션에 액세스합니다.

3. 클라우드 환경 준비

Spring Petclinic 애플리케이션을 실행하는 데 필요한 주요 리소스는 Azure Spring Apps 인스턴스입니다. 이 섹션에서는 리소스를 만드는 단계를 제공합니다.

3.1. 각 리소스에 대한 이름 제공

다음 명령을 사용하여 리소스 이름을 저장할 변수를 만듭니다. 자리 표시자를 사용자의 값으로 바꿔야 합니다.

export RESOURCE_GROUP=<resource-group-name>
export LOCATION=<location>
export AZURE_SPRING_APPS_NAME=<Azure-Spring-Apps-service-instance-name>
export NATIVE_BUILDER=native-builder
export JAR_APP_NAME=jar-app
export NATIVE_APP_NAME=native-app
export JAR_PATH=target/spring-petclinic-3.1.0-SNAPSHOT.jar

3.2. 새 리소스 그룹 만들기

다음 단계를 따라 새 리소스 그룹을 만듭니다.

  1. 다음 명령을 실행하여 Azure CLI에 로그인합니다.

    az login
    
  2. 다음 명령을 실행하여 기본 위치를 설정합니다.

    az configure --defaults location=${LOCATION}
    
  3. 다음 명령을 사용하여 사용할 구독 ID를 결정하는 데 사용할 수 있는 모든 구독을 나열합니다.

    az account list --output table
    
  4. 다음 명령을 사용하여 기본 구독을 설정합니다.

    az account set --subscription <subscription-ID>
    
  5. 다음 명령을 사용하여 리소스 그룹을 만듭니다.

    az group create --resource-group ${RESOURCE_GROUP}
    
  6. 다음 명령을 사용하여 새로 만든 리소스 그룹을 기본 리소스 그룹으로 설정합니다.

    az configure --defaults group=${RESOURCE_GROUP}
    

3.3. Azure Spring Apps 인스턴스 만들기

Azure Spring Apps는 Spring Petclinic 앱을 호스트하는 데 사용됩니다. 다음 단계를 사용하여 Azure Spring Apps 인스턴스와 그 안에 2개의 애플리케이션을 만듭니다.

  1. 다음 명령을 사용하여 Azure Spring Apps 서비스 인스턴스를 만듭니다. 네이티브 이미지 빌드에는 이미지 빌드 중에 16Gi의 메모리가 필요하므로 빌드 풀 크기를 S7로 구성합니다.

    az spring create \
        --name ${AZURE_SPRING_APPS_NAME} \
        --sku enterprise \
        --build-pool-size S7
    
  2. 현재 디렉터리에 builder-native.json 파일을 만들고 다음 콘텐츠를 추가합니다.

    {
       "stack": {
         "id": "io.buildpacks.stacks.jammy",
         "version": "tiny"
       },
       "buildpackGroups": [
         {
           "name": "default",
           "buildpacks": [
             {
               "id": "tanzu-buildpacks/java-native-image"
             }
           ]
         }
       ]
     }  
    
  3. 다음 명령을 사용하여 네이티브 이미지 애플리케이션을 빌드하는 사용자 지정 작성기를 만듭니다.

    az spring build-service builder create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_BUILDER} \
        --builder-file builder-native.json
    
  4. 다음 명령을 사용하여 Spring Petclinic 애플리케이션을 JAR 파일로 배포할 Azure Spring Apps 인스턴스에서 애플리케이션을 만듭니다. 메모리 한도를 1Gi로 구성합니다.

    az spring app create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${JAR_APP_NAME} \
        --cpu 1 \
        --memory 1Gi \
        --assign-endpoint true
    
  5. 다음 명령을 사용하여 Spring Petclinic 애플리케이션을 네이티브 이미지로 배포할 Azure Spring Apps 인스턴스에서 애플리케이션을 만듭니다.

    az spring app create \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME} \
        --cpu 1 \
        --memory 1Gi \
        --assign-endpoint true
    

4. Azure Spring Apps에 앱 배포

이제 클라우드 환경이 준비되었으므로 애플리케이션을 배포할 준비가 되었습니다.

다음 명령을 사용하여 Spring Petclinic 애플리케이션을 JAR 파일로 배포합니다.

az spring app deploy \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME} \
    --artifact-path ${JAR_PATH} \
    --build-env BP_JVM_VERSION=17

다음 명령을 사용하여 Spring Petclinic 애플리케이션을 네이티브 이미지로 배포합니다.

az spring app deploy \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME} \
    --builder ${NATIVE_BUILDER} \
    --build-cpu 8 \
    --build-memory 16Gi \
    --artifact-path ${JAR_PATH} \
    --build-env BP_JVM_VERSION=17 BP_NATIVE_IMAGE=true

5. 네이티브 이미지 앱 유효성 검사

이제 배포된 네이티브 이미지 앱에 액세스하여 작동하는지 확인할 수 있습니다. 다음 단계를 따라 유효성을 검사합니다.

  1. 배포가 완료되면 다음 명령을 실행하여 앱 URL을 가져올 수 있습니다.

    az spring app show \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME} \
        --output table
    

    출력에 Public Url로 표시된 URL을 사용하여 앱에 액세스할 수 있습니다. localhost에서 본 대로 페이지가 표시됩니다.

  2. 다음 명령을 사용하여 앱의 로그를 확인하여 배포 문제를 조사합니다.

    az spring app logs \
        --service ${AZURE_SPRING_APPS_NAME} \
        --name ${NATIVE_APP_NAME}
    

6. JAR 및 네이티브 이미지의 성능 비교

다음 섹션에서는 JAR 배포와 네이티브 이미지 배포의 성능을 비교하는 방법을 설명합니다.

서버 시작 시간

다음 명령을 통해 앱의 로그(Started PetClinicApplication in XXX seconds)를 확인하여 JAR 앱의 서버 시작 시간을 가져옵니다.

az spring app logs \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME}

서버 시작 시간은 JAR 앱의 경우 약 25초입니다.

다음 명령을 통해 앱의 로그를 확인하여 네이티브 이미지 앱의 서버 시작 시간을 가져옵니다.

az spring app logs \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME}

네이티브 이미지 앱의 경우 서버 시작 시간이 0.5초 미만입니다.

메모리 사용량

다음 명령을 사용하여 네이티브 이미지 앱의 메모리 크기를 512Mi로 줄입니다.

az spring app scale \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${NATIVE_APP_NAME} \
    --memory 512Mi

명령 출력에 네이티브 이미지 앱이 성공적으로 시작했음이 표시되어야 합니다.

다음 명령을 사용하여 JAR 앱의 메모리 크기를 512Mi로 줄입니다.

az spring app scale \
    --service ${AZURE_SPRING_APPS_NAME} \
    --name ${JAR_APP_NAME} \
    --memory 512Mi

명령 출력에 메모리 부족으로 인해 JAR 앱을 시작하지 못했음이 표시되어야 합니다. 출력 메시지는 Terminating due to java.lang.OutOfMemoryError: Java heap space와 유사해야 합니다.

다음 그림에서는 Petclinic 애플리케이션에 지속적으로 초당 400개 요청의 워크로드에 대한 네이티브 이미지 배포에 최적화된 메모리 사용량을 보여줍니다. 메모리 사용량은 해당 JAR 배포에서 사용하는 메모리의 약 1/5입니다.

Screenshot of the optimized memory usage of a Native Image deployment in Azure Spring Apps.

네이티브 이미지는 기존의 JVM(Java Virtual Machine)에 비해 시작 시간이 더 빠르고 런타임 메모리 오버헤드가 적습니다.

7. 리소스 정리

후속 빠른 시작 및 자습서를 계속 사용하려는 경우 이러한 리소스를 그대로 유지할 수 있습니다. 리소스가 더 이상 필요하지 않으면 리소스 그룹을 삭제하여 리소스를 삭제합니다. 다음 명령을 사용하여 리소스 그룹을 삭제합니다.

az group delete --name ${RESOURCE_GROUP}

8. 다음 단계

자세한 내용은 다음 문서를 참조하세요.