# DB Cache 사용 및 활용

## 독점적 데이터 불러오기 및 새 데이터 추가 방법

[**독점적 불러오기**](https://docs.proudnet.com/proudnet/proudnet/db_system/theory#undefined) 메서드는 <mark style="color:orange;">Proud.CDbCacheClient2.RequestExclusiveLoadData</mark> 입니다. 로딩할 데이터를 검색하기 위해 인자 <mark style="color:orange;">fieldName</mark>과 <mark style="color:orange;">cmpValue</mark>에 찾을 조건을 넣어야 합니다.<br>

사용 예시 입니다.

```cpp
Proud::Guid outSessetionGuid;
Proud::CDbCacheClient2* c = ...;
c->RequestExclusiveLoadData(L"Gamer",L"GamerID",gamername,outSessetionGuid);
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestExclusiveLoadNewData</mark> 메서드도 마찬가지로 독점적 불러오기 함수지만 RootTable 에 데이터를 추가한 뒤 바로 쓰실 때 사용합니다.<br>

사용 예시 입니다.

```cpp
CPropNodePtr newNode = CPropNodePtr(new CPropNode(L"Gamer"));
 
newNode->Fields[L"GamerID"] = "Ulelio";
 
Proud::Guid outSessetionGuid;
Proud::CDbCacheClient2* c = ...;
c->RequestExclusiveLoadNewData(L"Gamer", newNode, outSessetionGuid);
```

## 일방적 데이터 변경하기

> * Proud.CDbCacheClient2.UnilateralAddData
> * Proud.CDbCacheClient2.UnilateralUpdateData
> * Proud.CDbCacheClient2.UnilateralRemoveData

이 메서드들은 DB cache 메모리에 변경을 반영하고 추후 DBMS에 비동기로 실제 기록을 하기에 호출 즉시 리턴합니다. 또한 응답 메서드 콜백이 없습니다.

## DBMS에 먼저 반영되는 요청 응답형 메서드 및 blocked 메서드 사용

DBMS 에 먼저 반영되는 요청 응답형 메서드 및 blocked 메서드 사용은 [**요청 응답형 데이터 변경**](https://docs.proudnet.com/proudnet/proudnet/db_system/theory#id-2) 을 위한 메서드 입니다.\
호출 즉시 리턴하며, 변경 사항은 실제 DBMS에 기록이 완료된 후에야 DB cache의 메모리에도 반영됩니다.

<table data-full-width="false"><thead><tr><th width="294">메서드 호출</th><th>결과 콜백</th></tr></thead><tbody><tr><td>Proud.CDbCacheClient2.RequestAddData</td><td>Proud.IDbCacheClientDelegate2.OnAddDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnAddDataSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestUpdateData</td><td>Proud.IDbCacheClientDelegate2.OnUpdateDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnUpdateDataSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestRemoveData</td><td>Proud.IDbCacheClientDelegate2.OnRemoveDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnRemoveDataSuccess</td></tr></tbody></table>

만약 요청 응답형이 아닌 blocked 호출을 원한다면 이들 메서드를 사용하십시오.

> * Proud.CDbCacheClient2.BlockedAddData
> * Proud.CDbCacheClient2.BlockedUpdateData
> * Proud.CDbCacheClient2.BlockedRemoveData

## 요청 응답형 SessionGuid

독점 Client 들이 각각 한 개의 Session을 가지게 되고, DB Cache Client는 각각의 Session들을 구분하기 위해 Guid 값을 사용합니다. \
요청 시 Output 파라미터로 SessionGuid 값을 발급받고, 응답 <mark style="color:orange;">Event의 CCallbackArgs::m\_sessionGuid</mark>로 발급 받았던 값을 받게 됩니다. <mark style="color:orange;">outSessionGuid</mark>를 저장했다가 비교하여 요청한 session을 확인할 수 있습니다.

**요청**

```
CDbCacheClient2::RequestExclusiveLoadNewData(String rootTableName, CPropNodePtr addData, Guid &outSessionGuid);
```

**응답**

```
IDbCacheClientDelegate2::OnExclusiveLoadDataFailed(CCallbackArgs args)
```

{% hint style="info" %}
**요청**의 <mark style="color:orange;">outSessionGuid</mark> 는 **응답**의 <mark style="color:orange;">args.m\_sessionGuid</mark> 와 같습니다.
{% endhint %}

## 비독점적 데이터 접근 방법

비독점적 접근을 허락하기 위해 <mark style="color:orange;">Proud.CDbCacheServer2StartParameter.m\_allowNonExclusiveAccess</mark>를 설정해야 합니다.

<table data-full-width="false"><thead><tr><th width="397">메서드 호출</th><th>결과 콜백</th></tr></thead><tbody><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveSnapshotData</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSnapshotDataFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSnapshotDataSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveAddData</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveAddDataAck</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveRemoveData</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveRemoveDataAck</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveSetValueIf</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSetValueIfFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveSetValueIfSuccess</td></tr><tr><td>Proud.CDbCacheClient2.RequestNonExclusiveModifyValue</td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveModifyValueFailed</td></tr><tr><td></td><td>Proud.IDbCacheClientDelegate2.OnNonExclusiveModifyValueSuccess</td></tr></tbody></table>

비독점적 데이터 변경을 성공하면 해당 데이터의 변경사항이 독점적 로딩했던 DB cache client 에 신고됩니다. 신고를 위해 아래의 메서드가 콜백됩니다.

> * Proud.IDbCacheClientDelegate2.OnSomeoneAddData
> * Proud.IDbCacheClientDelegate2.OnSomeoneRemoveData
> * Proud.IDbCacheClientDelegate2.OnSomeoneModifyValue
> * Proud.IDbCacheClientDelegate2.OnSomeoneSetValue

쉽게 볼 수 있도록 각 요청과 응답 관계를 묶어 보면 다음과 같습니다.

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveSnapshotData</mark> : Snapshot 얻어오기

```cpp
// 응답:
IDbCacheClientDelegate2::OnNonExclusiveSnapshotDataSuccess (CCallbackArgs args)
IDbCacheClientDelegate2::OnNonExclusiveSnapshotDataFailed (CCallbackArgs args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveAddData</mark> : 데이터 추가하기

```cpp
// 응답:
IDbCacheClientDelegate2::OnNonExclusiveAddDataAck (CCallbackArgs args)
// 독점중인 DB Cache Client의 Callback Event:
IDbCacheClientDelegate2::OnSomeoneAddData(CCallbackArgs& args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveRemoveData</mark> : 데이터 제거하기

```cpp
// 응답:
IDbCacheClientDelegate2::OnNonExclusiveRemoveDataAck (CCallbackArgs args)
// 독점중인 DB Cache Client의 Callback Event:
IDbCacheClientDelegate2::OnSomeoneRemoveData (CCallbackArgs& args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveModifyValue</mark> : 데이터에 특정한 연산을 시킵니다.(+, -, \*, /)

```cpp
// 응답:
IDbCacheClientDelegate2::OnNonExclusiveModifyValueSuccess (CCallbackArgs args)
IDbCacheClientDelegate2::OnNonExclusiveModifyValueFailed (CCallbackArgs args)
// 독점중인 DB Cache Client의 Callback Event:
IDbCacheClientDelegate2::OnSomeoneModifyValue (CCallbackArgs& args)
```

<mark style="color:orange;">Proud.CDbCacheClient2.RequestNonExclusiveSetValueIf</mark> : 두 값을 비교하여 저장하도록요청합니다.

```cpp
// 응답:
IDbCacheClientDelegate2::OnNonExclusiveSetValueIfSuccess (CCallbackArgs args)
IDbCacheClientDelegate2::OnNonExclusiveSetValueIfFailed (CCallbackArgs args)
 
// 독점중인 DB Cache Client의 Callback Event:
IDbCacheClientDelegate2::OnSomeoneSetValue (CCallbackArgs& args)
```

## DB cache 사용 시 주의사항

일방형과 요청 응답형(독점 Data 요청 응답형 & Block형 & 비독점 데이터 접근) 혼용 시 주의사항입니다.

{% hint style="danger" %}

* 요청 응답형 메서드가 사용되는 동안 일방형 메서드를 사용하게 되면 <mark style="color:orange;">Proud.IDbCacheClientDelegate2.OnAccessError</mark> 가 콜백될 수 있습니다.&#x20;
* 변경한 Data에 대한 응답을 받지 못한 상태에서 일방형 메서드를 사용하게 되면 잘못된 Data가 들어갈 수 있습니다.
  {% endhint %}

***

## 활용

{% content-ref url="using/usage" %}
[usage](https://docs.proudnet.com/proudnet/proudnet/db_system/db_cache_ver2/using/usage)
{% endcontent-ref %}
