다음을 통해 공유


데이터 작업

팁 (조언)

이 콘텐츠는 Blazor 또는 오프라인으로 읽을 수 있는 다운로드 가능한 무료 PDF로 제공되는 for ASP NET Web Forms Developers for Azure eBook에서 발췌한 것입니다.

Blazor-for-ASP-NET-Web-Forms-Developers eBook 표지 썸네일.

데이터 액세스는 ASP.NET Web Forms 앱의 중추입니다. 웹용 양식을 작성하는 경우 해당 데이터는 어떻게 되나요? Web Forms를 사용하면 데이터베이스와 상호 작용하는 데 사용할 수 있는 여러 데이터 액세스 기술이 있었습니다.

  • 데이터 소스
  • ADO.NET
  • 엔티티 프레임워크

데이터 원본은 Web Forms 페이지에 배치하고 다른 컨트롤처럼 구성할 수 있는 컨트롤이었습니다. Visual Studio는 컨트롤을 구성하고 Web Forms 페이지에 바인딩하는 친숙한 대화 상자 집합을 제공했습니다. "낮은 코드" 또는 "코드 없음" 접근 방식을 사용하는 개발자는 Web Forms가 처음 릴리스될 때 이 기술을 선호했습니다.

데이터 원본

ADO.NET 데이터베이스와 상호 작용하는 하위 수준 방법입니다. 앱은 상호 작용을 위해 명령, Datatable 및 데이터 세트를 사용하여 데이터베이스에 대한 연결을 만들 수 있습니다. 그런 다음 많은 코드 없이 화면의 필드에 결과를 바인딩할 수 있습니다. 이 방법의 단점은 각 ADO.NET 개체 집합(ConnectionCommandDataTable)이 데이터베이스 공급업체에서 제공하는 라이브러리에 바인딩되었다는 것입니다. 이러한 구성 요소를 사용하면 코드를 엄격하고 다른 데이터베이스로 마이그레이션하기가 어려웠습니다.

엔티티 프레임워크

EF(Entity Framework)는 .NET Foundation에서 유지 관리하는 오픈 소스 개체 관계형 매핑 프레임워크입니다. .NET Framework를 사용하여 처음 릴리스된 EF를 사용하면 데이터베이스 연결, 스토리지 스키마 및 상호 작용에 대한 코드를 생성할 수 있습니다. 이 추상화에서는 앱의 비즈니스 규칙에 중점을 두고 신뢰할 수 있는 데이터베이스 관리자가 데이터베이스를 관리하도록 허용할 수 있습니다. .NET에서는 EF Core라는 업데이트된 버전의 EF를 사용할 수 있습니다. EF Core는 명령줄 도구를 사용하여 사용할 수 있는 일련의 명령을 사용하여 dotnet ef 코드와 데이터베이스 간의 상호 작용을 생성하고 유지 관리하는 데 도움이 됩니다. 데이터베이스 작업을 수행하는 데 사용할 수 있는 몇 가지 샘플을 살펴보겠습니다.

EF Code First

데이터베이스 상호 작용 빌드를 시작하는 빠른 방법은 작업하려는 클래스 개체로 시작하는 것입니다. EF는 클래스에 적합한 데이터베이스 코드를 생성하는 데 도움이 되는 도구를 제공합니다. 이 방법을 "Code First" 개발이라고 합니다. Microsoft SQL Server와 같은 관계형 데이터베이스에 저장하려는 샘플 상점 앱의 경우 다음 Product 클래스를 고려합니다.

public class Product
{
    public int Id { get; set; }

    [Required]
    public string Name { get; set; }

    [MaxLength(4000)]
    public string Description { get; set; }

    [Range(0, 99999,99)]
    [DataType(DataType.Currency)]
    public decimal Price { get; set; }
}

제품에는 기본 키와 데이터베이스에 생성될 세 개의 추가 필드가 있습니다.

  • EF는 규칙에 따라 Id 속성을 기본 키로 식별합니다.
  • Name 는 텍스트 스토리지에 대해 구성된 열에 저장됩니다. 이 속성에 데코레이팅된 [Required] 특성은 선언된 속성 동작을 적용하는 데 도움이 되는 not null 제약 조건을 추가합니다.
  • Description 는 텍스트 스토리지에 대해 구성된 열에 저장되고 특성에 따라 [MaxLength] 최대 길이가 4000자로 구성됩니다. 데이터베이스 스키마는 데이터 형식MaxLength을 사용하여 명명된 varchar(4000) 열로 구성됩니다.
  • 속성은 Price 통화로 저장됩니다. 이 특성은 [Range] 선언된 최소값과 최대값을 벗어나는 데이터 스토리지를 방지하기 위해 적절한 제약 조건을 생성합니다.

데이터베이스와의 연결 및 변환 작업을 정의하는 데이터베이스 컨텍스트 클래스에 이 Product 클래스를 추가해야 합니다.

public class MyDbContext : DbContext
{
    public DbSet<Product> Products { get; set; }
}

클래스는 MyDbContext 클래스에 대한 Product 액세스 및 변환을 정의하는 하나의 속성을 제공합니다. 애플리케이션은 Startup클래스의 ConfigureServices메서드(또는 Program.cs의 적절한 위치에서 builder.Services속성을 services 대신 사용)에서 다음 항목을 사용하여 이 클래스를 데이터베이스와의 상호 작용을 위해 구성합니다.

services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer("MY DATABASE CONNECTION STRING"));

위의 코드는 지정된 연결 문자열을 사용하여 SQL Server 데이터베이스에 연결합니다. 연결 문자열을 appsettings.json 파일, 환경 변수 또는 기타 구성 스토리지 위치에 배치하고 이 포함된 문자열을 적절하게 바꿀 수 있습니다.

그런 다음, 다음 명령을 사용하여 이 클래스에 적합한 데이터베이스 테이블을 생성할 수 있습니다.

dotnet ef migrations add 'Create Product table'
dotnet ef database update

첫 번째 명령은 데이터베이스 스키마에 대한 변경 내용을 새 EF 마이그레이션 Create Product table로 정의합니다. 마이그레이션은 새 데이터베이스 변경 내용을 적용하고 제거하는 방법을 정의합니다.

적용되면 데이터베이스에 간단한 Product 테이블이 있고 데이터베이스 스키마를 관리하는 데 도움이 되는 몇 가지 새 클래스가 프로젝트에 추가됩니다. 이러한 생성된 클래스는 기본적으로 Migrations라는 새 폴더에서 찾을 수 있습니다. 클래스를 Product 변경하거나 데이터베이스와 상호 작용하려는 관련 클래스를 더 추가할 때 마이그레이션의 새 이름으로 명령줄 명령을 다시 실행해야 합니다. 이 명령은 데이터베이스 스키마를 업데이트하는 다른 마이그레이션 클래스 집합을 생성합니다.

EF 데이터베이스 우선

기존 데이터베이스의 경우 .NET 명령줄 도구를 사용하여 EF Core에 대한 클래스를 생성할 수 있습니다. 클래스를 스캐폴드하려면 다음 명령의 변형을 사용합니다.

dotnet ef dbcontext scaffold "CONNECTION STRING" Microsoft.EntityFrameworkCore.SqlServer -c MyDbContext -t Product -t Customer

이전 명령은 지정된 연결 문자열 및 공급자를 사용하여 데이터베이스에 Microsoft.EntityFrameworkCore.SqlServer 연결합니다. 연결되면 명명 MyDbContext 된 데이터베이스 컨텍스트 클래스가 만들어집니다. 또한 Product 옵션으로 지정된 Customer-t 테이블에 대한 지원 클래스가 만들어집니다. 이 명령에는 데이터베이스에 적합한 클래스 계층 구조를 생성하는 많은 구성 옵션이 있습니다. 전체 참조는 명령의 설명서를 참조하세요.

EF Core에 대한 자세한 내용은 Microsoft Docs 사이트에서 확인할 수 있습니다.

웹 서비스와 상호 작용

ASP.NET 처음 릴리스되었을 때 SOAP 서비스는 웹 서버와 클라이언트가 데이터를 교환하는 데 선호되는 방식이었습니다. 그 이후로 많은 변화가 있었고 서비스와의 기본 상호 작용은 직접 HTTP 클라이언트 상호 작용으로 이동했습니다. ASP.NET Core 및 Blazor를 사용하여 HttpClient 또는 클래스의 Startup 메서드에서 ConfigureServices의 구성을 등록할 수 있습니다. HTTP 엔드포인트와 상호 작용해야 하는 경우 해당 구성을 사용합니다. 다음 구성 코드를 고려합니다.

// in Program.cs
builder.Services.AddHttpClient("github", client =>
{
    client.BaseAddress = new Uri("http://api.github.com/");
    // GitHub API versioning
    client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    // GitHub requires a user-agent
    client.DefaultRequestHeaders.Add("User-Agent", "BlazorWebForms-Sample");
});

GitHub에서 데이터에 액세스해야 할 때마다 이름이 github인 클라이언트를 만듭니다. 클라이언트가 기본 주소로 구성되고 요청 헤더가 적절하게 설정됩니다. IHttpClientFactory 지시문 또는 속성의 Blazor 특성을 사용하여 당신의 @inject 구성요소에 [Inject]을 삽입합니다. 다음 구문을 사용하여 명명된 클라이언트를 만들고 서비스와 상호 작용합니다.

@inject IHttpClientFactory factory

...

@code {
    protected override async Task OnInitializedAsync()
    {
        var client = factory.CreateClient("github");
        var response = await client.GetAsync("repos/dotnet/docs/issues");
        response.EnsureStatusCode();
        var content = await response.Content.ReadAsStringAsync();
    }
}

이 메서드는 dotnet/docs GitHub 리포지토리의 문제 컬렉션을 설명하는 문자열을 반환합니다. JSON 형식으로 콘텐츠를 반환하고 적절한 GitHub 문제 개체로 역직렬화됩니다. HttpClientFactory를 구성하여 미리 구성된 HttpClient 개체를 제공하는 여러 가지 방법이 있습니다. 작업하는 다양한 웹 서비스에 대해 서로 다른 이름 및 엔드포인트를 사용하여 여러 HttpClient 인스턴스를 구성해 보세요. 이 방법을 사용하면 각 페이지에서 이러한 서비스와의 상호 작용을 더 쉽게 수행할 수 있습니다. 자세한 내용은 IHttpClientFactory를 사용하여 HTTP 요청 만들기를 참조하세요.