본문 바로가기

IT 살이/04. 기술 - 프로그래밍

ClickOnce 어플리케이션의 파일 관리(Ⅳ) - 데이터 파일(ii)

1.1.4 XML 파일 데이터 병합하기

먼저 간단히 XML 파일이 “데이터 파일”로 배포된 경우의 데이터 병합에 대해서 생각해보겠습니다. 현재 클라이언트에는 1.0 버전의 authors.xml 파일이 내려가 있습니다. 사용자들은 각자 authors.xml 파일에 필요한 편집 작업을 한 후 저장해 두고 있습니다. 다음 그림을 보면 최종 사용자가 버전 1.0의 어플리케이션에서 authors.xml에 레코드를 하나 추가하고 있습니다. 이제 프로그램의 버그로 인해 버전 2.0의 어플리케이션으로 업데이트하려고 합니다. 그런데 버전 2.0의 authors.xml 파일의 내용에도 1.0 배포할때보다 레코드가 하나더 추가되어 배포됩니다.

업데이트를 수행하게 되면 서버측에서 변경된 authors.xml 파일이 클라이언트의 2.0 데이터 폴더로 다운로드됩니다. 그런 다음 다시 변경된 버전 1.0의 authors.xml 파일도 2.0 데이터 폴더의 하위에 있는 .pre 폴더로 복사됩니다. 어플리케이션에서는 1.0버전의 authors.xml 파일의 데이터와 2.0 버전의 authors.xml 파일의 데이터를 병합합니다. 병합때 2.0의 authors.xml과 1.0의 authors.xm의 데이터중에서 “au_id”가 중복되는 레코드는 2.0의 레코드만 남겨두고 1.0의 레코드는 삭제합니다. 결과는 그림과 같습니다.

1003076484

그림  데이터 병합 결과

이처럼 클라이언트에 있는 버전 1.0의 XML 파일이 제대로 버전 2.0의 XML로 옮겨가려면 버전2.0의 어플리케이션에는 데이터 이행을 수행하는 코드가 있어야 합니다. 이 결과를 보려면 책과 함께 배포된 예제 프로젝트를 다음과 같이 실행시켜야 합니다.

1. “XML파일데이터이행” 폴더밑에 보면 버전1.0과 2.0 프로젝트가 있습니다. 먼저 버전1.0 프로젝트를 오픈합니다. 추가된 파일중에서 authors.xml 파일을 열어서 추가되어 있는 데이터를 확인합니다. authors.xml 파일의 “빌드 작업” 속성이 “내용”으로 선택되어 있는지 확인합니다.

2. 프로젝트 디자이너에서 게시 탭으로 이동합니다. “응용 프로그램 파일…” 버튼을 클릭해서 구성 파일 속성 편집 창을 띄웁니다. authors.xml 파일의 “게시 상태”가 “데이터 파일”로 설정되어 있는지 확인합니다. 창을 닫습니다.

3. 게시 버전을 “1.0.0.0”으로 설정합니다.

4. “게시” 버튼을 클릭해서 어플리케이션을 게시합니다.

5. 자동 생성되는 publish.htm 페이지의 “설치” 버튼을 클릭해서 버전 1.0 어플리케이션을 실행합니다.

6. “XML로딩” 버튼을 클릭해서 배포된 authors.xml의 데이터를 로딩합니다.

7. 레코드를 하나 그리드에 추가하고 저장 버튼을 클릭합니다.

8. 버전 1.0 어플리케이션을 종료합니다.

다음은 서버측에서 변경된 버전 2.0을 게시할 차례입니다.

1. 버전2.0 프로젝트를 오픈합니다. 추가되어 있는 authors.xml 파일에는 원래의 버전 1.0의 초기 데이터보다 한건이 더 추가되어 있음을 확인합니다. 다시 파일의 “빌드 작업”속성이 “내용”으로 설정되어 있는지 확인합니다.

2. 이전처럼 어플리케이션 구성 파일 창을 열어서 “게시 상태”를 확인합니다.

3. “게시 버전”을 “2.0.0.0”으로 변경합니다.

4. “게시”버튼을 클릭해서 버전 2.0을 게시합니다.

5. 자동 호출되는 publish.htm 페이지를 닫습니다.

6. “시작” 메뉴의 바로가기를 선택합니다.

7. 업데이트를 묻는 창이 뜨면 확인을 선택해서 업데이트를 수행합니다.

8. “XML로딩” 버튼을 클릭해서 1.0의 클라이언트 버전과 2.0의 서버측 버전 authors.xml의 데어터가 병합되어 출력되는 결과를 확인합니다.

버전 2.0의 어플리케이션에서 구현하는 데이터 병합하는 절차는 이렇습니다. .pre 폴더에 저장되어 있는 1.0의 클라이언트 버전 authors.xml과 데이터 디렉토리에 다운로드되어 있는 새로운 2.0 버전의 authors.xml을 각각의 데이터셋으로 로딩합니다. 그런 두 데이터 셋을 병합합니다. 병합하기 전에 “au_id” 컬럼값이 중복되는 레코드는 서버측 레코드를 삭제해서 중복을 피하도록 했습니다. 다음은 예제 프로젝트 “XML파일데이터이행”에 포함되어 있는 코드입니다.

코드  이전 버전과 새로운 버전의 데이터 파일 병합 예제

string _DirPath = "";

string _File = "authors.xml";

public Form1()

{

InitializeComponent();

//데이터 디렉토리 경로

if (_DirPath == "")

{

_DirPath = GetDataDirectory();

}

//ClickOnce 어플리케이션이고

//해당 버전이 처음 실행되는지를 확인한다.

if (ApplicationDeployment.IsNetworkDeployed

&& ApplicationDeployment.CurrentDeployment.IsFirstRun)

{

//이전 버전과 새로운 버전의 데이터를 병합니다.

MergeData();

}

}

//XML파일이 포함된 디렉토리를 구한다

private string GetDataDirectory()

{

string dir = "";

// ClickOnce로 배포된 어플리케이션인지 확인하기

if (ApplicationDeployment.IsNetworkDeployed)

{

// 데이터 디렉토리 조회

dir = ApplicationDeployment.CurrentDeployment.DataDirectory;

}

else

{

// 어플리케이션 디렉토리 조회

dir = AppDomain.CurrentDomain.BaseDirectory;

}

return dir;

}

// 이전 버전의 XML데이터와 새로운 버전의 XML 데이터를 병합하기

private void MergeData()

{

// 데이터 파일에 대한 전체 경로

string fullPath = Path.Combine(_DirPath, _File);

// 이전 데이터 파일에 대한 전체 경로

string preFullPath = Path.Combine(_DirPath, @".pre\" + _File);

//데이터이행할 파일이 없음

if (!File.Exists(preFullPath))

return;

// 새로운 버전의 XML 데이터 로딩하기

_AuthorSet.Clear();

_AuthorSet.ReadXml(fullPath);

// 이전 버전의 XML데이터 로딩하기

DataSet preAuthorsDataSet = new DataSet();

preAuthorsDataSet.ReadXml(preFullPath);

preAuthorsDataSet.Tables[0].TableName = "authors";

// 병합

// 이 부분은 상황에 따라서 적절한 병합 정책을 구현해야 합니다.

DataRow[] drs = null;

foreach (DataRow row in preAuthorsDataSet.Tables[0].Rows)

{

drs = _AuthorSet.Tables["authors"].Select("au_id='" + row["au_id"].ToString() + "'");

if (drs.Length >= 1)

{

drs[0].Delete();

}

}

_AuthorSet.Merge(preAuthorsDataSet);

//XML 파일에 저장

_AuthorSet.WriteXml(fullPath);

}

폼 인스턴스가 생성되면서 바로 GetDirectory() 메소드를 호출해서 ClickOnce로 배포된 경우(IsNetworkDeployed)의 데이터 디렉토리에 대한 경로를 구합니다. 그런 다음 MergeData()를 호출하고 있습니다. 그러나 이 메소드는 역시 ClickOnce로 배포된 경우이여야 하고 그리고 해당 버전에서 처음 실행되는 경우(IsFirstRun)만 호출합니다.

MergeData()에서는 현재 데이터 디렉토리에 있는 2.0 버전의 authors.xml과 .pre 폴더에 있는 이전 버전의 authors.xml을 각각 다른 데이터셋에 로딩합니다. 그런 다음 병합을 합니다. 여기서는 예제를 간단히 하기 위해서 “au_id”가 중복된 레코드는 새로 다운로드한 버전의 레코드를 삭제한 다음 DataSet 클래스의 Merge()를 통해서 병합하는 간단한 규칙을 사용하고 있습니다. 그러나 실전 프로그램에서는 데이터 병합 규칙이 좀더 복잡할 수도 있습니다. 때로는 스키마의 변경까지도 있을 것입니다.

하여튼 적절한 위치에서 이전 버전의 데이터와 최신 버전의 데이터를 병합하는 코드를 구현하지 않으면 이전 버전의 데이터는 사라지게 된다는 것입니다.

1.1.5 데이터베이스 파일 배포하기

■ 클라이언트측 데이터베이스

요즘은 무선을 지원하는 기술과 디바이스가 계속 나오면서 이제는 온라인과 오프라인을 모두 지원해야만 하는 시나리오가 증가하고 있습니다. 기존의 연결 지향형 데이터베이스로는 이런 기술들을 지원하기가 힘들어지고 있습니다. 클라이언트 어플리케이션이 오프라인 상태가 되더라도 사용할 수 있는 저장소가 필요하게 되었고 그러다 필요하다면 온라인으로 연결시켜 서버측의 중앙 데이터베이스와 동기화할 수 있는 방안이 필요하게 된 것입니다.

SQL Server 2005 제품군에는 이런 로컬 저장소에 적합한 두 제품이 포함되어 있습니다: Microsoft SQL Server 2005 Compact Edition 과 Microsoft SQL Server 2005 Express Edition. 두 제품 모두 클라이언트 어플리케이션의 로컬 저장소와 캐시 제공을 목적으로 하는 제품들입니다.

Microsoft SQL Server 2005 Express Edition( 이하 SQL Server Express 버전으로 줄입니다)는 기존의 Microsoft Data Engine (MSDE)이 진화한 제품입니다. 다운로드 용량은 대략 53MB 정도가 됩니다. 따라서 대부분의 클라이언트 배포 시나리오에서는 여전히 큰 사이즈입니다. 대신에 데이터베이스 엔진의 완전한 기능이 필요하다면 SQL Express는 좀 더 적합한 로컬 데이터 저장소가 될 것입니다.

SQL Server 2005 Compact Edition( 이하 SQL Compact 버전으로 줄입니다)도 데스크톱 시나리오를지원하는 제품으로서 기존의 SQL Server 2005 Mobile Edition( 그 이전에는 SQL CE)이 진화한 제품입니다. 마이크로스프트에서는 클라이언트 어플리케이션의 기본 로컬 저장소로서 SQL Express 보다 이 제품을 더 권장하고 있습니다. SQL Compact 버전은 몇 개의 DLL로 구성되는데 그 다운로드 용량이 1.7M 이하로서 배포에도 별 부담이 없습니다. 따라서 데스트톱 그리고 모바일 장치용 어플리케이션에는 SQL Compact가 적합한 버전이라 하겠습니다.

■ SQL Compact Edition의 특징

SQL Compact 엔진을 배포하는 방법은 두 가지가 있습니다. SQL Compact엔진은 설치 프로그램으로 제공되는데, 이 설치 프로그램을 부트스트래퍼에 포함시켜 사전 필수 프로그램으로 배포할 수 있습니다. SQL Compact 엔진은 몇 개의 DLL들로 구성되는데 설치 프로그램으로 배포되면 이 DLL들은 GAC에 등록이 됩니다. 그리고 설치 프로그램을 이용해서 배포하는 방식은 관리자 권한이 필요합니다.

다른 방법으로는 SQL Compact DLL들을 프로젝트에 파일(참조 추가가 아닙니다)로서 포함시켜 ClickOnce를 이용해서 어플리케이션과 함께 배포하는 방법이 있습니다. 이렇게 임베딩된 SQL Compact DLL들은 설치되는 어플리케이션의 전용으로 배포가 됩니다. 이렇게 어플리케이션 전용 배포를 하게 되면 권리자 권한이 필요하지 않습니다.

앞의 두 방법은 데이터베이스 엔진 배포 방법입니다. 이제 데이터를 배포해야 하는데 이것도 간단합니다. SQL Compact 버전은 파일(.sdf)기반의 데이터베이스입니다. 즉 .sdf 데이터 파일만 배포하면 됩니다. 데이터 파일을 배포하려면 앞에서 알아본 authors.xml 파일처럼 “데이터 파일”로서 포함되면 됩니다.

SQL Compact의 데이터베이스 엔진 DLL은 어플리케이션에 파일 형태로 추가하고 그리고 데이터 파일“.sdf”는 ClickOnce의 “데이터 파일”로 설정하게 되면 어플리케이션의 로컬 데이터 저장소가 간단히 클라이언트로 배포됩니다. 이 책에서의 예제도 이 방식을 사용합니다.

1.1.6 SQL Compact 프로젝트 구성하기

여기서는 SQL Compact엔진의 구성 어셈블리들을 프로젝트에 파일로서 임베딩하는 절차에 대해서 알아봅니다. 이렇게 구성 어셈블리들을 프로젝트에 임베딩시키게 되면 부트스트래퍼로 사전 필수 프로그램을 SQL Compact를 설치할 필요가 없게 됩니다. 그래서 앞에서 말한대로 관리자 권한이 필요없게 됩니다. 프로젝트를 구성하기 위해서는 사전에 다음이 설치되어 있어야 합니다.

Visual Studio 2005 SP1, SQL Server Compact Edition , SQL Server Compact Edition Tools for Visual Studio

설치가 끝나면 다음 절차를 따라서 SQL Compact 데이터베이스를 배포할 준비를 합니다.

1. 앞의 세 설치를 끝내고 나서 다음 디렉토리 C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile\v3.0 하위로 이동합니다. 이 폴더와 하위 폴더에는 데이터파일 Northwind.sdf와 SQL Compact DLL들이 있습니다.

2. 이 파일들을 Visual Studio의 프로젝트 디렉토리로 복사해서 프로젝트에 포함시킵니다.

3. 이 파일들의 “출력 디렉토리로 복사” 속성을 “변경된 내용만 복사”로 설정합니다.

4. Northwind.sdf 파일을 프로젝트에 추가하면 자동적으로 System.Data.SqlServerCe.dll에 대한 참조도 추가됩니다. 확인하고 만약 추가되어있지 않다면 C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\System.Data.SqlServerCe.dll 경로의 파일을 참조추가합니다.

5. “로컬 복사” 속성을 “True”로 설정합니다.

다음은 구성된 결과 프로젝트입니다.

1305347355

그림 7‑31 SQL Compact 포함 프로젝트 구성

이렇게 해서 SQL Compact 데이터베이스를 임베딩 방식으로 배포할 준비가 되었습니다. 이제 데이터소스를 이용해서 필요한대로 프로그램을 작성하면 됩니다. 클라이언트에 배포되어서 데이터 파일에 연결하는 연결문자열을 어떻게 설정하는지에 대해서는 함께 제공되는 소스 “SQLCompact데이터이행”프로젝트의 코드를 참조하면 됩니다. 데이터 파일과의 연결이 이뤄졌으면 흔히 해 왔던 것처럼 T-SQL 쿼리와 ADO.NET 객체들을 이용해서 데이터 관리를 하면 됩니다.

앞에서 말한대로 .sdf 파일을 “데이터 파일”로 설정해서 배포하면 데이터디렉토리로 배포가 됩니다. 이 데이터 파일에 대한 연결 문자열은 좀 특별한 변수 DataDirectory를 사용해서 구성합니다.

"Data Source = |DataDirectory|\Mydb.sdf"

DataDirectory를 사용해서 이렇게 연결 문자열을 지정하면 이 경로는 런타임시 실질적인 물리적인 경로로 풀이됩니다. 개발시에 디버그 모드에서 실행된다면 DataDirectory는 거기에 맞는 디렉토리 즉 실행파일이 있는 bin폴더로 해석됩니다. 물론 이때 “Mydb.sdf”의 “출력 디렉토리로 복사” 속성의 값은 “항상 복사” 또는 “변경된 내용만 복사”로 설정되어 있어야 합니다.

1.1.7 SQL Compact 데이터 파일 업데이트하기

앞에서는 ClickOnce로 SQL Compact의 데이터베이스를 프로젝트에 파일로 포함시켜 배포하는 절차에 대해서 알아봤습니다. 이제 다시 데이터 파일의 업데이트에 대한 이야기로 돌아가보겠습니다. 데이터 파일로 XML 파일 authors.xml을 업데이트할때와 그 과정은 동일합니다. SQL Compact 데이터 이행을 위한 예제 코드는 “SQLCompact데이터이행” 폴더하위에 있는 버전 1.0과 버전 2.0 프로젝트를 보면 됩니다.

먼저 버전 1.0을 게시해서 클라이언트 머신에 설치합니다. 클라이언트에는 1.0 버전의 Northwind.sdf 파일이 함께 배포되어 내려가 있습니다. 이 데이터 파일에는 “Customers”라는 테이블이 하나 포함되어 있습니다. 사용자들은 각자 필요한대로 고객에 대한 정보를 편집해서 다시 저장해 둡니다. 이런 상태에서 2.0의 어플리케이션으로 업데이트하려고 합니다. 그런데 버전 2.0의 Northwind.sdf 파일의 내용에는 1.0 배포할때와는 다른 데이터가 들어있습니다. 동일한 테이블의 레코드가 추가되었거나 테이블이 추가되었거나 또는 테이블의 컬럼 구조가 변경되었을 수도 있습니다. 업데이트를 수행하게 되면 서버측에서 변경된 Northwind.sdf 파일이 클라이언트의 2.0 데이터 폴더로 다운로드됩니다. 그런 다음 다시 변경된 버전 1.0의 Northwind.sdf 파일도 2.0 데이터 폴더의 하위의 .pre 폴더로 복사됩니다.

이제 데이터의 병합은 어플리케이션의 책임입니다. 클라이언트의 1.0 버전의 Northwind.sdf와 새로 다운로드된 버전 2.0의 Nortwind.sdf의 데이터를 어떻게 병합할지는 어플리케이션의 코드로 구현되어야 합니다. 두 버전간에 데이터 및 테이블의 구조적인 차이가 크면 클수록 그 병합을 코드도 복잡해질 것입니다.

그림은 병합 과정중의 데이터들의 모습입니다. 클라이언트측에 설치되어 있는 버전 1.0의 어플리케이션을 실행시켜 데이터를 하나 수정해서 저장하고 있습니다.

1178023407

그림  SQL Compact-클라이언트측 버전1.0 데이터

현재 클라이언트측 버전 1.0의 데이터 레코드 수는 91개입니다. 다음은 서버측에서 레코드 하나 더 추가해서 92개인 데이터를 준비해서 버전 2.0으로 해서 배포합니다.

1047822232

그림 SQL Compact-서버측 버전 2.0 데이터

이제 클라이언트측에 배포된 1.0 버전과 서버측에서 내려온 2.0 버전이 병합된 결과가 어플리케이션 2.0의 데이터가 됩니다.

1149722432

그림 SQL Compact 클라이언트측 병합 버전 데이터

이런 결과를 얻기위해서는 제공되는 소스 프로젝트를 다음 절차대로 실행시킵니다.

1. 먼저, “버전 1.0” 폴더에 있는 “SQLCompact데이터이행” 프로젝트를 Visual Studio에서 오픈합니다. 이 프로젝트에는 버전 1.0의 Northwind.sdf 파일이 “데이터 파일”로 설정되어 있습니다.

2. 게시 탭페이지에서 게시 버전을 “1.0.0.0”으로 설정합니다.

3. “게시” 버튼을 클릭해서 게시를 수행합니다.

4. 자동 호출되는 publish.htm의 “설치” 버튼을 클릭해서 버전 “1.0.0.0” 어플리케이션을 설치합니다.

5. “데이터 로드”버튼을 클릭해서 1.0 버전의 Customers 테이블을 로드합니다.

6. 임의대로 데이터를 변경합니다.

7. “저장”버튼을 클릭해서 저장합니다.

클라이언트에 배포된 버전 1.0의 데이터가 변경되었습니다. 이제 서버측에서 레코드가 하나 추가되어있는 버전의 Northwind.sdf 게시하도록 하겠습니다.

1. “버전 2.0” 폴더에 있는 “SQLCompact데이터이행” 프로젝트를 Visual Studio에서 오픈합니다.

2. 게시 탭페이지에서 게시 버전을 “1.0.0.1”으로 설정합니다.

3. “게시” 버튼을 클릭해서 게시를 수행합니다.

4. 자동 호출되는 publish.htm의 “설치” 버튼을 닫고, “시작” 메뉴의 바로가기를 통해서 어플리케이션업데이트를 수행합니다.

5. 버전 2.0의 어플리케이션이 시작되면서 이전 버전과의 데이터 병합이 이뤄집니다.

6 “데이터 로드”버튼을 클릭하면 병합된 최종 데이터가 출력됩니다.

“SQLCompact데이터이행” 예제의 병합 코드는 단순합니다. authors.xml에서처럼 클라이언트측에서 변경된 1.0의 Customers 테이블의 레코드를 그대로 유지하고 2.0의 Customers테이블에 새로 추가된 레코드만 병합을 하고 있습니다. 다음은 “SQLCompact데이터이행” 프로젝트에서 병합하는 부분의 코드입니다. 데이터를 병합하는 코드는 모두 MergeData() 메소드에 있습니다. 이 메소드는 어플리케이션이 ClickOnce로 배포되고 그리고 새로운 버전 1.0.0.1이 처음으로 시작되는 경우만 호출됩니다. 다음에 소개되는 코드는 “SQLCompact데이터이행” 예제 프로젝트에 포함되어 있습니다.

코드  데이터 병합 시기 선택

//ClickOnce 어플리케이션이고

//해당 버전이 처음 실행되는지를 확인한다.

if (ApplicationDeployment.IsNetworkDeployed

&& ApplicationDeployment.CurrentDeployment.IsFirstRun)

{

//이전 버전과 새로운 버전의 데이터를 병합니다.

MergeData();

}

다음은 호출되는 MergeData() 메소드입니다.

코드 7‑10 SQL Compact 데이터 병합 예제

// 이전 버전의 Northwind.Custorms테이블과 새로운 버전의 Northwind.Custorms테이블를 병합한다.

private void MergeData()

{

string dataDirectory = "";

if (ApplicationDeployment.IsNetworkDeployed)

{

dataDirectory = ApplicationDeployment.CurrentDeployment.DataDirectory;

}

else

{

dataDirectory = AppDomain.CurrentDomain.BaseDirectory;

}

string preDataFile = Path.Combine( dataDirectory, @".pre\Northwind.sdf");

//데이터이행할 이전 파일이 없으면 작업을 종료한다.

if (!File.Exists(preDataFile)) return;

// 이전 데이터 파일에 대한 전체 경로

string preConnectString = @"Data Source = |DataDirectory|\.pre\Northwind.sdf";

SqlCeConnection preConnection = new SqlCeConnection(preConnectString);

// 데이터 파일에 대한 전체 경로

string newConnectString = @"Data Source = |DataDirectory|\Northwind.sdf";

SqlCeConnection newConnection = new SqlCeConnection(newConnectString);

//이전 버전의 데이터를 가져온다.

NorthwindDataSet preDataSet = new NorthwindDataSet();

CustomersTableAdapter preAdapter = new CustomersTableAdapter();

preAdapter.Connection = preConnection;

preAdapter.Fill(preDataSet.Customers);

//새로운 버전의 데이터를 가져온다.

NorthwindDataSet newDataSet = new NorthwindDataSet();

CustomersTableAdapter newAdapter = new CustomersTableAdapter();

newAdapter.Connection = newConnection;

newAdapter.Fill(newDataSet.Customers);

//두 버전의 데이터를 병합한다.

//이 부분은 현실적인 시나리오에 있어서는 더 복잡해질 수 있다.

DataRow[] drs = null;

foreach (DataRow row in preDataSet.Customers)

{

drs = newDataSet.Customers.Select("[Customer ID]='" + row["Customer ID"].ToString() + "'");

if (drs.Length >= 1)

{

drs[0].Delete();

}

}

newDataSet.Merge( preDataSet);

//데이터 파일에 저장

newAdapter.Update( newDataSet.Customers);

}

이곳에서 이야기하고자 했던 것은 병합 로직이나 코드가 아닙니다. 중요한 것은, 클라이언트에 배포된 데이터 파일이 수정된 상태이고 그리고 서버측에서 새롭게 배포된 데이터 파일도 이전 버전의 초기 데이터 파일을 수정한 경우라면 어떤 과정을 거쳐 그 파일의 업데이트가 일어나는가입니다. 클라이언트에서 수정된 이전 버전의 데이터 파일은 새로운 버전의 데이터 디렉토리의 하위 디렉토리 .pre로 복사됩니다. 서버측의 수정된 데이터 파일도 새로운 버전의 디렉토리로 다운로드됩니다. 그런 상태에서 아무런 병합 작업을 해주지 않은채 다시 한번 더 어플리케이션 업데이트 작업을 해 준다면 .pre 폴더에 있던 이전 버전의 데이터 파일제 사용할 수 없게 됩니다. 해서 상황에 맞게 적절한 병합 코드가 필요합니다.