연습: ASP.NET 응용 프로그램에서 도메인 서비스 사용

ASP.NET에서는 GridView 컨트롤과 같은 데이터 바인딩된 컨트롤에서 데이터베이스에 액세스하고 사용자가 CRUD(만들기, 읽기, 업데이트 및 삭제) 작업을 수행할 수 있도록 하는 데 사용할 수 있는 DomainSourceControl 컨트롤을 제공합니다.

특히 도메인 서비스를 사용하면 응용 프로그램을 특정 데이터베이스 모델에서 분리할 수 있습니다. 따라서 비즈니스 논리 및 다른 모델로 쉽게 이식할 수 있는 코드 작성에 집중할 수 있습니다.

WCF RIA Services 도메인 서비스는 서버에서 실행되는 응용 프로그램 논리의 작성 패턴을 제공하며 쿼리, 변경 및 사용자 지정 작업을 위한 데이터 액세스를 제어합니다. 이 서비스는 Silverlight 클라이언트와 ASP.NET 서버 응용 프로그램을 통합하여 유효성 검사, 인증 및 역할과 같은 일반 작업에 대한 종단간 지원도 제공합니다.

이 연습에서는 RIA Services 도메인 서비스를 사용하여 ASP.NET 웹 페이지에서 데이터베이스에 액세스하는 방법을 보여 줍니다. 이 연습에서는 ASP.NET의 도메인 서비스에 대해 설명하지만 서비스 사용은 ASP.NET 응용 프로그램으로 국한되지 않습니다. Silverlight 클라이언트 응용 프로그램과 ASP.NET 서버의 통합은 이 연습에서 다루지 않습니다.

이 연습은 다음과 같은 절차로 구성됩니다.

  • ASP.NET 웹 응용 프로그램 만들기

  • 도메인 서비스 사용

  • 도메인 서비스 테스트

필수 구성 요소

RIA Services 설명서에서 제공하는 이 연습 및 다른 연습을 실행하려면 WCF RIA Services 및 WCF RIA Services 도구 키트 외에도 Visual Studio 2010, Silverlight Developer 런타임 및 SDK 등의 몇 가지 필수 구성 요소 프로그램을 올바르게 설치하고 구성해야 합니다. 또한 SQL Server 2008 R2 Express with Advanced Services를 설치하고 구성해야 하며 AdventureWorks OLTP 및 LT 데이터베이스를 설치해야 합니다.

이러한 각 필수 구성 요소를 충족하기 위한 자세한 지침은 WCF RIA Services의 사전 요구 사항 노드의 항목에서 제공합니다. 이 RIA Services 연습을 수행할 때 발생할 수 있는 문제를 최소화하려면 이 연습을 진행하기 전에 여기서 제공하는 지침을 따르십시오.

ASP.NET 웹 응용 프로그램 만들기

도메인 서비스를 사용하려면 데이터베이스와 상호 작용할 수 있는 ASP.NET 웹 응용 프로그램을 만들어야 합니다. 수행해야 하는 단계는 다음과 같습니다.

  • 웹 응용 프로그램 만들기. 이 단계는 도메인 서비스 사용을 위한 환경을 제공합니다.

  • 응용 프로그램에 데이터베이스 추가. 이 단계에서는 웹 응용 프로그램에 사용할 데이터베이스를 선택할 수 있습니다.

  • 데이터베이스 모델 만들기. 데이터베이스 엔터티가 CLR 형식으로 포함된 모델을 만듭니다. 이 형식은 도메인 서비스가 데이터베이스와 상호 작용하는 데 사용됩니다. ADO.NET Entity Framework 또는 LINQ to SQL 데이터 모델을 사용할 수 있습니다.

다음 절차에서는 ASP.NET 웹 응용 프로그램을 만드는 방법을 보여 줍니다.

ASP.NET 웹 응용 프로그램을 만들려면

  1. Visual Studio 2010에서 파일 메뉴, 새로 만들기, 프로젝트를 차례로 클릭합니다.

    새 프로젝트 대화 상자가 표시됩니다.

  2. 설치된 템플릿에서 Visual C# 또는 Visual Basic을 확장한 다음 을 선택합니다.

  3. 템플릿 목록에서 ASP.NET 빈 웹 응용 프로그램을 선택합니다.

  4. 프로젝트의 이름을 UsingDomainService로 지정하고 위치를 지정한 다음 확인을 클릭합니다.

  5. 응용 프로그램을 빌드합니다.

다음 절차에서는 응용 프로그램에 데이터베이스를 추가하는 방법을 보여 줍니다. 이 데이터베이스에는 표시 및 편집을 위해 액세스할 테이블이 들어 있습니다.

웹 응용 프로그램에 데이터베이스를 추가하려면

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가, ASP.NET 폴더 추가, App_Data를 차례로 클릭합니다.

    App_Data 폴더가 프로젝트에 추가됩니다.

  2. App_Data 폴더를 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 기존 항목을 클릭합니다.

    기존 항목 추가 대화 상자가 표시됩니다.

  3. AdventureWorksLT 데이터베이스 파일(AdventureWorksLT_Data.mdf)의 위치를 지정합니다.

    다음 그림에서는 기존 항목 추가 대화 상자를 보여 줍니다.

    ASP.NET 도메인 서비스 클라이언트: 기존 항목 추가

  4. 추가를 클릭합니다.

    데이터베이스 파일의 복사본이 프로젝트에 만들어집니다. 자세한 내용은 How to: Connect to the AdventureWorksLT Database using an .MDF File을 참조하십시오.

다음 절차에서는 데이터베이스 테이블을 나타내는 클래스가 포함된 데이터 모델을 만드는 방법을 보여 줍니다. 이 연습에서는 ADO.NET Entity Framework 데이터 모델을 사용합니다. 하지만 LINQ to SQL 데이터 모델을 대신 사용할 수 있습니다.

데이터 모델을 만들려면

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 새 항목을 클릭합니다.

    새 항목 추가 대화 상자가 표시됩니다.

  2. 설치된 템플릿에서 데이터를 선택합니다.

  3. 템플릿 목록에서 ADO.NET 엔터티 데이터 모델을 선택합니다.

  4. 데이터베이스 모델의 이름을 AdventureWorksLT.edmx로 지정한 다음 추가를 클릭합니다.

    엔터티 데이터 모델 마법사가 표시됩니다.

  5. Model 콘텐츠 선택 화면에서 데이터베이스에서 생성을 선택합니다.

    다음 그림에서는 Model 콘텐츠 선택 대화 상자를 보여 줍니다.

    ASP.NET 도메인 서비스 클라이언트: Model 콘텐츠 선택

  6. 다음을 클릭합니다.

  7. 데이터 연결 선택 화면의 응용 프로그램이 데이터베이스에 연결하기 위해 사용해야 하는 데이터 연결 아래에 있는 드롭다운 목록에서 AdventureWorksLT_Data.mdf를 선택합니다.

  8. 다른 이름으로 Web.Config의 entity 연결 설정 저장 확인란이 선택되어 있는지 확인합니다. 기본 연결 문자열 이름을 그대로 둘 수 있습니다.

    다음 그림에서는 데이터 연결 선택 대화 상자를 보여 줍니다.

    ASP.NET 도메인 서비스 클라이언트: 데이터 연결 선택

  9. 다음을 클릭합니다.

    모델에 포함할 데이터베이스 개체를 지정할 수 있는 페이지가 표시됩니다.

  10. 데이터베이스 개체 선택 화면에서 테이블 노드를 선택하여 데이터베이스의 모든 테이블을 선택합니다.

    다음 그림에서는 데이터베이스 개체 선택 대화 상자를 보여 줍니다.

    ASP.NET 도메인 서비스 클라이언트: 데이터베이스 선택

  11. 모델에 외래 키 열 포함 확인란이 선택되어 있는지 확인합니다. 기본 모델 네임스페이스를 그대로 둘 수 있습니다.

  12. 마침을 클릭합니다.

    ADO.NET 엔터티 데이터 모델 디자이너가 표시됩니다. AdventureWorksLT 데이터베이스를 나타내는 데이터 모델을 만들었습니다.

  13. 디자이너를 닫습니다.

  14. 응용 프로그램을 빌드합니다.

    빌드를 완료하면 다음 절차에서 도메인 서비스에 AdventureWorksLT_DataEntities 컨텍스트 클래스를 사용할 수 있습니다.

도메인 서비스 사용

이 절차에서는 ASP.NET 응용 프로그램에서 도메인 서비스를 사용하기 위해 수행해야 하는 단계를 설명합니다. 이 단계에는 다음이 포함됩니다.

  • 프로젝트에 도메인 서비스 클래스 추가. 이 작업을 수행하면 응용 프로그램에서 CRUD 데이터베이스 작업을 수행할 수 있게 하는 클래스가 만들어져 비즈니스 논리를 포함할 수 있습니다. 이 클래스는 서버 또는 중간 계층에서 작동합니다.

  • 비즈니스 논리 만들기. 도메인 서비스 클래스에 코드(비즈니스 논리)를 포함합니다.

  • DomainDataSource 컨트롤 선언. 사용자가 데이터베이스와 상호 작용할 수 있도록 페이지 태그에서 이 작업을 수행합니다. 이 컨트롤은 클라이언트 또는 프레젠테이션 계층에서 작동합니다.

다음 절차에서는 프로젝트에 도메인 데이터 서비스를 추가하는 방법을 보여 줍니다.

프로젝트에 도메인 서비스 클래스를 추가하려면

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 새 항목을 클릭합니다.

  2. 설치된 템플릿에서 을 선택합니다.

  3. 템플릿 목록에서 도메인 서비스 클래스를 선택합니다.

  4. 파일의 이름을 AdventureWorksDomainService.cs 또는 AdventureWorksDomainService.vb로 지정한 다음 추가를 클릭합니다.

    새 도메인 서비스 클래스 추가 대화 상자가 표시됩니다. 지정한 이름이 도메인 서비스 클래스 이름: 상자에 표시됩니다.

  5. 클라이언트 액세스 사용 확인란을 선택합니다.

  6. 사용 가능한 DataContexts/ObjectContexts: 드롭다운 목록에서 **AdventureWorksLT_DataEntities (Entity Framework)**를 선택합니다. 드롭다운 목록이 비어 있으면 응용 프로그램을 빌드하지 않은 것입니다. 새 도메인 서비스 클래스 추가 대화 상자를 종료하고 응용 프로그램을 빌드한 다음 이전 단계를 반복합니다. 

  7. 엔터티 목록에서 Product 테이블을 선택합니다.

  8. Product 테이블에 대해 편집 사용 확인란을 선택합니다.

  9. 메타데이터에 대한 연결된 클래스 생성 확인란을 선택합니다.

    다음 그림에서는 새 도메인 서비스 클래스 추가 대화 상자를 보여 줍니다.

    ASP.NET 도메인 서비스 클라이언트: 새 도메인 서비스 추가

  10. 확인을 클릭합니다.

    AdventureWorksDomainService 클래스 및 관련 메타데이터 파일이 만들어집니다. 이 클래스에는 데이터베이스 CRUD 작업을 허용하는 메서드가 포함되어 있습니다. 비즈니스 논리를 포함하도록 클래스 및 메타데이터 파일을 수정할 수 있습니다. 다음 절차에서는 간단한 예를 보여 줍니다. 필수 어셈블리를 포함하도록 프로젝트 참조가 업데이트되었고 필요한 모든 구성 요소를 포함하도록 Web.config 파일이 업데이트되었음을 확인합니다.

  11. 파일 메뉴에서 모두 저장을 클릭합니다.

다음 절차에서는 비즈니스 논리를 포함하도록 AdventureWorksDomainService 클래스 및 관련 메타데이터 파일을 사용자 지정하는 방법을 보여 줍니다. 사용자 지정은 매우 간단하지만 이를 통해 어떠한 사항을 수정할 수 있는지 파악할 수 있습니다.

비즈니스 논리를 만들려면

  1. 솔루션 탐색기에서 AdventureWorksDomainService.cs 또는 AdventureWorksDomainService.vb 파일을 엽니다.

  2. 다음 코드와 같이 ListPrice 필드의 유효성 검사 논리를 포함하도록 UpdateProduct 메서드를 수정합니다. 현재 날짜를 사용하여 ModifiedDate 필드도 업데이트합니다.

    public void UpdateProduct(Product currentProduct)
    {
      if ((currentProduct.EntityState == EntityState.Detached))
      {
        // Custom logic: set a lower limit for the price.
        if (currentProduct.ListPrice < 5)
          throw new ValidationException("The list price must be >= 5.");
        this.ObjectContext.Products.AttachAsModified(currentProduct,
           this.ChangeSet.GetOriginal(currentProduct));
        // Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today;
      }
    }
    
    Public Sub UpdateProduct(ByVal currentProduct As Product)
      If (currentProduct.EntityState = EntityState.Detached) Then
        ' Custom logic: set a lower limit for the price.
        If currentProduct.ListPrice < 5 Then
          Throw New ValidationException("The list price must be >= 5.")
        End If
        Me.ObjectContext.Products.AttachAsModified(currentProduct, _
          Me.ChangeSet.GetOriginal(currentProduct))
        ' Custom logic: set the date to the current value.
        currentProduct.ModifiedDate = DateTime.Today
      End If
    End Sub
    

    유효성 검사가 실패하면 예외가 발생하며 사용자에게 표시될 페이지에 오류 메시지가 전송됩니다.

  3. 다음 코드와 같이 GetProducts 메서드를 수정하여 Entity Framework에 대한 정렬 논리가 올바르게 작동하도록 설정합니다.

    public IQueryable<Product> GetProducts()
    {
      return this.ObjectContext.Products.OrderBy(p => p.ProductID);
    } 
    
    Public Function GetProducts() As IQueryable(Of Product)
      Return Me.ObjectContext.Products.OrderBy(Function(p) p.ProductID)
    End Function
    
  4. 파일을 저장한 후 닫습니다.

  5. 솔루션 탐색기에서 AdventureWorksDomainService.metadata.cs 또는 AdventureWorksDomainService.metadata.vb 파일을 엽니다.

  6. 다음 코드와 같이 Color 데이터 필드 엔터티에 Required 특성을 추가합니다.

    이 특성을 사용하여 데이터베이스에서 허용된 대로 데이터 필드가 비어 있지 않도록 강제 지정합니다. 사용자가 빈 문자열을 입력하면 오류가 발생합니다.

    [Required(AllowEmptyStrings=false, 
      ErrorMessage="Color is required")]
    public string Color{ get; set; }
    
    <Required(AllowEmptyStrings:=False, ErrorMessage:="Color is required")> _
    Public Property Color As String
    
  7. 메타데이터 파일을 저장한 후 닫습니다.

  8. 응용 프로그램을 빌드합니다.

다음 절차에서는 사용자가 데이터베이스와 상호 작용할 수 있도록 페이지 태그에서 DomainDataSource 컨트롤을 선언하는 방법을 보여 줍니다.

페이지에서 DomainDataSource 컨트롤을 선언하려면

  1. 솔루션 탐색기에서 프로젝트 이름을 마우스 오른쪽 단추로 클릭하고 추가를 클릭한 다음 새 항목을 클릭합니다.

  2. 설치된 템플릿에서 을 클릭합니다.

  3. 템플릿 목록에서 Web Form을 선택합니다.

  4. 파일 이름을 Default.aspx로 지정하고 추가를 클릭합니다.

  5. 디자인 뷰에서 Default.aspx를 엽니다.

  6. 도구 상자일반 또는 데이터 그룹에서 페이지에 DomainDataSource 컨트롤을 추가합니다.

    DomainDataSource 작업 메뉴가 열린 상태로 DomainDataSource가 나타납니다.

    컨트롤이 표시되지 않으면 도구 메뉴를 클릭한 다음 도구 상자 항목 선택을 클릭합니다. 도구 상자 항목 선택 대화 상자에서 .NET Framework 구성 요소 탭을 클릭하고 DomainDataSource 확인란을 선택한 다음 확인을 클릭합니다.

  7. DomainDataSource 작업 메뉴에서 데이터 원본 구성을 클릭합니다.

    데이터 원본 구성 마법사가 표시됩니다.

  8. 도메인 서비스 선택 화면의 도메인 서비스 형식: 목록에서 UsingDomainService.AdventureWorksDomainService를 만든 클래스를 선택합니다.

    다음 그림에서는 도메인 서비스 선택 화면을 보여 줍니다.

    ASP.NET 도메인 서비스 클라이언트: 도메인 서비스 선택

  9. 다음을 클릭합니다.

  10. 데이터 액세스 구성 화면에서 IQueryable<Product> GetProducts() 메서드를 선택합니다.

  11. 삽입 허용, 업데이트 허용삭제 허용 확인란을 선택합니다.

    다음 그림에서는 데이터 액세스 구성 화면을 보여 줍니다.

    ASP.NET 도메인 서비스 클라이언트: 도메인 액세스 선택

  12. 마침을 클릭합니다.

  13. 도구 상자의 데이터 탭에서 페이지에 GridView 컨트롤을 추가합니다.

    GridView 작업 메뉴가 열린 상태로 GridView가 나타납니다.

  14. GridView 작업 메뉴의 데이터 원본 선택 목록에서 DomainDataSource1을 선택합니다.

    이 값은 이전 단계에서 만든 DomainDataSource 컨트롤의 ID입니다.

  15. GridView 작업 메뉴에서 열 편집을 클릭합니다.

    필드 대화 상자가 표시됩니다.

  16. 필드 자동 생성 확인란의 선택을 취소합니다.

  17. 선택한 필드: 창에서 Name, Color, ListPriceModifiedDate를 제외한 모든 필드를 삭제합니다.

  18. 확인을 클릭합니다.

  19. 선택적으로 GridView 작업 메뉴에서 관련 확인란을 선택하여 페이징, 정렬 및 선택을 활성화합니다.

  20. 파일을 저장하고 소스 뷰로 전환합니다.

  21. GridView를 선택합니다.

  22. 속성 창에서 DataKeyNames 속성을 표시되지 않는 모든 열의 쉼표로 구분된 목록(ProductID, ProductNumber, StandardCost,Size, Weight, ProductCategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, ThumbNailPhotoFileName, rowguid)으로 설정합니다.

    이렇게 설정해야 DomainDataSource 컨트롤에서 CRUD 작업을 수행할 수 있습니다.

  23. AutoGenerateEditButton 속성을 True로 설정하여 테이블 열의 편집과 삭제를 활성화합니다.

  24. 소스 뷰에서 Columns 요소를 다음 태그로 바꿉니다.

    이 태그는 사용자 지정 템플릿을 사용함으로써 다시 게시할 때 ColorListPrice 데이터 필드 값을 서버로 전송하기 전에 유효성 검사를 수행합니다. 또한 행 삭제를 수행하기 전에 사용자 권한을 묻는 삭제 LinkButton 컨트롤을 만듭니다.

      <Columns>
        <asp:TemplateField>
          <ItemTemplate>
            <asp:LinkButton ID="LinkButton1"  CommandName="Delete" Text="Delete"
              ForeColor="#333333"  OnClientClick='return confirm("Are you sure you want to delete this row?");'/>
          </ItemTemplate>
        </asp:TemplateField>
    
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />
        <asp:TemplateField>
          <HeaderTemplate>Color</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("Color") %>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ColorID"  Text='<%# Bind("Color") %>'/>
            <cc1:DomainValidator ID="DomainValidator2"   DataField="Color"/>
          </EditItemTemplate>
        </asp:TemplateField>
    
        <asp:TemplateField>
          <HeaderTemplate>ListPrice</HeaderTemplate>
          <ItemTemplate>
            <%# Eval("ListPrice")%>
          </ItemTemplate>
          <EditItemTemplate>
            <asp:TextBox ID="ListPriceID"  Text='<%# Bind("ListPrice") %>'/>
            <cc1:DomainValidator ID="DomainValidator3"  DataField="ListPrice"/>
           </EditItemTemplate>
         </asp:TemplateField>
    
         <asp:BoundField DataField="ModifiedDate" HeaderText="ModifiedDate" SortExpression="ModifiedDate" />
      </Columns>
    
  25. 유효성 검사 오류를 표시할 수 있도록 GridView 컨트롤 앞에 다음 태그를 추가합니다.

    <asp:ValidationSummary ID="ValidationSummary1"  />
    <cc1:DomainValidator  ControlToValidate="GridView1"/>
    
  26. Default.aspx 파일을 저장합니다.

  27. 응용 프로그램을 빌드합니다.

도메인 서비스 테스트

이 절차에서는 GridView 컨트롤을 사용하여 도메인 서비스 기능을 테스트하는 방법을 보여 줍니다. 이 절차에서는 다음을 확인합니다.

  • 사용자 지정 비즈니스 논리를 통해 데이터베이스와의 상호 작용이 예상대로 작동하는지 여부

  • ASP.NET에서 사용자의 데이터베이스 필드 변경 내용이 수행되는지 여부

  • ASP.NET에서 사용자 지정 논리에 따라 생성된 오류 메시지가 표시되는지 여부

도메인 서비스 테스트

  1. 솔루션 탐색기에서 Default.aspx 페이지를 마우스 오른쪽 단추로 클릭하고 브라우저에서 보기를 선택합니다.

    Product 테이블이 표시된 페이지가 브라우저에 나타납니다.

  2. 아무 행에서나 편집을 클릭하고 5보다 작은 값을 입력하여 ListPrice 열 값을 수정합니다.

  3. 같은 행에서 업데이트를 클릭합니다.

    필드가 5보다 크거나 같아야 한다는 내용의 사용자 지정 오류가 표시됩니다.

  4. 같은 행에서 ListPrice 열에 대해 5보다 큰 값을 입력합니다.

  5. 같은 행에서 업데이트를 클릭합니다.

    ASP.NET에서 데이터베이스의 ListPrice 및 ModifiedDate 데이터 필드가 업데이트됩니다.

  6. 아무 행에서나 편집을 클릭하고 빈 문자열을 입력하여 Color 열 값을 수정합니다.

  7. 같은 행에서 업데이트를 클릭합니다.

    ASP.NET에서 사용자 지정 유효성 검사 오류가 표시됩니다.

  8. 같은 행에서 Color 열에 대해 빈 문자열이 아닌 값을 입력합니다.

  9. 같은 행에서 업데이트를 클릭합니다.

    ASP.NET에서 데이터베이스의 Color 및 ModifiedDate 데이터 필드가 업데이트됩니다.

참고 항목

작업

방법: 도메인 서비스 비즈니스 논리 추가

개념

RIA Services 솔루션 만들기