# RCR - 캐싱 메커니즘

> Understand caching for Remote Config Runtime.

Remote Config 런타임에서는 다음과 같이 작동하는 캐싱 메커니즘을 사용합니다.

* RCR이 디스크에 있는 캐시 파일에서 최근 저장된 구성을 성공적으로 읽으면 해당 구성이 적용됩니다.
* 앱이 처음으로 연결되고 캐시 파일이 없으면 RCR은 각 변수 유형(int의 경우 0, 문자열의 경우 "" 등)에 기본값을 적용합니다.
* PCR에서 성공적으로 요청을 생성하면 이전에 적용된 캐싱된 구성을 오버라이드합니다.
* 최근 수신된 구성은 캐시 파일의 값도 오버라이드합니다.
* 이 메커니즘은 모든 플랫폼에 적용되며, 콘솔용 디스크에 기록하려면 특별한 플랫폼 권한이 필요하므로 콘솔은 제외됩니다.

## 캐시 파일 위치##cache-file-location

캐시 파일은 `Application.persistentDataPath/{YourApp}/RemoteConfigCache.json`에 있으며 [persistentDataPath docs](https://docs.unity3d.com/ScriptReference/Application-persistentDataPath.html)에 명시된 대로 플랫폼에 따라 다릅니다.

예컨대 Mac의 경우 캐시 파일은 **/Users/YourName/Library/Application Support/DefaultCompany/\{YourApp}/RemoteConfigCache.json**에서 확인할 수 있습니다.

캐시 파일의 콘텐츠 예시:

```json
{
    "settings": {
        "requestOrigin": 2,
        "status": 2,
        "body": {
            "configs": {
                "settings": {
                    "rotateY": 30.0,
                    "rotSpeed": 44.0,
                    "swordName": "Singing Sword",
                    "rotateZ": 4.0,
                    "jsonCubeCustom": {
                        "rotateX": 20,
                        "color": {
                            "r": 0.2,
                            "g": 0.2,
                            "b": 0.3,
                            "a": 1
                        }
                    },
                    "swordPrice": 5,
                    "testdateString": "2021-10-21T10:00:00.0000001-07:00",
                    "rotateX": 777.0
                }
            },
            "metadata": {
                "assignmentId": "355faf1d-9ce0-4528-9267-95ffe07ed891",
                "environmentId": "11daa94d-0ffa-41e2-8579-f4acbbdb3987",
                "bundle": "657abf6ee46c9dc227581a7adba48bca89dfb620"
            }
        },
        "headers": {
            "Date": "Mon, 15 Nov 2021 17:44:08 GMT",
            "Content-Type": "application/json;charset=utf-8",
            "Access-Control-Allow-Origin": "\*",
            "Content-Length": "429",
            "Server": "Jetty(9.4.z-SNAPSHOT)",
            "Via": "1.1 google",
            "Alt-Svc": "clear",
            "Connection": "keep-alive"
        }
    }
}
```

## 캐싱 시나리오##caching-scenarios

캐싱 메커니즘 내에서 `requestOrigin` 및 `status`라는 두 가지 값을 유지 관리하며, 이를 사용해 캐싱 시나리오를 파악할 수 있습니다.

이 값은 `configResponse` 변수에서 액세스할 수 있습니다. 예컨대 콜백 내에서 requestOrigin을 어떻게 활용하는지 다음 예시에서 확인해 보십시오.

```c#
void ApplyRemoteSettings (ConfigResponse configResponse) {
        // Conditionally update settings, depending on the response's origin:
        switch (configResponse.requestOrigin) {
            case ConfigOrigin.Default:
                Debug.Log ("No settings loaded this session; using default values.");
                break;
            case ConfigOrigin.Cached:
                Debug.Log ("No settings loaded this session; using cached values from a previous session.");
                break;
            case ConfigOrigin.Remote:
                Debug.Log ("New settings loaded this session; update values accordingly.");
                break;
        }
    }
```

requestOrigin에 가능한 값: `{0:Default, 1:Cached, 2:Remote}`

상태에 가능한 값: `{0:None, 1:Failed, 2:Success, 3:Pending}`

이러한 값을 토대로 다음 캐싱 시나리오를 파악합니다.

1. 사용자가 이전에 연결한 적이 없고 지금도 연결되어 있지 않으면 기본값이 적용됩니다.
2. 사용자가 이전에 연결한 적이 없지만 지금 연결되어 있으면 원격 값을 적용하고 로컬 디스크의 캐시에 기록합니다.
3. 사용자가 최소 한 번 이상 연결되었지만 지금은 연결되어 있지 않으면 캐싱된 값이 적용됩니다.
4. 사용자가 최소 한 번 이상 연결되었고 지금도 연결되어 있으면 캐싱된 값을 덮어쓰므로 원격 값이 적용됩니다.

해당 시나리오를 표에 정리하면 다음과 같습니다.

| 시나리오 | 과거 연결 여부 | 현재 연결 여부 | CacheFile | 출처      | 상태      |
| ---- | -------- | -------- | --------- | ------- | ------- |
| 1    | 아니요      | 아니요      | 없음        | Default | Failed  |
| 2    | 아니요      | 예        | 예         | Remote  | Success |
| 3    | 예        | 아니요      | 예         | Cached  | Failed  |
| 4    | 예        | 예        | 예         | Remote  | Success |
