Azure Database for MySQL에서 Spring Data JPA 사용

이 자습서에서는 Spring Data JPA를 사용하여 Azure Database for MySQL 데이터베이스에 데이터를 저장하는 방법을 보여 줍니다.

JPA(Java 지속성 API) 는 개체 관계형 매핑을 위한 표준 Java API입니다.

이 자습서에는 Microsoft Entra 인증 및 MySQL 인증이라는 두 가지 인증 방법이 포함되어 있습니다. 암호 없는 탭에는 Microsoft Entra 인증이 표시되고 암호 탭에는 MySQL 인증이 표시됩니다.

Microsoft Entra 인증은 Microsoft Entra ID에 정의된 ID를 사용하여 Azure Database for MySQL에 연결하기 위한 메커니즘입니다. Microsoft Entra 인증을 사용하면 중앙 위치에서 데이터베이스 사용자 ID 및 기타 Microsoft 서비스를 관리할 수 있으므로 권한 관리가 간소화됩니다.

MySQL 인증은 MySQL에 저장된 계정을 사용합니다. 암호를 계정의 자격 증명으로 사용하도록 선택한 경우 이러한 자격 증명은 user 테이블에 저장됩니다. 이러한 암호는 MySQL에 저장되므로 암호 회전을 직접 관리해야 합니다.

필수 조건

  • MySQL 명령줄 클라이언트입니다.

  • Spring Boot 애플리케이션이 없는 경우 Spring Initializr를 사용하여 Maven 프로젝트를 만듭니다. Maven 프로젝트를 선택하고 종속성 아래에서 Spring Web, Spring Data JPAMySQL 드라이버 종속성을 추가한 다음 Java 버전 8 이상을 선택해야 합니다.

  • 없는 경우 Azure Database for MySQL 유연한 서버 인스턴스를 mysqlflexibletest만듭니다. 지침은 빠른 시작을 참조하세요 . Azure Portal을 사용하여 Azure Database for MySQL 유연한 서버를 만듭니다. 그런 다음 , 라는 데이터베이스를 만듭니다 demo. 자세한 내용은 Azure Database for MySQL 유연한 서버에 대한 데이터베이스 만들기 및 관리를 참조 하세요.

Important

암호 없는 연결을 사용하려면 Azure Database for MySQL 인스턴스에 대한 Microsoft Entra 관리자 사용자를 만듭니다. 자세한 내용은 Azure Database for MySQL - 유연한 서버에 대한 Microsoft Entra 인증 설정의 Microsoft Entra 관리 구성 섹션을 참조하세요.

샘플 애플리케이션 참조

이 자습서에서는 샘플 애플리케이션을 코딩합니다. 더 빠르게 이동하려는 경우 이 애플리케이션은 이미 코딩되어 있습니다 https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

MySQL 서버에 대한 방화벽 규칙 구성

Azure Database for MySQL 인스턴스는 기본적으로 보호됩니다. 들어오는 연결을 허용하지 않는 방화벽이 있습니다.

데이터베이스를 사용하려면 서버의 방화벽을 열어 로컬 IP 주소가 데이터베이스 서버에 액세스할 수 있도록 합니다. 자세한 내용은 Azure Portal을 사용하여 Azure Database for MySQL - 유연한 서버에 대한 방화벽 규칙 관리를 참조 하세요.

Windows 컴퓨터의 Linux용 Windows 하위 시스템(WSL)에서 MySQL 서버에 연결하는 경우 WSL 호스트 IP 주소를 방화벽에 추가해야 합니다.

MySQL 관리 사용자가 아닌 사용자 만들기 및 권한 부여

이 단계에서는 관리자가 아닌 사용자를 만들고 데이터베이스에 대한 demo 모든 권한을 부여합니다.

다음 방법을 사용하여 암호 없는 연결을 사용하는 관리자가 아닌 사용자를 만들 수 있습니다.

  1. 다음 명령을 사용하여 Azure CLI에 대한 서비스 커넥트 또는 암호 없는 확장을 설치합니다.

     az extension add --name serviceconnector-passwordless --upgrade
    
  2. 다음 명령을 사용하여 관리자가 아닌 Microsoft Entra 사용자를 만듭니다.

      az connection create mysql-flexible \
           --resource-group <your_resource_group_name> \
           --connection mysql_conn \
           --target-resource-group <your_resource_group_name> \
           --server mysqlflexibletest \
           --database demo \
           --user-account mysql-identity-id=/subscriptions/<your_subscription_id>/resourcegroups/<your_resource_group_name>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<your_user_assigned_managed_identity_name> \
           --query authInfo.userName \
           --output tsv
    

    명령이 완료되면 콘솔 출력의 사용자 이름을 기록해 둡니다.

Azure Database for MySQL에서 데이터 저장

이제 Azure Database for MySQL 유연한 서버 인스턴스가 있으므로 Spring Cloud Azure를 사용하여 데이터를 저장할 수 있습니다.

Spring Cloud Azure Starter JDBC MySQL 모듈을 설치하려면 pom.xml 파일에 다음 종속성을 추가합니다.

  • Spring Cloud AZURE BOM(청구서)

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.12.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    참고 항목

    Spring Boot 2.x를 사용하는 경우 버전을 .로 설정 spring-cloud-azure-dependencies 해야 합니다 4.18.0. 이 BOM(청구서)은 pom.xml 파일의 섹션에서 구성 <dependencyManagement> 해야 합니다. 이렇게 하면 모든 Spring Cloud Azure 종속성이 동일한 버전을 사용합니다. 이 BOM에 사용되는 버전에 대한 자세한 내용은 어떤 버전의 Spring Cloud Azure를 사용해야 하는지를 참조하세요.

  • Spring Cloud Azure Starter JDBC MySQL 아티팩트:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

참고 항목

버전 4.5.0이후 암호 없는 연결이 지원되었습니다.

Azure Database for MySQL을 사용하도록 Spring Boot 구성

Spring Data JPA를 사용하여 Azure Database for MySQL의 데이터를 저장하려면 다음 단계에 따라 애플리케이션을 구성합니다.

  1. application.properties 구성 파일에 다음 속성을 추가하여 Azure Database for MySQL 자격 증명을 구성합니다.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    spring.datasource.url=jdbc:mysql://mysqlflexibletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    Warning

    구성 속성spring.datasource.url에는 ?serverTimezone=UTC가 추가되어 데이터베이스에 연결할 때 UTC(협정 세계시) 날짜 형식을 사용하도록 JDBC 드라이버에 지시합니다. 이 매개 변수가 없으면 Java 서버는 데이터베이스와 동일한 날짜 형식을 사용하지 않으므로 오류가 발생합니다.

Important

암호 없는 연결을 사용하려면 Azure Database for MySQL 인스턴스에 대한 Microsoft Entra 관리자 사용자를 만듭니다. 자세한 내용은 MySQL 인증에 Microsoft Entra ID 사용의 Microsoft Entra 관리 사용자 설정 섹션을 참조하세요.

샘플 애플리케이션 참조

이 문서에서는 샘플 애플리케이션을 코딩합니다. 더 빠르게 이동하려는 경우 이 애플리케이션은 이미 코딩되어 있습니다 https://github.com/Azure-Samples/quickstart-spring-data-jpa-mysql.

MySQL 서버에 대한 방화벽 규칙 구성

Azure Database for MySQL 인스턴스는 기본적으로 보호됩니다. 들어오는 연결을 허용하지 않는 방화벽이 있습니다.

데이터베이스를 사용하려면 서버의 방화벽을 열어 로컬 IP 주소가 데이터베이스 서버에 액세스할 수 있도록 합니다. 자세한 내용은 Azure Portal을 사용하여 Azure Database for MySQL 방화벽 규칙 만들기 및 관리를 참조하세요.

Windows 컴퓨터의 Linux용 Windows 하위 시스템(WSL)에서 MySQL 서버에 연결하는 경우 WSL 호스트 IP 주소를 방화벽에 추가해야 합니다.

MySQL 관리 사용자가 아닌 사용자 만들기 및 권한 부여

이 단계에서는 관리자가 아닌 사용자를 만들고 데이터베이스에 대한 demo 모든 권한을 부여합니다.

Important

암호 없는 연결을 사용하려면 Azure Database for MySQL 인스턴스에 대한 Microsoft Entra 관리자 사용자를 만듭니다. 자세한 내용은 MySQL 인증에 Microsoft Entra ID 사용의 Microsoft Entra 관리 사용자 설정 섹션을 참조하세요.

비관리 사용자를 만들기 위해 create_ad_user.sql이라는 SQL 스크립트를 만듭니다. 다음 콘텐츠를 추가하고 로컬에 저장합니다.

export AZ_MYSQL_AD_NON_ADMIN_USERID=$(az ad signed-in-user show --query id --output tsv)

cat << EOF > create_ad_user.sql
SET aad_auth_validate_oids_in_tenant = OFF;
CREATE AADUSER '<your_mysql_ad_non_admin_username>' IDENTIFIED BY '$AZ_MYSQL_AD_NON_ADMIN_USERID';
GRANT ALL PRIVILEGES ON demo.* TO '<your_mysql_ad_non_admin_username>'@'%';
FLUSH privileges;
EOF

그런 다음, 다음 명령을 사용하여 SQL 스크립트를 실행하여 Microsoft Entra 비관리 사용자를 만듭니다.

mysql -h mysqlsingletest.mysql.database.azure.com --user <your_mysql_ad_admin_username>@mysqlsingletest --enable-cleartext-plugin --password=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) < create_ad_user.sql

Microsoft Entra 인증을 사용하여 Azure Database for MySQL에 연결하려면 설정한 Microsoft Entra 관리 사용자로 로그인한 다음 액세스 토큰을 암호로 가져와야 합니다. 자세한 내용은 MySQL 인증에 Microsoft Entra ID 사용을 참조 하세요.

Azure Database for MySQL에서 데이터 저장

이제 Azure Database for MySQL 단일 서버 인스턴스가 있으므로 Spring Cloud Azure를 사용하여 데이터를 저장할 수 있습니다.

Spring Cloud Azure Starter JDBC MySQL 모듈을 설치하려면 pom.xml 파일에 다음 종속성을 추가합니다.

  • Spring Cloud AZURE BOM(청구서)

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.12.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    참고 항목

    Spring Boot 2.x를 사용하는 경우 버전을 .로 설정 spring-cloud-azure-dependencies 해야 합니다 4.18.0. 이 BOM(청구서)은 pom.xml 파일의 섹션에서 구성 <dependencyManagement> 해야 합니다. 이렇게 하면 모든 Spring Cloud Azure 종속성이 동일한 버전을 사용합니다. 이 BOM에 사용되는 버전에 대한 자세한 내용은 어떤 버전의 Spring Cloud Azure를 사용해야 하는지를 참조하세요.

  • Spring Cloud Azure Starter JDBC MySQL 아티팩트:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-jdbc-mysql</artifactId>
    </dependency>
    

참고 항목

버전 4.5.0이후 암호 없는 연결이 지원되었습니다.

Azure Database for MySQL을 사용하도록 Spring Boot 구성

Spring Data JPA를 사용하여 Azure Database for MySQL의 데이터를 저장하려면 다음 단계에 따라 애플리케이션을 구성합니다.

  1. application.properties 구성 파일에 다음 속성을 추가하여 Azure Database for MySQL 자격 증명을 구성합니다.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.azure.passwordless-enabled=true
    spring.datasource.url=jdbc:mysql://mysqlsingletest.mysql.database.azure.com:3306/demo?serverTimezone=UTC
    spring.datasource.username=<your_mysql_ad_non_admin_username>@mysqlsingletest
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.properties.hibernate.dialect =org.hibernate.dialect.MySQL8Dialect
    

    Warning

    구성 속성spring.datasource.url에는 ?serverTimezone=UTC가 추가되어 데이터베이스에 연결할 때 UTC(협정 세계시) 날짜 형식을 사용하도록 JDBC 드라이버에 지시합니다. 이 매개 변수가 없으면 Java 서버는 데이터베이스와 동일한 날짜 형식을 사용하지 않으므로 오류가 발생합니다.

  1. Todo Java 클래스를 만듭니다. 이 클래스는 JPA에서 자동으로 생성되는 테이블에 매핑 todo 되는 do기본 모델입니다. 다음 코드는 해당 및 setters 메서드를 getters 무시합니다.

    package com.example.demo;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  2. 시작 클래스 파일을 편집하여 다음 콘텐츠를 표시합니다.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class DemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up correctly!", true)).collect(Collectors.toList()))
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends JpaRepository<Todo, Long> {
    
    }
    

    이 자습서에서는 구성 또는 코드에 인증 작업이 없습니다. 그러나 Azure 서비스에 연결하려면 인증이 필요합니다. 인증을 완료하려면 Azure ID를 사용해야 합니다. Spring Cloud Azure는 코드 변경 없이 자격 증명을 가져오는 데 도움이 되는 Azure ID 라이브러리를 사용합니다 DefaultAzureCredential.

    DefaultAzureCredential은 여러 인증 방법을 지원하고 런타임에 사용할 방법을 결정합니다. 이 방법을 사용하면 앱이 환경별 코드를 구현하지 않고도 다양한 환경(예: 로컬 및 프로덕션 환경)에서 다양한 인증 방법을 사용할 수 있습니다. 자세한 내용은 DefaultAzureCredential을 참조 하세요.

    로컬 개발 환경에서 인증을 완료하려면 Azure CLI, Visual Studio Code, PowerShell 또는 기타 방법을 사용할 수 있습니다. 자세한 내용은 Java 개발 환경에서 Azure 인증을 참조 하세요. Azure 호스팅 환경에서 인증을 완료하려면 사용자 할당 관리 ID를 사용하는 것이 좋습니다. 자세한 내용은 Azure 리소스에 대한 관리 ID란?을 참조하세요.

  3. 애플리케이션을 시작합니다. 다음 예제와 유사한 로그가 표시됩니다.

    2023-02-01 10:29:19.763 DEBUG 4392 --- [main] org.hibernate.SQL : insert into todo (description, details, done, id) values (?, ?, ?, ?)
    com.example.demo.Todo@1f
    

Azure Spring Apps에 배포

이제 Spring Boot 애플리케이션을 로컬로 실행했으므로 이제 프로덕션으로 이동해야 합니다. Azure Spring Apps 를 사용하면 코드를 변경하지 않고도 Spring Boot 애플리케이션을 Azure에 쉽게 배포할 수 있습니다. 이 서비스는 개발자가 코드에 집중할 수 있도록 Spring 애플리케이션의 인프라를 관리합니다. Azure Spring Apps는 포괄적인 모니터링 및 진단, 구성 관리, 서비스 검색, CI/CD 통합, 파란색-녹색 배포 등을 사용하여 수명 주기 관리를 제공합니다. Azure Spring Apps에 애플리케이션을 배포하려면 Azure Spring Apps에 첫 번째 애플리케이션 배포를 참조하세요.

다음 단계