다음을 통해 공유


MySQL을 사용하여 App Service에 Spring 앱 배포

참고 항목

Spring 애플리케이션의 경우 Azure Spring Apps를 사용하는 것이 좋습니다. 그러나 Azure App Service를 대상으로 계속 사용할 수 있습니다. 자세한 내용은 Java 애플리케이션에 적합한 Azure 서비스 선택을 참조 하세요.

이 자습서에서는 App Service Linux에서 Java 웹앱을 빌드, 구성, 배포, 문제 해결 및 확장하는 프로세스를 단계별로 안내합니다.

이 자습서는 인기 있는 Spring PetClinic 샘플 앱을 기반으로 합니다. 이 항목에서는 로컬에서 HSQLDB 버전의 앱을 테스트한 다음 Azure 앱 서비스에 배포합니다. 그런 다음 Azure Database for MySQL을 사용하는 버전을 구성하고 배포합니다. 마지막으로 앱 로그에 액세스하고 앱을 실행하는 작업자 수를 늘려 규모를 확장하는 방법을 알아봅니다.

필수 조건

샘플 가져오기

샘플 앱을 시작하려면 다음 명령을 사용하여 원본 리포지토리를 복제하고 준비합니다.

git clone https://github.com/spring-petclinic/spring-framework-petclinic.git
cd spring-framework-petclinic

로컬에서 HSQLDB 샘플 빌드 및 실행

먼저 HSQLDB를 데이터베이스로 사용하여 샘플을 로컬로 테스트합니다.

샘플 앱의 HSQLDB 버전을 빌드합니다.

mvn package

다음으로 TOMCAT_HOME 환경 변수를 Tomcat 설치 위치로 설정합니다.

export TOMCAT_HOME=<Tomcat install directory>

그런 다음 WAR 파일을 배포하기 위해 pom.xml 파일을 업데이트합니다. 다음 XML을 기존 요소의 자식으로 추가합니다 <plugins> . 필요한 경우 현재 버전의 Cargo Maven 3 플러그 인으로 변경 1.9.11 합니다.

<plugin>
    <groupId>org.codehaus.cargo</groupId>
    <artifactId>cargo-maven3-plugin</artifactId>
    <version>1.9.11</version>
    <configuration>
        <container>
            <containerId>tomcat9x</containerId>
            <type>installed</type>
            <home>${TOMCAT_HOME}</home>
        </container>
        <configuration>
            <type>existing</type>
            <home>${TOMCAT_HOME}</home>
        </configuration>
        <deployables>
            <deployable>
                <groupId>${project.groupId}</groupId>
                <artifactId>${project.artifactId}</artifactId>
                <type>war</type>
                <properties>
                    <context>/</context>
                </properties>
            </deployable>
        </deployables>
    </configuration>
</plugin>

이 구성을 사용하면 Tomcat에 로컬로 앱을 배포할 수 있습니다.

mvn cargo:deploy

그런 다음, Tomcat을 시작합니다.

${TOMCAT_HOME}/bin/catalina.sh run

이제 브라우저를 탐색하여 http://localhost:8080 실행 중인 앱을 보고 작동 방식에 대한 느낌을 얻을 수 있습니다. 완료되면 Bash 프롬프트에서 Ctrl+C를 선택하여 Tomcat을 중지합니다.

Azure App Service에 배포

로컬에서 실행되는 모습을 살펴보았으므로 이제 앱을 Azure에 배포합니다.

먼저 다음 환경 변수를 설정합니다. 여기에서 찾을 수 있는 , 사용 West US 2 또는 기타 지역의 경우 REGION

export RESOURCEGROUP_NAME=<resource group>
export WEBAPP_NAME=<web app>
export WEBAPP_PLAN_NAME=${WEBAPP_NAME}-appservice-plan
export REGION=<region>

Maven은 이러한 값을 사용하여 사용자가 제공하는 이름으로 Azure 리소스를 만듭니다. 환경 변수를 사용하여 계정 비밀을 프로젝트 파일에서 유지할 수 있습니다.

다음으로, pom.xml 파일을 업데이트하여 Azure 배포에 Maven을 구성합니다. 이전에 추가한 <plugin> 요소 뒤에 다음 XML을 추가합니다. 필요한 경우 2.5.0Azure App Service용 Maven 플러그 인의 최신 버전으로 변경합니다.

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

그런 다음, Azure에 로그인합니다.

az login

그런 다음 App Service Linux에 앱을 배포합니다.

mvn azure-webapp:deploy

이제 https://<app-name>.azurewebsites.net으로 이동하여 실행 중인 앱을 확인합니다. 여기서 <app-name>은 적절한 이름으로 바꿉니다.

Azure Database for MySQL 설정

다음으로 HSQLDB 대신 MySQL 사용으로 전환합니다. Azure에서 MySQL 서버 인스턴스를 만들고 데이터베이스를 추가한 다음, 새 데이터베이스 연결 정보를 사용하여 앱 구성을 업데이트합니다.

먼저 이후 단계에서 사용할 다음 환경 변수를 설정합니다.

export MYSQL_SERVER_NAME=<server>
export MYSQL_SERVER_FULL_NAME=${MYSQL_SERVER_NAME}.mysql.database.azure.com
export MYSQL_SERVER_ADMIN_LOGIN_NAME=<admin>
export MYSQL_SERVER_ADMIN_PASSWORD=<password>
export MYSQL_DATABASE_NAME=<database>
export DOLLAR=\$

다음으로 데이터베이스 서버를 만들고 초기화합니다. 초기 구성에 az mysql up을 사용합니다. 그런 다음 az mysql 서버 구성 집합을 사용하여 연결 시간 제한을 늘리고 서버 표준 시간대를 설정합니다.

az extension add --name db-up

az mysql up \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server-name ${MYSQL_SERVER_NAME} \
    --database-name ${MYSQL_DATABASE_NAME} \
    --admin-user ${MYSQL_SERVER_ADMIN_LOGIN_NAME} \
    --admin-password ${MYSQL_SERVER_ADMIN_PASSWORD}

az mysql server configuration set --name wait_timeout \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value 2147483

az mysql server configuration set --name time_zone \
    --resource-group ${RESOURCEGROUP_NAME} \
    --server ${MYSQL_SERVER_NAME} --value=-8:00

그런 다음 MySQL CLI를 사용하여 Azure의 데이터베이스에 연결합니다.

mysql -u ${MYSQL_SERVER_ADMIN_LOGIN_NAME}@${MYSQL_SERVER_NAME} \
 -h ${MYSQL_SERVER_FULL_NAME} -P 3306 -p

MySQL CLI 프롬프트에서 다음 명령을 실행하여 환경 변수에 대해 이전에 지정한 것과 동일한 값으로 명명된 데이터베이스를 MYSQL_DATABASE_NAME 확인합니다.

show databases;

이제 MySQL을 사용할 준비가 되었습니다.

MySQL용 앱 구성

다음으로, 앱의 MySQL 버전에 연결 정보를 추가한 다음 App Service에 배포합니다.

pom.xml 파일을 업데이트하여 MySQL을 활성 구성으로 만듭니다. <activation> 여기에 표시된 것처럼 H2 프로필에서 요소를 제거하고 대신 MySQL 프로필에 넣습니다. 나머지 코드 조각은 기존 구성을 보여 줍니다. 이전에 설정한 환경 변수가 Maven에서 MySQL 액세스를 구성하는 데 어떻게 사용되는지 확인합니다.

<profile>
    <id>MySQL</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <db.script>mysql</db.script>
        <jpa.database>MYSQL</jpa.database>
        <jdbc.driverClassName>com.mysql.jdbc.Driver</jdbc.driverClassName>
        <jdbc.url>jdbc:mysql://${DOLLAR}{MYSQL_SERVER_FULL_NAME}:3306/${DOLLAR}{MYSQL_DATABASE_NAME}?useUnicode=true</jdbc.url>
        <jdbc.username>${DOLLAR}{MYSQL_SERVER_ADMIN_LOGIN_NAME}@${DOLLAR}{MYSQL_SERVER_FULL_NAME}</jdbc.username>
        <jdbc.password>${DOLLAR}{MYSQL_SERVER_ADMIN_PASSWORD}</jdbc.password>
    </properties>
    ...
</profile>

다음으로, pom.xml 파일을 업데이트하여 Azure 배포 및 MySQL 사용을 위해 Maven을 구성합니다. 이전에 추가한 <plugin> 요소 뒤에 다음 XML을 추가합니다. 필요한 경우 2.5.0Azure App Service용 Maven 플러그 인의 최신 버전으로 변경합니다.

<plugin>
  <groupId>com.microsoft.azure</groupId>
  <artifactId>azure-webapp-maven-plugin</artifactId>
  <version>2.5.0</version>
  <configuration>
    <schemaVersion>v2</schemaVersion>
    <subscriptionId>${SUBSCRIPTION_ID}</subscriptionId>
    <resourceGroup>${RESOURCEGROUP_NAME}</resourceGroup>
    <appName>${WEBAPP_NAME}</appName>
    <region>${REGION}</region>
    <pricingTier>P1v2</pricingTier>
    <runtime>
      <os>Linux</os>
      <javaVersion>Java 8</javaVersion>
      <webContainer>TOMCAT 9.0</webContainer>
    </runtime>
    <appSettings>
      <property>
        <name>MYSQL_SERVER_FULL_NAME</name>
        <value>${MYSQL_SERVER_FULL_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_LOGIN_NAME</name>
        <value>${MYSQL_SERVER_ADMIN_LOGIN_NAME}</value>
      </property>
      <property>
        <name>MYSQL_SERVER_ADMIN_PASSWORD</name>
        <value>${MYSQL_SERVER_ADMIN_PASSWORD}</value>
      </property>
      <property>
        <name>MYSQL_DATABASE_NAME</name>
        <value>${MYSQL_DATABASE_NAME}</value>
      </property>
    </appSettings>
    <deployment>
      <resources>
        <resource>
          <directory>${project.basedir}/target</directory>
          <includes>
            <include>*.war</include>
          </includes>
        </resource>
      </resources>
    </deployment>
  </configuration>
</plugin>

다음으로, 앱을 빌드한 다음 Tomcat을 사용하여 배포하고 실행하여 로컬로 테스트합니다.

mvn package
mvn cargo:deploy
${TOMCAT_HOME}/bin/catalina.sh run

이제 http://localhost:8080에서 로컬로 앱을 볼 수 있습니다. 앱은 이전과 동일하게 보이고 동작하지만 HSQLDB 대신 Azure Database for MySQL을 사용합니다. 완료되면 Bash 프롬프트에서 Ctrl+C를 선택하여 Tomcat을 중지합니다.

마지막으로 App Service에 앱을 배포합니다.

mvn azure-webapp:deploy

이제 https://<app-name>.azurewebsites.net으로 이동하여 App Service 및 Azure Database for MySQL을 사용하여 실행 중인 앱을 확인할 수 있습니다.

앱 로그 액세스

문제를 해결해야 하는 경우 앱 로그를 확인할 수 있습니다. 로컬 머신에서 원격 로그 스트림을 열려면 다음 명령을 사용합니다.

az webapp log tail --name ${WEBAPP_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

로그 보기를 마쳤으면 Ctrl+C를 선택하여 스트림을 중지합니다.

로그 스트림은 .에서 https://<app-name>.scm.azurewebsites.net/api/logstream도 사용할 수 있습니다.

확장

앱에 대한 트래픽 증가를 지원하기 위해 다음 명령을 사용하여 여러 인스턴스로 확장할 수 있습니다.

az appservice plan update --number-of-workers 2 \
    --name ${WEBAPP_PLAN_NAME} \
    --resource-group ${RESOURCEGROUP_NAME}

축하합니다! Spring Framework, JSP, Spring Data, Hibernate, JDBC, App Service Linux 및 Azure Database for MySQL을 사용하여 Java 웹앱을 빌드하고 확장했습니다.

리소스 정리

이전 섹션에서는 리소스 그룹에서 Azure 리소스를 만들었습니다. 나중에 이러한 리소스를 사용하지 않을 것으로 예상되는 경우 다음 명령을 실행하여 리소스 그룹을 삭제합니다.

az group delete --name ${RESOURCEGROUP_NAME}

다음 단계

다음으로, App Service를 사용하여 Java에 사용할 수 있는 다른 구성 및 CI/CD 옵션을 검사.