다음을 통해 공유


.NET 및 Entity Framework Core를 사용하여 Azure SQL 데이터베이스에 대한 연결 및 쿼리하기

적용 대상: Azure SQL 데이터베이스

이 빠른 시작은 애플리케이션을 Azure SQL 데이터베이스의 데이터베이스에 연결하고 .NET 및 Entity Framework Core를 사용하여 연결하고 쿼리하는 방법을 알려줍니다. 이 빠른 시작은 데이터베이스에 연결하는 데 권장되는 암호 없는 방법을 사용합니다. 암호 없는 허브의 암호 없는 연결에 대해 자세히 알아 보세요.

필수 조건

데이터베이스 서버 구성

Azure SQL 데이터베이스에 대한 암호 없는 보안 연결에는 특정 데이터베이스 구성이 필요합니다. 로컬 및 호스팅된 환경 모두에서 Azure SQL 데이터베이스에 제대로 연결하려면 Azure의 논리 서버에서 다음 설정을 확인합니다.

  1. 로컬 개발 연결의 경우 논리 서버가 로컬 컴퓨터 IP 주소 및 기타 Azure 서비스에 연결할 수 있도록 구성되어 있는지 확인합니다.

    • 서버의 네트워킹 페이지로 이동합니다.

    • 선택한 네트워크 라디오 버튼을 눌러 추가 구성 옵션을 표시합니다.

    • 클라이언트 IPv4 주소 추가(xx.xx.xx.xx.xx)를 선택하여 로컬 컴퓨터 IPv4 주소에서 연결을 활성화하는 방화벽 규칙을 추가합니다. 또는 + 방화벽 규칙 추가를 선택하여 원하는 특정 IP 주소를 입력할 수도 있습니다.

    • Azure 서비스 및 리소스의 서버 액세스 허용 확인란을 선택합니다.

      방화벽 규칙을 구성하는 방법을 보여 주는 스크린샷.

      경고

      프로덕션 시나리오에는 Azure 서비스 및 리소스의 서버 액세스 허용을 보안상 권장하지 않습니다. 실제 애플리케이션에는 더 강력한 방화벽 제한 또는 가상 네트워크 구성과 같은 보다 강력한 보안 접근 방식을 적용해야 합니다.

      다음 리소스에서 데이터베이스 보안 구성에 대해 자세히 알아 보세요.

  2. 또한 서버에는 Microsoft Entra 인증이 활성화 되어 있어야 하며 Microsoft Entra 관리자 계정이 할당되어 있어야 합니다. 로컬 개발 연결의 경우, Microsoft Entra 관리자 계정은 로컬로 Visual Studio 또는 Azure CLI에 로그인할 수도 있는 계정이어야 합니다. 서버의 Microsoft Entra 인증이 활성화 여부는 논리 서버의 Microsoft Entra ID 페이지에서 확인할 수 있습니다.

    Microsoft Entra 인증을 활성화하는 방법을 보여 주는 스크린샷.

  3. 개인 Azure 계정을 사용하는 경우, 계정을 서버 관리자로 할당하기 위해 Azure SQL 데이터베이스에 Microsoft Entra를 설정 및 구성했는지 확인해야 합니다. 회사 계정을 사용하는 경우, Microsoft Entra ID가 이미 구성되어 있을 수 있습니다.

프로젝트를 만듭니다.

이 섹션의 단계는 .NET CLI 또는 Visual Studio 2022를 사용하여 .NET Minimal Web API를 만드는 법을 설명합니다.

  1. Visual Studio 위쪽에서 파일>새로 만들기>프로젝트…로 차례로 이동합니다.

  2. 대화 상자 창의 프로젝트 템플릿 검색 상자에서 ASP.NET을 입력하고, ASP.NET Core 웹 API를 선택합니다. 대화 상자 아래쪽에서 다음을 선택합니다.

  3. 프로젝트 이름DotNetSQL을 입력합니다. 나머지 필드는 기본값으로 그대로 두고, 다음을 선택합니다.

  4. 프레임워크의 경우 .NET 7.0를 선택하고 컨트롤러 사용(최소 API를 사용하기 위해 선택 해제)을 선택 해제합니다. 이 빠른 시작은 최소 API 템플릿을 사용하여 엔드포인트를 만들기 및 구성을 간소화합니다.

  5. 만들기를 선택합니다. 새 프로젝트가 Visual Studio 환경 내에서 열립니다.

프로젝트에 Entity Framework Core 추가

.NET 및 Entity Framework Core를 사용하여 Azure SQL 데이터베이스에 연결하려면 다음 방법 중 하나를 사용하여 프로젝트에 3개의 NuGet 패키지를 추가해야 합니다.

  1. 솔루션 탐색기 창에서 프로젝트 종속성 노드를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택합니다.

  2. 결과 창에서 EntityFrameworkCore를 검색합니다. 다음 패키지 위치 설정 및 설치

  • Microsoft.EntityFrameworkCore: 필수 Entity Framework Core 기능을 제공합니다.
  • Microsoft.EntityFrameworkCore.SqlServer: 논리 서버에 연결할 추가 구성 요소를 제공합니다.
  • Microsoft.EntityFrameworkCore.Design: Entity Framework 마이그레이션 실행을 지원합니다.

또는 패키지 관리자 콘솔 창에서 cmdlet을 Install-Package 실행할 수도 있습니다.

Install-Package Microsoft.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Design

Azure SQL Server Database에 연결하려면 코드를 추가하세요.

Entity Framework Core 라이브러리는 Azure SQL 데이터베이스에 대한 암호 없는 연결을 구현하기 위해 Microsoft.Data.SqlClient 라이브러리와 Azure.Identity 라이브러리를 사용합니다. Azure.Identity 라이브러리는 Azure에 대한 암호 없는 인증을 처리하는 DefaultAzureCredential이라는 클래스를 제공합니다.

DefaultAzureCredential(은)는 여러 인증 방법을 지원하며 각 환경에 적합한 런타임에 사용할 방법을 결정합니다. 이 방법을 사용하면 앱에서 환경별 코드를 구현하지 않고도 다양한 환경(로컬 및 프로덕션)에서 다양한 인증 방법을 사용할 수 있습니다. Azure ID 라이브러리 개요DefaultAzureCredential(이)가 자격 증명을 찾는 순서와 위치에 설명합니다.

Entity Framework Core 및 기본 DefaultAzureCredential 클래스를 사용하여 Azure SQL 데이터베이스에 연결하려면 다음 단계를 완료합니다.

  1. 다음 코드와 일치하도록 ConnectionStrings 섹션을 appsettings.Development.json 파일에 추가합니다. <your database-server-name><your-database-name> 자리 표시자를 업데이트 해야 합니다.

    암호 없는 연결 문자열은 구성 값을 Authentication=Active Directory Default(을)를 포함하며, 이를 통해 Entity Framework Core는 Azure 서비스에 연결하는 데 DefaultAzureCredential(을)를 사용할 수 있습니다. 앱이 로컬로 실행되면 Visual Studio에 로그인한 사용자로 인증됩니다. 앱이 Azure에 배포되면 동일한 코드가 호스팅된 앱과 연결된 관리 ID를 검색하고 적용합니다. 이 앱은 이후 구성할 예정입니다.

    참고 사항

    암호 없는 연결 문자열은 사용자 이름, 암호 또는 액세스 키와 같은 기밀사항을 포함하지 않으므로 소스 제어에 커밋해도 안전합니다.

    {
        "Logging": {
            "LogLevel": {
                "Default": "Information",
                "Microsoft.AspNetCore": "Warning"
            }
        },
        "ConnectionStrings": {
            "AZURE_SQL_CONNECTIONSTRING": "Data Source=passwordlessdbserver.database.windows.net;
                Initial Catalog=passwordlessdb; Authentication=Active Directory Default; Encrypt=True;"
        }
    }
    
  2. 다음 코드를 Program.cs(이)라는 코드 줄 위의 var app = builder.Build(); 파일에 추가합니다. 이 코드는 다음 구성을 수행합니다.

    • 로컬 개발을 위해 appsettings.Development.json 파일 또는 호스트된 프로덕션 시나리오의 환경 변수에서 암호 없는 데이터베이스 연결 문자열 검색합니다.

    • Entity Framework Core DbContext 클래스를 .NET 종속성 주입 컨테이너에 등록합니다.

      var connection = String.Empty;
      if (builder.Environment.IsDevelopment())
      {
          builder.Configuration.AddEnvironmentVariables().AddJsonFile("appsettings.Development.json");
          connection = builder.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING");
      }
      else
      {
          connection = Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING");
      }
      
      builder.Services.AddDbContext<PersonDbContext>(options =>
          options.UseSqlServer(connection));
      
  3. app.Run() 위의 Program.cs 파일 맨 아래에 다음 엔드포인트를 추가하여 PersonDbContext 클래스를 사용하여 데이터베이스의 엔터티를 검색하고 추가합니다.

    app.MapGet("/Person", (PersonDbContext context) =>
    {
        return context.Person.ToList();
    })
    .WithName("GetPersons")
    .WithOpenApi();
    
    app.MapPost("/Person", (Person person, PersonDbContext context) =>
    {
        context.Add(person);
        context.SaveChanges();
    })
    .WithName("CreatePerson")
    .WithOpenApi();
    

    마지막으로 Program.cs 파일 맨 아래에 Person(와)과 PersonDbContext 클래스를 추가합니다 . Person 클래스는 데이터베이스 Persons 테이블의 단일 레코드를 나타냅니다. PersonDbContext 클래스는 Person 데이터베이스를 나타내며 코드를 통해 작업을 수행할 수 있습니다. Entity Framework Core에 DbContext에 대한 자세한 내용은 시작 설명서를 참조하세요.

    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }
    
    public class PersonDbContext : DbContext
    {
        public PersonDbContext(DbContextOptions<PersonDbContext> options)
            : base(options)
        {
        }
    
        public DbSet<Person> Person { get; set; }
    }
    

마이그레이션을 실행하여 데이터베이스 만들기

Entity Framework Core를 사용하여 데이터 모델과 일치하도록 데이터베이스 스키마를 업데이트하려면 마이그레이션을 사용해야 합니다. 데이터베이스 스키마를 증분 업데이트하여 애플리케이션의 데이터 모델과 동기화된 상태로 유지합니다. 마이그레이션 개요에서 이 패턴에 대해 자세히 알아볼 수 있습니다.

  1. 프로젝트의 루트에 터미널 창을 엽니다.

  2. 다음 명령을 실행하여 데이터베이스를 만들기 위한 첫 마이그레이션을 생성합니다.

    Add-Migration InitialCreate
    
  3. Migrations 폴더는 프로젝트 디렉터리에 고유한 숫자가 앞에 추가된 InitialCreate(이)라는 파일과 함께 표시되어야 합니다. 다음 명령을 실행하여 데이터베이스를 만들기 위한 마이그레이션을 생성합니다.

    Update-Database
    

    Entity Framework Core 도구는 PersonDbContext 클래스에서 정의한 Azure에서 데이터베이스 스키마를 만듭니다.

로컬로 앱 테스트

이제 앱을 로컬로 테스트할 준비가 완료되었습니다. 데이터베이스의 관리자로 설정한 계정과 동일한 계정으로 Visual Studio 또는 Azure CLI에 로그인했는지 확인합니다.

  1. Visual Studio 맨 위에 있는 실행 버튼을 눌러 API 프로젝트를 시작합니다.

  2. Swagger UI 페이지에서 POST 메서드를 확장하고 시도를 선택합니다.

  3. 이름과 성의 값을 포함하도록 샘플 JSON을 수정합니다. 실행을 선택하여 데이터베이스에 새 기록을 추가합니다. API는 성공적인 응답을 반환합니다.

    API를 테스트하는 방법을 보여주는 스크린샷

  4. Swagger UI 페이지에서 GET 메서드를 확장하고 시도를 선택합니다. 실행을 선택하면 방금 만든 사람이 반환됩니다.

Azure App Service에 배포

Azure에 앱을 배포할 준비가 완료되었습니다. Visual Studio는 Azure 앱 서비스를 만들고 단일 워크플로우에 애플리케이션을 배포할 수 있습니다.

  1. 앱이 중지되었고 성공적으로 빌드되는 지 확인하세요.

  2. Visual Studio 솔루션 탐색기에서 최상위 프로젝트 노드를 우클릭하고 게시를 선택합니다.

  3. 게시 대화 상자에서 Azure를 배포 대상으로 선택하고 다음을 선택합니다.

  4. 특정 대상 단계에서 Azure App Service(Windows)를 선택하고 다음을 선택합니다.

  5. 배포할 새 App Service를 만들 녹색의 + 아이콘을 선택하고 다음 값을 입력합니다.

    • 이름: 기본값을 그대로 둡니다.

    • 구독 이름: 배포할 구독을 선택합니다.

    • 리소스 그룹: 새로 만들기를 선택하고 msdocs-scalable-razor라는 새 리소스 그룹을 만듭니다.

    • 호스팅 계획: 새로 만들기를 선택하여 호스팅 계획 대화 상자를 엽니다. 기본값을 그대로 두고 확인을 선택합니다.

    • 만들기를 선택하여 열린 대화 상자를 닫습니다. Visual Studio는 Azure에서 App Service 리소스를 만듭니다.

      Visual Studio로 배포하는 방법을 보여주는 스크린샷

  6. 리소스가 만들어지면 앱 서비스 목록에서 리소스가 선택되어 있는지 확인하고 다음을 선택합니다.

  7. API 관리 단계에서 아래 이 단계 건너뛰기 체크박스를 선택한 다음 마침을 선택합니다.

  8. 게시 프로필 요약의 오른쪽 위에서 게시를 선택하여 Azure에 앱을 배포합니다.

배포가 완료되면 Visual Studio가 브라우저를 시작하여 호스팅된 앱을 표시합니다. 하지만 이 시점의 앱은 Azure에서 제대로 작동하지 않습니다. 데이터를 가져오려면 App Service와 SQL 데이터베이스 간의 보안 연결을 구성해야 합니다.

Azure SQL Server Database에 App Service 연결

App Service 인스턴스와 Azure SQL 데이터베이스 간에 암호 없는 연결을 만들려면 다음 단계를 진행해야 합니다.

  1. App Service 관리 ID 만들기 앱에 포함된 Microsoft.Data.SqlClient 라이브러리는 자동으로 로컬 Visual Studio 사용자를 찾은 것처럼 관리 ID를 자동으로 검색합니다.
  2. SQL 데이터베이스 사용자를 만들고 App Service 관리 ID와 연결합니다.
  3. 읽기, 쓰기 및 기타 작업을 허용하도록 데이터베이스 사용자에게 SQL 역할을 할당합니다.

다음 단계에 사용할 수 있는 여러 도구가 있습니다.

서비스 커넥터는 Azure의 여러 서비스 간에 인증된 연결을 간소화하는 도구입니다. 서비스 커넥터는 az webapp connection create sql 명령을 사용하여 Azure CLI를 통해 App Service를 SQL 데이터베이스에 연결할 수 있도록 지원합니다. 이 단일 명령은 위에서 언급된 세 단계를 완료합니다.

az webapp connection create sql
-g <your-resource-group>
-n <your-app-service-name>
--tg <your-database-server-resource-group>
--server <your-database-server-name>
--database <your-database-name>
--system-identity

App Service 설정에서 서비스 커넥터가 변경한 내용을 확인할 수 있습니다.

  1. App Service의 ID 페이지로 이동합니다. 시스템 할당 탭에서 상태켜짐 상태인지 확인합니다. 이 값은 앱에서 시스템 할당 관리 ID를 사용할 수 있음을 의미합니다.

  2. App Service의 구성 페이지로 이동합니다. 연결 문자열 탭에 AZURE_SQL_CONNECTIONSTRING이라는 연결 문자열이 있는지 확인합니다. 생성된 암호 없는 연결 문자열 보려면 클릭하여 값 표시를 선택합니다. 이 연결 문자열 이름은 앱에서 구성한 이름과 일치하므로 Azure에서 실행할 때 자동으로 검색됩니다.

중요

이 솔루션은 시작하기 위한 간단한 방법을 제공하지만 모범적인 프로덕션 등급 환경의 사례는 아닙니다. 이러한 시나리오에서 앱은 상승된 단일 ID를 사용하여 모든 작업을 수행해서는 안 됩니다. 특정 작업에 대한 특정 권한으로 여러 ID를 구성하여 최소 권한 원칙을 구현할 것을 권장합니다.

다음 리소스에서 데이터베이스 역할 및 보안을 구성하는 방법에 대해 자세히 알아 보세요.

자습서: Azure SQL 데이터베이스의 데이터베이스 보안

SQL Database에 대한 데이터베이스 액세스 권한 부여

배포된 애플리케이션 테스트

앱 URL로 이동하여 Azure SQL 데이터베이스 연결이 작동하는지 테스트합니다. 앱 URL는 App Service 개요 페이지에서 찾을 수 있습니다. URL 끝에 /person 경로를 추가하여 로컬에서 테스트한 것과 동일한 엔드포인트를 찾습니다.

로컬로 만든 사람이 브라우저에 표시되어야 합니다. 축하합니다! 이제 애플리케이션이 로컬 및 호스팅된 환경 모두에서 Azure SQL 데이터베이스에 연결되었습니다.

리소스 정리

Azure SQL 데이터베이스 작업을 마치면 리소스를 삭제하여 의도하지 않은 비용을 방지하세요.

  1. Azure Portal 검색 창에서 Azure SQL을 입력하고 일치하는 결과를 선택합니다.

  2. 데이터베이스 목록에서 데이터베이스를 찾아 선택합니다.

  3. Azure SQL 데이터베이스 개요 페이지에서 삭제를 선택합니다.

  4. Azure에서 삭제하시겠습니까? 페이지가 열리면확인을 위해 데이터베이스의 이름을 입력한 다음 삭제를 선택합니다.