연습: N 계층 응용 프로그램에 로컬 데이터베이스 캐시 추가
업데이트: 2007년 11월
Visual Studio 컨텍스트에서 로컬 데이터베이스 캐시는 Microsoft Synchronization Services for ADO.NET을 사용하여 원격 데이터베이스와 데이터를 동기화하도록 구성된 SQL Server Compact 3.5 데이터베이스입니다. 이 연습에서는 연습: N 계층 데이터 응용 프로그램 만들기 항목에서 만든 응용 프로그램에 SQL Server Compact 3.5 데이터베이스를 추가하는 단계별 지침을 제공합니다.
이 연습을 통해 다음 작업을 수행하는 방법을 배웁니다.
프로젝트에 로컬 데이터베이스 캐시 항목을 추가합니다.
데이터 동기화를 구성합니다.
기존 데이터 서비스에 동기화 작업을 통합합니다.
로컬 데이터베이스 캐시에서 Customers 테이블을 검색하도록 데이터를 로드하는 코드를 수정합니다.
동기화 프로세스를 초기화할 코드를 추가합니다.
사전 요구 사항
이 연습을 완료하려면 다음이 필요합니다.
연습: N 계층 데이터 응용 프로그램 만들기에서 만든 솔루션 및 관련 프로젝트
Northwind 샘플 데이터베이스에 대한 액세스. 자세한 내용은 방법: 샘플 데이터베이스 설치를 참조하십시오.
참고: |
---|
다음 지침처럼 컴퓨터에서 Visual Studio 사용자 인터페이스 요소 일부에 대한 이름이나 위치를 다르게 표시할 수 있습니다. 이러한 요소는 사용하는 Visual Studio 버전 및 설정에 따라 결정됩니다. 자세한 내용은 Visual Studio 설정을 참조하십시오. |
NtierWalkthrough 솔루션 열기
NtierWalkthrough 솔루션을 열려면
파일 메뉴에서 열기를 가리킨 후 프로젝트/솔루션을 클릭한 다음 NTierWalkthrough.sln 파일이 있는 위치로 이동합니다.
참고: 연습: N 계층 데이터 응용 프로그램 만들기 항목에서 만드는 NTierWalkthrough.sln 파일은 이 연습을 완료하는 데 반드시 필요한 파일입니다. 연습: N 계층 데이터 응용 프로그램 만들기 항목을 아직 수행하지 않은 경우 해당 항목을 완료합니다. 완료되면 모든 프로젝트를 저장합니다.
NTierWalkthrough에 로컬 데이터베이스 캐싱 추가
로컬 데이터베이스 캐시는 클라이언트에 있는 SQL Server Compact 3.5 데이터베이스이기 때문에 PresentationTier 프로젝트에 로컬 데이터베이스 캐시를 추가해야 합니다. 이 연습에서는 Customers 테이블을 캐시하는 방법을 보여 주므로 로컬 데이터베이스 캐시의 이름을 CustomersCache로 지정합니다.
참고: |
---|
이 연습에서는 로컬 데이터베이스 캐시에서 Customers 테이블만 사용하기 때문에 CustomersCache라는 이름을 지정했지만 로컬 데이터베이스 캐시에는 테이블을 여러 개 추가할 수 있습니다. |
프레젠테이션 계층에 로컬 데이터 캐싱을 추가하려면
솔루션 탐색기에서 PresentationTier를 마우스 오른쪽 단추로 클릭하고 새 항목 추가를 클릭합니다.
로컬 데이터베이스 캐시 템플릿을 클릭합니다.
이름에 CustomersCache를 입력합니다.
추가를 클릭합니다.
데이터 동기화 구성 대화 상자가 열립니다.
데이터 동기화 구성
데이터 동기화를 구성하려면 서버에 대한 데이터 연결을 선택하고 응용 프로그램에 로컬로 캐시할 테이블을 선택합니다. 이 연습에서는 Northwind 데이터베이스의 SQL Server 버전에 연결하도록 서버 연결을 설정하고 로컬 캐시에 Customers 테이블을 추가합니다. 또한 n 계층 응용 프로그램에 로컬 데이터베이스 캐시를 추가해야 하므로 별도의 프로젝트인 DataService에 서버 동기화 구성 요소를 생성하도록 고급 옵션을 설정해야 합니다.
N 계층 응용 프로그램에 데이터 동기화를 구성하려면
서버 연결을 Northwind 데이터베이스의 SQL Server 버전으로 설정합니다.
추가 단추를 클릭하여 오프라인으로 사용할 테이블 구성 대화 상자를 엽니다.
Customers 테이블에 해당되는 확인란을 선택한 다음 확인을 클릭합니다. 이때 기본값을 그대로 사용합니다.
고급을 클릭합니다.
서버 프로젝트 위치 목록에서 DataService를 선택합니다.
확인을 클릭합니다.
동기화 구성 요소가 생성된 후 데이터가 처음으로 동기화되고 데이터 소스 구성 마법사가 열립니다. 로컬 데이터베이스가 프로젝트에 생성되고 데이터로 채워집니다.
Customers 테이블을 선택한 다음 데이터베이스 개체 선택 페이지에서 이 테이블과 연결된 확인란을 선택합니다.
데이터 집합 이름에 LocalNorthwindCustomers를 입력하고 마침을 클릭합니다.
기존 데이터 서비스에서 동기화 사용
생성된 동기화 구성 요소가 DataService 프로젝트에 추가되었지만 서비스에서 이들 구성 요소를 구현해야 합니다. 생성된 SyncContract에는 서비스에서 필요로 하는 정보가 들어 있습니다. 이 정보는 파일에서 주석으로 나타납니다. 서비스의 App.config 파일의 적절한 섹션에 필요한 정보를 복사하십시오.
App.config 파일에 서비스 정보를 추가하려면
솔루션 탐색기에서 CustomersCache.Server.SyncContract 파일을 두 번 클릭하여 엽니다.
다음과 같이 주석 처리된 줄을 찾습니다.
<endpoint address ="" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>
주석 문자를 제외하고 줄을 복사합니다.
솔루션 탐색기에서 DataService의 App.config 파일을 두 번 클릭하여 엽니다.
<!-- Metadata Endpoints --> 주석을 찾습니다. 3단계에서 복사한 줄을 <endpoint address = "mex"로 시작하는 줄 아래에 추가합니다.
다음 코드와 같이 방금 붙여 넣은 끝점 주소의 이름(예: SyncServer)을 입력합니다.
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <endpoint address ="SyncServer" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
기존 데이터 서비스에 동기화 서비스 작업을 추가하려면
솔루션 탐색기에서 CustomersCache.Server.SyncContract 파일을 두 번 클릭하여 엽니다.
클래스 이름을 CustomersCacheSyncService에서 Service1로 변경합니다. 다음 코드 예제에서는 클래스 이름을 변경한 이후의 클래스 선언을 보여 줍니다. C# 사용자의 경우에는 생성자의 이름도 변경해야 합니다.
Partial Public Class Service1 Inherits Object Implements ICustomersCacheSyncContract ...
public partial class Service1 : object, ICustomersCacheSyncContract {...
C# 사용자의 경우
Service1.cs 파일에서 Service1의 클래스 선언을 다음과 같이 partial 클래스로 변경합니다.
public partial class Service1 : object, ICustomersCacheSyncContract { private CustomersCacheServerSyncProvider _serverSyncProvider; public Service1() {...
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
기존 서비스에 동기화 작업을 추가했으므로 PresentationTier 프로젝트에서 서비스 참조를 업데이트해야 합니다.
서비스 참조를 업데이트하려면
솔루션 탐색기에서 PresentationTier 프로젝트의 ServiceReference1을 찾습니다.
ServiceReference1을 마우스 오른쪽 단추로 클릭하고 서비스 참조 업데이트를 클릭합니다.
로컬 캐시에서 Customers 데이터를 로드하도록 폼 수정
현재 프레젠테이션 계층의 폼은 데이터 서비스에서 데이터를 가져오기 때문에 SQL Server Compact 3.5 데이터베이스에 있는 Customers 테이블의 로컬 복사본에서 데이터를 로드하도록 코드를 수정해야 합니다. Orders 테이블은 DataService에서 반환한 데이터를 사용하여 로드됩니다.
로컬 데이터베이스 캐시에서 Customers 데이터를 로드하도록 Form1을 수정하려면
코드 편집기에서 Form1을 엽니다.
기존 Form1_Load 코드를 다음 코드로 바꿉니다.
Using DataSvc As New ServiceReference1.Service1Client ' Create a CustomersTableAdapter to load data from ' the local database cache. Dim CustomersTableAdapter As New LocalNorthwindCustomersTableAdapters.CustomersTableAdapter NorthwindDataSet.Customers.Merge(CustomersTableAdapter.GetData) NorthwindDataSet.Orders.Merge(DataSvc.GetOrders) End Using
using (ServiceReference1.Service1Client DataSvc = new ServiceReference1.Service1Client()) { LocalNorthwindCustomersTableAdapters.CustomersTableAdapter customersTableAdapter = new LocalNorthwindCustomersTableAdapters.CustomersTableAdapter(); northwindDataSet.Customers.Merge(customersTableAdapter.GetData()); northwindDataSet.Orders.Merge(DataSvc.GetOrders()); }
응용 프로그램 테스트
응용 프로그램을 실행합니다. 로컬 데이터베이스 캐시 및 데이터 서비스 모두에서 데이터가 검색됩니다.
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
로컬 데이터베이스에서 Customers 테이블의 데이터가 검색되고 데이터 서비스에서 Orders 테이블의 데이터가 검색됩니다.
폼을 닫습니다.
데이터 동기화
올바른 소스로부터 테이블을 표시하도록 프레젠테이션 계층을 설정했으므로 이제 동기화를 시작할 코드를 추가해야 합니다. 다음 단계에서는 동기화 프로세스를 시작하는 단추를 폼에 추가합니다.
로컬 데이터베이스 캐시와 원격 데이터베이스의 데이터를 동기화하려면
디자인 뷰에서 Form1을 엽니다.
폼의 Toolstrip을 클릭하고 Toolstrip에 단추를 추가합니다.
단추 이름을 SyncButton으로 지정합니다.
SyncButton을 두 번 클릭하여 SyncButton_Click 이벤트 처리기를 만듭니다.
동기화 프로세스를 시작하는 다음 코드를 이벤트 처리기에 추가합니다.
Dim syncAgent As CustomersCacheSyncAgent = New CustomersCacheSyncAgent Using syncClient As New ServiceReference1.CustomersCacheSyncContractClient syncAgent.RemoteProvider = New Microsoft.Synchronization.Data.ServerSyncProviderProxy(syncClient) Dim syncStats As Microsoft.Synchronization.Data.SyncStatistics = syncAgent.Synchronize NorthwindDataSet.Customers.Merge(New LocalNorthwindCustomersTableAdapters.CustomersTableAdapter().GetData()) Dim syncSummary As String = "Total changes downloaded: " & _ syncStats.TotalChangesDownloaded.ToString() & vbCrLf & _ "Last successful synchronization: " & _ syncStats.SyncCompleteTime.ToString MessageBox.Show(syncSummary) End Using
CustomersCacheSyncAgent syncAgent = new CustomersCacheSyncAgent(); using (ServiceReference1.CustomersCacheSyncContractClient syncClient = new ServiceReference1.CustomersCacheSyncContractClient()) { syncAgent.RemoteProvider = new Microsoft.Synchronization.Data.ServerSyncProviderProxy(syncClient); Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize(); northwindDataSet.Customers.Merge(new LocalNorthwindCustomersTableAdapters.CustomersTableAdapter().GetData()); string syncSummary = "Total changes downloaded: " + syncStats.TotalChangesDownloaded.ToString() + Environment.NewLine + "Last successful synchronization: " + syncStats.SyncCompleteTime.ToString(); MessageBox.Show(syncSummary); }
로컬 데이터베이스에서 Customers 테이블의 데이터가 검색되고 데이터 서비스에서 Orders 테이블의 데이터가 검색됩니다.
폼을 닫습니다.
응용 프로그램 테스트
응용 프로그램을 테스트하려면
F5 키를 누릅니다.
응용 프로그램이 실행 중일 때 서버 탐색기/데이터베이스 탐색기 또는 다른 데이터베이스 관리 도구를 사용하여 원격 서버 데이터베이스에 연결한 후 일부 레코드를 수정합니다.
서버 탐색기/데이터베이스 탐색기에서 Northwind.sdf에 대한 연결이 아니라 원격 데이터베이스 서버에서 Customers 테이블을 찾습니다.
Customers 테이블을 마우스 오른쪽 단추로 클릭하고 테이블 데이터 표시를 클릭합니다.
하나 이상의 레코드를 수정하고 변경 내용을 커밋합니다. 그런 다음 수정된 행 밖으로 이동합니다.
폼으로 돌아가 SyncButton을 클릭합니다.
원격 데이터베이스에 대한 수정 내용이 로컬 데이터베이스로 동기화되고 표에 표시되는지 확인합니다.
폼을 닫습니다. 중지합니다.
다음 단계
응용 프로그램 요구 사항에 따라서는 n 계층 응용 프로그램에 로컬 데이터베이스 캐시를 추가한 후 몇 가지 단계를 더 수행해야 할 수도 있습니다. 예를 들어 다음과 같이 응용 프로그램을 보완할 수 있습니다.
데이터 집합에 유효성 검사를 추가합니다. 자세한 내용은 연습: N 계층 데이터 응용 프로그램에 유효성 검사 추가를 참조하십시오.
양방향 동기화를 사용합니다. 자세한 내용은 방법: 양방향 동기화를 위해 로컬 및 원격 데이터베이스 구성을 참조하십시오.
참고 항목
작업
방법: N 계층 응용 프로그램에서 데이터 집합에 코드 추가
연습: N 계층 데이터 응용 프로그램에 유효성 검사 추가
연습: 로컬 데이터베이스와 함께 필요에 따라 연결되는 응용 프로그램 배포
방법: 양방향 동기화를 위해 로컬 및 원격 데이터베이스 구성
개념
SQL Server Compact 3.5 및 Visual Studio