다음을 통해 공유


.NET 및 Microsoft.Data.SqlClient 라이브러리를 사용하여 Azure SQL 데이터베이스에 연결 및 쿼리

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

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

필수 구성 요소

데이터베이스 구성

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

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

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

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

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

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

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

      Warning

      프로덕션 시나리오에는 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 환경 내에서 열립니다.

Microsoft.Data.SqlClient 라이브러리 추가

.NET을 사용하여 Azure SQL 데이터베이스에 연결하려면 Microsoft.Data.SqlClient을(를) 설치하세요. 이 패키지는 데이터베이스 연결에서 명령을 실행하고 결과를 검색하며 데이터 공급자 역할을 수행합니다.

참고 항목

System.Data.SqlClient(이)가 아닌 Microsoft.Data.SqlClient(을)를 설치해야 합니다. Microsoft.Data.SqlClient(은)는 추가 기능을 제공하는 최신 버전의 SQL 클라이언트 라이브러리입니다.

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

  2. 결과 창에서 SqlClient를 검색합니다. Microsoft.Data.SqlClient 결과를 찾아 설치합니다.

연결 문자열 구성

Azure SQL 데이터베이스에 암호 없는 연결을 사용하여 로컬을 개발하려면 다음 ConnectionStrings 섹션을 appsettings.json 파일에 추가하세요. <database-server-name><database-name> 자리 표시자를 고유한 값으로 바꿉니다.

"ConnectionStrings": {
    "AZURE_SQL_CONNECTIONSTRING": "Server=tcp:<database-server-name>.database.windows.net,1433;Initial Catalog=<database-name>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=\"Active Directory Default\";"
}

암호 없는 연결 문자열은 Authentication="Active Directory Default"의 구성 값을 설정합니다. 이 값은 Microsoft.Data.SqlClient 라이브러리가 호출된 DefaultAzureCredential 클래스를 사용하여 Azure SQL 데이터베이스에 연결하도록 지시합니다. DefaultAzureCredential(은)는 Azure 서비스의 암호 없는 연결을 활성화하며 SQL 클라이언트 라이브러리가 사용하는 Azure ID 라이브러리에의 지원을 받습니다. DefaultAzureCredential(은)는 여러 인증 방법을 지원하며 런타임에 사용할 방법을 결정합니다.

예를 들어 앱이 로컬로 실행되면 DefaultAzureCredential(은)는 Visual Studio에 로그인한 사용자 계정으로 인증을 수행하거나 Azure CLI와 같은 다른 로컬 도구를 통해 인증을 수행합니다. 앱이 Azure에 배포되면 동일한 코드가 호스팅된 앱과 연결된 관리 ID를 검색하고 적용합니다. 이 앱은 이후 구성할 예정입니다. Azure ID 라이브러리 개요DefaultAzureCredential(이)가 자격 증명을 찾는 순서와 위치에 설명합니다.

참고 항목

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

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

Program.cs 파일의 내용을 다음 중요한 단계를 수행하는 다음 코드로 수정합니다.

  • appsettings.json에서 암호 없는 연결 문자열을 가져옵니다.
  • 시작하는 동안 데이터베이스에 Persons 테이블을 만듭니다(테스트 시나리오에만 해당).
  • Persons 테이블에 저장된 모든 기록을 검색하는 HTTP GET 엔드포인트를 만듭니다.
  • Persons 테이블에 새 기록을 추가하는 HTTP POST 엔드포인트를 만듭니다.
using Microsoft.Data.SqlClient;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// For production scenarios, consider keeping Swagger configurations behind the environment check
// if (app.Environment.IsDevelopment())
// {
    app.UseSwagger();
    app.UseSwaggerUI();
// }

app.UseHttpsRedirection();

string connectionString = app.Configuration.GetConnectionString("AZURE_SQL_CONNECTIONSTRING")!;

try
{
    // Table would be created ahead of time in production
    using var conn = new SqlConnection(connectionString);
    conn.Open();

    var command = new SqlCommand(
        "CREATE TABLE Persons (ID int NOT NULL PRIMARY KEY IDENTITY, FirstName varchar(255), LastName varchar(255));",
        conn);
    using SqlDataReader reader = command.ExecuteReader();
}
catch (Exception e)
{
    // Table may already exist
    Console.WriteLine(e.Message);
}

app.MapGet("/Person", () => {
    var rows = new List<string>();

    using var conn = new SqlConnection(connectionString);
    conn.Open();

    var command = new SqlCommand("SELECT * FROM Persons", conn);
    using SqlDataReader reader = command.ExecuteReader();

    if (reader.HasRows)
    {
        while (reader.Read())
        {
            rows.Add($"{reader.GetInt32(0)}, {reader.GetString(1)}, {reader.GetString(2)}");
        }
    }

    return rows;
})
.WithName("GetPersons")
.WithOpenApi();

app.MapPost("/Person", (Person person) => {
    using var conn = new SqlConnection(connectionString);
    conn.Open();

    var command = new SqlCommand(
        "INSERT INTO Persons (firstName, lastName) VALUES (@firstName, @lastName)",
        conn);

    command.Parameters.Clear();
    command.Parameters.AddWithValue("@firstName", person.FirstName);
    command.Parameters.AddWithValue("@lastName", person.LastName);

    using SqlDataReader reader = command.ExecuteReader();
})
.WithName("CreatePerson")
.WithOpenApi();

app.Run();

마지막으로 Program.cs 파일 맨 아래에 Person 클래스를 추가합니다 . 이 클래스는 데이터베이스 Persons 테이블의 단일 기록을 나타냅니다.

public class Person
{
    public required string FirstName { get; set; }
    public required string LastName { get; set; }
}

로컬 앱 실행 및 테스트

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

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

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

  3. firstlast 이름의 값을 포함하도록 샘플 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. 배포할 새 앱 서비스를 만들 + 아이콘을 선택하고 다음 값을 입력합니다.

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

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

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

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

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

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

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

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

  8. 마침 단계에서 대화 상자가 자동으로 닫히지 않으면 닫기를 선택합니다.

  9. 게시 프로필 요약의 오른쪽 위에서 게시를 선택하여 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 <app-service-resource-group> \
    -n <app-service-name> \
    --tg <database-server-resource-group> \
    --server <database-server-name> \
    --database <database-name> \
    --system-identity

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

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

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

Important

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

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

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

  1. App Service 개요 페이지의 맨 위에 있는 찾아보기 버튼을 선택하여 앱의 루트 URL을 실행합니다.

  2. URL에 /swagger/index.html 경로를 추가하여 로컬에서 사용한 것과 동일한 Swagger 테스트 페이지를 로드합니다.

  3. 테스트 GET 및 POST 요청을 실행하여 엔드포인트가 예상대로 작동하는지 확인합니다.

테스트 중 500 Internal Server 오류가 발생하는 경우 데이터베이스 네트워킹 구성 때문일 수 있습니다. 논리 서버가 데이터베이스 구성 섹션 내용대로 구성되었는지 확인합니다.

이제 애플리케이션이 로컬 및 호스팅된 환경 모두에서 Azure SQL 데이터베이스에 연결되었습니다.

리소스 정리

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

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

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

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

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