Azure SQL Database에서 Spring Data JPA 사용

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

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

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

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

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

필수 조건

  • sqlcmd 유틸리티

  • ODBC 드라이버 17 또는 18.

  • Azure SQL Server 인스턴스가 없는 경우 이름이 지정된 Azure SQL Server 인스턴스와 이름이 sqlservertest 지정된 demo데이터베이스를 만듭니다. 지침은 빠른 시작: 단일 데이터베이스 만들기 - Azure SQL Database를 참조 하세요.

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

Important

암호 없는 연결을 사용하려면 MS SQL Server 드라이버를 버전 12.1.0 이상으로 업그레이드한 다음 Azure SQL Database 서버 인스턴스에 대한 Microsoft Entra 관리 사용자를 만듭니다. 자세한 내용은 자습서: Azure SQL Database에서 데이터베이스 보안의 Microsoft Entra 관리자 만들기 섹션을 참조하세요.

샘플 애플리케이션 참조

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

Azure SQL Database 서버용 방화벽 규칙 구성

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

데이터베이스를 사용하려면 서버의 방화벽을 열어 로컬 IP 주소가 데이터베이스 서버에 액세스할 수 있도록 합니다. 자세한 내용은 자습서: Azure SQL Database에서 데이터베이스 보호

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

SQL Database 비관리자 사용자 만들기 및 권한 부여

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

암호 없는 연결을 사용하려면 다음 단계와 같이 자습서: Azure SQL Database에서 데이터베이스를 보호하거나 Service 커넥트or를 사용하여 Azure SQL Database 서버에 대한 Microsoft Entra 관리 사용자를 만듭니다.

  1. 먼저 Azure CLI에 대한 서비스 커넥트 또는 암호 없는 확장을 설치합니다.

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

    az connection create sql \
        --resource-group <your-resource-group-name> \
        --connection sql_conn \
        --target-resource-group <your-resource-group-name> \
        --server sqlservertest \
        --database demo \
        --user-account \
        --query authInfo.userName \
        --output tsv
    

만든 Microsoft Entra 관리자는 SQL Database 관리 사용자이므로 새 사용자를 만들 필요가 없습니다.

Important

Azure SQL Database 암호 없는 연결을 사용하려면 MS SQL Server 드라이버를 버전 12.1.0 이상으로 업그레이드해야 합니다. 연결 옵션은 authentication=DefaultAzureCredential 버전 및 authentication=ActiveDirectoryDefault 버전 12.1.012.2.0에 있습니다.

Azure SQL Database에서 데이터 저장

Azure SQL Database 인스턴스를 사용하면 Spring Cloud Azure를 사용하여 데이터를 저장할 수 있습니다.

Spring Cloud Azure Starter 모듈을 설치하려면 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 아티팩트:

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

    참고 항목

    종속성이므로 pom.xml 섹션에 <dependencies>추가해야 합니다. 이전에 추가한 BOM에서 관리되므로 해당 버전은 여기서 구성되지 않습니다.

Azure SQL Database를 사용하도록 Spring Boot 구성

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

  1. application.properties 구성 파일에서 Azure SQL Database 자격 증명을 구성합니다.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.datasource.url=jdbc:sqlserver://sqlservertest.database.windows.net:1433;databaseName=demo;authentication=DefaultAzureCredential;
    
    spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2016Dialect
    spring.jpa.hibernate.ddl-auto=create-drop
    

    Warning

    구성 속성 spring.jpa.hibernate.ddl-auto=create-drop 은 Spring Boot가 애플리케이션 시작 시 데이터베이스 스키마를 자동으로 만들고 종료 시 삭제를 시도한다는 것을 의미합니다. 이 기능은 테스트에 적합하지만 다시 시작할 때마다 데이터가 삭제되므로 프로덕션 환경에서는 사용하지 않아야 합니다.

  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에 첫 번째 애플리케이션 배포를 참조하세요.

다음 단계