연습: N 계층 데이터 응용 프로그램 만들기
N 계층 데이터 응용 프로그램은 데이터에 액세스하는 응용 프로그램으로, 여러 개의 논리적 계층으로 분리되어 있습니다.응용 프로그램 구성 요소를 개별 계층으로 분리하면 응용 프로그램의 유지 관리 편의성과 확장성이 향상됩니다.이를 위해 전체 솔루션을 다시 디자인하지 않고도 단일 계층에 적용할 수 있는 새 기술을 보다 쉽게 도입할 수 있게 합니다.N 계층 아키텍처에는 프레젠테이션 계층, 중간 계층 및 데이터 계층이 포함됩니다.중간 계층에는 일반적으로 데이터 액세스 계층, 비즈니스 논리 계층, 인증 및 유효성 검사 같은 공유 구성 요소가 포함됩니다.데이터 계층에는 관계형 데이터베이스가 포함됩니다.일반적으로 N 계층 응용 프로그램에서는 프레젠테이션 계층에 액세스하는 최종 사용자로부터 격리하여 유지 관리되는 중간 계층의 데이터 액세스 계층에 중요한 정보를 저장합니다.자세한 내용은 N 계층 데이터 응용 프로그램 개요을 참조하십시오.
N 계층 응용 프로그램에서 여러 계층을 분리하는 방법 중 하나는 응용 프로그램에 포함할 각 계층에 대해 별도의 프로젝트를 만드는 것입니다.형식화된 데이터 집합에는 생성된 데이터 집합 및 TableAdapter 코드를 어떤 프로젝트에 추가할지 결정하는 DataSet Project 속성이 포함됩니다.
이 연습에서는 데이터 집합 디자이너를 사용하여 데이터 집합과 TableAdapter 코드를 개별 클래스 라이브러리 프로젝트로 분리하는 방법을 보여 줍니다.데이터 집합과 TableAdapter 코드를 분리하고 나면 데이터 액세스 계층을 호출하기 위한 Windows Communication Foundation 서비스 및 Visual Studio의 WCF.NET 데이터 서비스 서비스를 만듭니다.마지막으로, Windows Forms 응용 프로그램을 프레젠테이션 계층으로 만듭니다.이 계층에서 데이터 서비스를 통해 데이터에 액세스합니다.
이 연습을 진행하면서 수행할 단계는 다음과 같습니다.
여러 프로젝트를 포함할 새로운 N 계층 솔루션을 만듭니다.
N 계층 솔루션에 두 개의 클래스 라이브러리 프로젝트를 추가합니다.
데이터 소스 구성 마법사를 사용하여 형식화된 데이터 집합을 만듭니다.
생성된 TableAdapter 및 데이터 집합 코드를 개별 프로젝트로 분리합니다.
데이터 액세스 계층을 호출할 WCF(Windows Communication Foundation) 서비스를 만듭니다.
서비스에서 데이터 액세스 계층을 통해 데이터를 검색하기 위한 함수를 만듭니다.
프레젠테이션 계층으로 사용할 Windows Forms 응용 프로그램을 만듭니다.
데이터 소스에 바인딩되는 Windows Forms 컨트롤을 만듭니다.
데이터 테이블을 채우기 위한 코드를 작성합니다.
이 항목의 비디오 버전을 보려면 Video How to: Creating an N-Tier Data Application을 참조하십시오.
사전 요구 사항
이 연습을 완료하려면 다음이 필요합니다.
- Northwind 샘플 데이터베이스에 대한 액세스.자세한 내용은 방법: 샘플 데이터베이스 설치을 참조하십시오.
N 계층 솔루션 및 데이터 집합을 저장할 클래스 라이브러리(DataEntityTier) 만들기
이 연습의 첫 번째 단계에서는 솔루션과 두 개의 클래스 라이브러리 프로젝트를 만듭니다.첫 번째 클래스 라이브러리에는 데이터 집합(응용 프로그램의 데이터를 저장할 생성된 형식화된 DataSet 클래스 및 DataTable)을 저장합니다.이 프로젝트는 응용 프로그램의 데이터 엔터티 계층으로 사용되며 일반적으로 중간 계층에 배치됩니다.형식화된 데이터 집합 만들기 및 편집를 사용하여 초기 데이터 집합을 만들고 코드를 두 개의 클래스 라이브러리로 자동 분리합니다.
[!참고]
프로젝트와 솔루션의 이름을 올바르게 지정했는지 확인한 다음 확인을 클릭합니다.이렇게 하면 연습을 보다 쉽게 진행할 수 있습니다.
N 계층 솔루션 및 DataEntityTier 클래스 라이브러리를 만들려면
파일 메뉴에서 새 프로젝트를 만듭니다.
[!참고]
데이터 집합 디자이너는 Visual Basic 및 C# 프로젝트에서 지원됩니다.이 언어 중 하나로 새 프로젝트를 만듭니다.
새 프로젝트 대화 상자의 프로젝트 형식 창에서 Windows를 클릭합니다.
클래스 라이브러리 템플릿을 클릭합니다.
프로젝트의 이름을 DataEntityTier로 지정합니다.
솔루션의 이름을 NTierWalkthrough로 지정합니다.
확인을 클릭합니다.
DataEntityTier 프로젝트가 포함된 NTierWalkthrough 솔루션이 만들어지고 이 솔루션이 솔루션 탐색기에 추가됩니다.
TableAdapter를 저장할 클래스 라이브러리(DataAccessTier) 만들기
DataEntityTier 프로젝트를 만들었으면 다음 단계에서는 다른 클래스 라이브러리 프로젝트를 만듭니다.이 프로젝트에는 생성된 TableAdapter가 저장됩니다. 이 프로젝트를 응용 프로그램의 데이터 액세스 계층이라고 합니다.데이터 액세스 계층에는 데이터베이스에 연결하는 데 필요한 정보가 포함되며 이 계층은 일반적으로 중간 계층에 배치됩니다.
TableAdapter의 새 클래스 라이브러리를 만들려면
파일 메뉴에서 NTierWalkthrough 솔루션에 새 프로젝트를 추가합니다.
새 프로젝트 대화 상자의 템플릿 창에서 클래스 라이브러리를 클릭합니다.
프로젝트의 이름을 DataAccessTier로 지정하고 확인을 클릭합니다.
DataAccessTier 프로젝트가 만들어지고 NTierWalkthrough 솔루션에 추가됩니다.
데이터 집합 만들기
다음 단계에서는 형식화된 데이터 집합을 만듭니다.형식화된 데이터 집합은 데이터 집합 클래스(DataTable 클래스 포함)와 단일 프로젝트의 TableAdapter 클래스를 모두 사용하여 만들어집니다.모든 클래스는 파일 한 개로 생성됩니다. 데이터 집합과 TableAdapter를 각기 다른 프로젝트로 분리하면 데이터 집합 클래스가 다른 프로젝트로 이동하고 TableAdapter 클래스는 원래 프로젝트에 남습니다.따라서 궁극적으로 TableAdapter를 포함할 프로젝트(DataAccessTier 프로젝트)에 데이터 집합을 만들어야 합니다.데이터 소스 구성 마법사를 사용하여 데이터 집합을 만듭니다.
[!참고]
연결을 만들려면 Northwind 샘플 데이터베이스에 액세스할 수 있는 권한이 있어야 합니다.Northwind 샘플 데이터베이스를 설치하는 방법에 대한 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.
데이터 집합을 만들려면
솔루션 탐색기에서 DataAccessTier를 클릭합니다.
데이터 메뉴에서 데이터 소스 표시를 클릭합니다.
데이터 소스 창에서 새 데이터 소스 추가를 클릭하여 데이터 소스 구성 마법사를 시작합니다.
데이터 소스 형식 선택 페이지에서 데이터베이스를 클릭하고 다음을 클릭합니다.
데이터 연결 선택 페이지에서 다음 작업 중 하나를 수행합니다.
Northwind 샘플 데이터베이스에 대한 데이터 연결이 드롭다운 목록에 표시되면 해당 연결을 클릭합니다.
또는
새 연결을 클릭하여 연결 추가 대화 상자를 엽니다.자세한 내용은 연결 추가/수정 대화 상자(일반)을 참조하십시오.
데이터베이스에 암호가 필요하면 중요한 데이터를 포함하는 옵션을 선택하고 다음을 클릭합니다.
[!참고]
SQL Server에 연결하는 대신 로컬 데이터베이스 파일을 선택하면 파일을 프로젝트에 추가할지 묻는 메시지가 나타납니다.예를 클릭하여 데이터베이스 파일을 프로젝트에 추가합니다.
응용 프로그램 구성 파일에 연결 문자열 저장 페이지에서 다음을 클릭합니다.
데이터베이스 개체 선택 페이지에서 테이블 노드를 확장합니다.
Customers 및 Orders 테이블의 확인란을 클릭한 다음 마침을 클릭합니다.
NorthwindDataSet가 DataAccessTier 프로젝트에 추가되고 데이터 소스 창에 나타납니다.
데이터 집합에서 TableAdapter 분리
데이터 집합을 만들었으면 생성된 데이터 집합 클래스를 TableAdapter에서 분리합니다.이를 위해서는 분리된 데이터 집합 클래스를 저장할 프로젝트의 이름으로 데이터 집합 프로젝트 속성을 설정합니다.
데이터 집합에서 TableAdapter를 분리하려면
솔루션 탐색기에서 NorthwindDataSet.xsd를 두 번 클릭하여 데이터 집합 디자이너에 데이터 집합을 엽니다.
디자이너의 빈 곳을 클릭합니다.
속성 창에서 데이터 집합 프로젝트 노드를 찾습니다.
데이터 집합 프로젝트 목록에서 DataEntityTier를 클릭합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
데이터 집합과 TableAdapter가 두 개의 클래스 라이브러리 프로젝트로 분리됩니다.전체 데이터 집합을 포함하고 있던 프로젝트(DataAccessTier)에 이제는 TableAdapter만 포함됩니다.데이터 집합 프로젝트 속성에서 지정한 프로젝트(DataEntityTier)에는 형식화된 데이터 집합 NorthwindDataSet.Dataset.Designer.vb(또는 NorthwindDataSet.Dataset.Designer.cs)가 포함됩니다.
[!참고]
데이터 집합 프로젝트 속성을 설정하여 데이터 집합과 TableAdapter를 분리할 때 프로젝트의 기존 partial 데이터 집합 클래스는 자동으로 이동하지 않습니다.기존의 데이터 집합 partial 클래스는 데이터 집합 프로젝트에 수동으로 옮겨야 합니다.
새 서비스 응용 프로그램 만들기
이 연습은 WCF 서비스를 사용하여 데이터 액세스 계층에 액세스하는 방법을 보여 주는 것이 목적이므로 새 WCF 서비스 응용 프로그램을 만듭니다.
새 WCF 서비스 응용 프로그램을 만들려면
파일 메뉴에서 NTierWalkthrough 솔루션에 새 프로젝트를 추가합니다.
새 프로젝트 대화 상자의 프로젝트 형식 창에서 WCF를 클릭합니다.템플릿 창에서 WCF 서비스 라이브러리를 클릭합니다.
프로젝트 이름을 DataService로 지정하고 확인을 클릭합니다.
DataService 프로젝트가 만들어지고 NTierWalkthrough 솔루션에 추가됩니다.
데이터 액세스 계층에서 Customers 및 Orders 데이터를 반환하는 메서드 만들기
데이터 서비스를 통해 데이터 액세스 계층에서 GetCustomers 및 GetOrders라는 메서드 두 개를 호출해야 합니다.이들 메서드는 Northwind Customers 및 Orders 테이블을 반환합니다.DataAccessTier 프로젝트에 GetCustomers 및 GetOrders 메서드를 만듭니다.
데이터 액세스 계층에서 Customers 테이블을 반환하는 메서드를 만들려면
솔루션 탐색기에서 NorthwindDataset.xsd를 두 번 클릭하여 형식화된 데이터 집합 만들기 및 편집에서 데이터 집합을 엽니다.
CustomersTableAdapter를 마우스 오른쪽 단추로 클릭하고 쿼리 추가를 클릭하여 TableAdapter 쿼리 구성 마법사를 엽니다.
명령 유형을 선택하십시오. 페이지에서 기본값인 SQL 문 사용을 그대로 둔 채 다음을 클릭합니다.
쿼리 형식 선택 페이지에서 기본값인 행을 반환하는 SELECT를 그대로 둔 채 다음을 클릭합니다.
SQL SELECT 문을 지정하십시오. 페이지에서 기본 쿼리를 그대로 둔 채 다음을 클릭합니다.
생성할 메서드 선택 페이지의 DataTable 반환 섹션에서 메서드 이름으로 GetCustomers를 입력합니다.
마침을 클릭합니다.
데이터 액세스 계층에서 Orders 테이블을 반환하는 메서드를 만들려면
OrdersTableAdapter를 마우스 오른쪽 단추로 클릭하고 쿼리 추가를 클릭합니다.
명령 유형을 선택하십시오. 페이지에서 기본값인 SQL 문 사용을 그대로 둔 채 다음을 클릭합니다.
쿼리 형식 선택 페이지에서 기본값인 행을 반환하는 SELECT를 그대로 둔 채 다음을 클릭합니다.
SQL SELECT 문을 지정하십시오. 페이지에서 기본 쿼리를 그대로 둔 채 다음을 클릭합니다.
생성할 메서드 선택 페이지의 DataTable 반환 섹션에서 메서드 이름으로 GetOrders를 입력합니다.
마침을 클릭합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
데이터 서비스에 데이터 엔터티 및 데이터 액세스 계층에 대한 참조 추가
데이터 서비스에는 데이터 집합 및 TableAdapter의 정보가 필요하므로 DataEntityTier 및 DataAccessTier 프로젝트에 대한 참조를 추가합니다.
데이터 서비스에 참조를 추가하려면
솔루션 탐색기에서 DataService를 마우스 오른쪽 단추로 클릭하고 참조 추가를 클릭합니다.
참조 추가 대화 상자에서 프로젝트 탭을 클릭합니다.
DataAccessTier 및 DataEntityTier 프로젝트를 모두 선택합니다.
확인을 클릭합니다.
데이터 액세스 계층에서 GetCustomers 및 GetOrders 메서드를 호출하는 함수를 서비스에 추가
데이터를 반환하는 메서드가 데이터 액세스 계층에 포함되었으므로 이번에는 데이터 액세스 계층의 메서드를 호출하는 메서드를 데이터 서비스에 만듭니다.
[!참고]
C# 프로젝트의 경우 다음 코드를 컴파일하려면 System.Data.DataSetExtensions 어셈블리에 대한 참조를 추가해야 합니다.
데이터 서비스에서 GetCustomers 및 GetOrders 함수를 만들려면
DataService 프로젝트에서 IService1.vb 또는 IService1.cs를 두 번 클릭합니다.
**여기에 서비스 작업을 추가합니다.**라는 주석 아래 다음 코드를 추가합니다.
<OperationContract()> _ Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable <OperationContract()> _ Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable
[OperationContract] DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers(); [OperationContract] DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
DataService 프로젝트에서 Service1.vb 또는 Service1.cs를 두 번 클릭합니다.
Service1 클래스에 다음 코드를 추가합니다.
Public Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable Implements IService1.GetCustomers Dim CustomersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter Return CustomersTableAdapter1.GetCustomers() End Function Public Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable Implements IService1.GetOrders Dim OrdersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter Return OrdersTableAdapter1.GetOrders() End Function
public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers() { DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter CustomersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter(); return CustomersTableAdapter1.GetCustomers(); } public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders() { DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter OrdersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter(); return OrdersTableAdapter1.GetOrders(); }
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
데이터 서비스의 데이터를 표시할 프레젠테이션 계층 만들기
데이터 액세스 계층을 호출하는 메서드가 포함된 데이터 서비스를 솔루션에 추가했으므로 이번에는 데이터 서비스를 호출하고 사용자에게 데이터를 표시하는 또 다른 프로젝트를 만듭니다.이 연습에서는 Windows Forms 응용 프로그램을 만듭니다. 이는 N 계층 응용 프로그램의 프레젠테이션 계층입니다.
프레젠테이션 계층 프로젝트를 만들려면
파일 메뉴에서 NTierWalkthrough 솔루션에 새 프로젝트를 추가합니다.
새 프로젝트 대화 상자의 프로젝트 형식 창에서 Windows를 클릭합니다.템플릿 창에서 Windows Forms 응용 프로그램을 클릭합니다.
프로젝트의 이름을 PresentationTier로 지정하고 확인을 클릭합니다.
PresentationTier 프로젝트가 만들어지고 NTierWalkthrough 솔루션에 추가됩니다.
PresentationTier 프로젝트를 시작 프로젝트로 설정
프레젠테이션 계층은 데이터를 표시하고 상호 작용하는 데 사용되는 실제 클라이언트 응용 프로그램이므로 PresentationTier 프로젝트를 시작 프로젝트로 설정해야 합니다.
새 프레젠테이션 계층 프로젝트를 시작 프로젝트로 설정하려면
- 솔루션 탐색기에서 PresentationTier를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 클릭합니다.
프레젠테이션 계층에 참조 추가
서비스의 메서드에 액세스하려면 클라이언트 응용 프로그램 PresentationTier에 데이터 서비스에 대한 서비스 참조가 있어야 합니다.또한 WCF 서비스에서 형식을 공유하려면 데이터 집합에 대한 참조가 필요합니다.데이터 서비스를 통해 형식을 공유할 수 있도록 하기 전까지는 partial 데이터 집합 클래스에 추가한 코드를 프레젠테이션 계층에서 사용할 수 없습니다.데이터 테이블의 행 및 열 변경 이벤트에 유효성 검사 등의 코드를 추가하는 경우가 일반적이므로 클라이언트에서 이 코드에 액세스해야 하는 경우가 많습니다.
프레젠테이션 계층에 참조를 추가하려면
솔루션 탐색기에서 PresentationTier를 마우스 오른쪽 단추로 클릭하고 참조 추가를 클릭합니다.
참조 추가 대화 상자에서 프로젝트 탭을 클릭합니다.
DataEntityTier를 선택하고 확인을 클릭합니다.
프레젠테이션 계층에 서비스 참조를 추가하려면
솔루션 탐색기에서 PresentationTier를 마우스 오른쪽 단추로 클릭하고 서비스 참조 추가를 클릭합니다.
서비스 참조 추가 대화 상자에서 검색을 클릭합니다.
Service1을 선택하고 확인을 클릭합니다.
[!참고]
현재 컴퓨터에 여러 개의 서비스가 있으면 이 연습의 앞부분에서 만든 서비스(GetCustomers 및 GetOrders 메서드가 포함된 서비스)를 선택합니다.
데이터 서비스를 통해 반환되는 데이터를 표시하는 DataGridView를 폼에 추가
데이터 서비스에 대한 서비스 참조를 추가하면 서비스를 통해 반환되는 데이터가 데이터 소스 창에 자동으로 채워집니다.
두 개의 데이터 바인딩된 DataGridView를 폼에 추가하려면
솔루션 탐색기에서 PresentationTier 프로젝트를 선택합니다.
데이터 소스 창에서 NorthwindDataSet를 확장하고 Customers 노드를 찾습니다.
Customers 노드를 Form1로 끌어 옵니다.
데이터 소스 창에서 Customers 노드를 확장하고 관련 Orders 노드(Customers 노드에 중첩된 Orders 노드)를 찾습니다.
관련 Orders 노드를 Form1로 끌어 옵니다.
폼의 빈 곳을 두 번 클릭하여 Form1_Load 이벤트 처리기를 만듭니다.
Form1_Load 이벤트 처리기에 다음 코드를 추가합니다.
Dim DataSvc As New ServiceReference1.Service1Client NorthwindDataSet.Customers.Merge(DataSvc.GetCustomers) NorthwindDataSet.Orders.Merge(DataSvc.GetOrders)
ServiceReference1.Service1Client DataSvc = new ServiceReference1.Service1Client(); northwindDataSet.Customers.Merge(DataSvc.GetCustomers()); northwindDataSet.Orders.Merge(DataSvc.GetOrders());
서비스에 허용되는 최대 메시지 크기 늘리기
이 서비스는 Customers 및 Orders 테이블의 데이터를 반환하므로 maxReceivedMessageSize의 기본값은 데이터를 보관하기에 부족하며 이 크기를 늘려야 합니다.이 연습에서는 이 값을 6553600으로 변경합니다.클라이언트에서 값을 변경하면 서비스 참조가 자동으로 업데이트됩니다.
[!참고]
기본 크기는 DoS(서비스 거부) 공격에 노출될 위험을 줄이기 위해 낮게 설정되어 있습니다.자세한 내용은 MaxReceivedMessageSize을 참조하십시오.
maxReceivedMessageSize 값을 늘리려면
솔루션 탐색기에서 PresentationTier 프로젝트의 app.config 파일을 두 번 클릭합니다.
maxReceivedMessage 크기 특성을 찾아 그 값을 6553600으로 변경합니다.
응용 프로그램 테스트
응용 프로그램을 실행합니다.데이터 서비스에서 검색한 데이터가 폼에 표시됩니다.
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
데이터 서비스를 통해 Customers 및 Orders 테이블에서 검색한 데이터가 폼에 표시됩니다.
다음 단계
응용 프로그램 요구 사항에 따라 Windows 기반 응용 프로그램에서 관련 데이터를 저장한 후 몇 단계를 더 수행해야 할 수도 있습니다.예를 들어 다음과 같이 응용 프로그램을 보완할 수 있습니다.
데이터 집합에 유효성 검사를 추가합니다.자세한 내용은 연습: N 계층 데이터 응용 프로그램에 유효성 검사 추가를 참조하십시오.
데이터를 데이터베이스에 다시 업데이트하기 위한 메서드를 서비스에 추가합니다.
참고 항목
개념
Visual Studio 2012 데이터 응용 프로그램 개발의 새로운 기능