Engineering
Unity 네트워크 성능을 2배 빠르게 하는 웹 캐시! 쉽게 사용하기
2023년 2월 6일
원문에서 보기 ↗
웹 캐시를 이용해 성능 향상하기
웹 캐시를 사용하면 네트워크 통신 성능을 크게 향상시킬 수 있습니다.
웹 캐시는 네트워크 통신을 할 때 HTTP 기반으로 콘텐츠를 저장하고 재사용하는 것입니다. 이때 HTTP 헤더에 검증 필드를 전송하고 수정되지 않은 경우에는 응답에 콘텐츠를 포함하지 않기 때문에 전송 속도가 크게 향상됩니다.

- UnityWebrequest: 28ms
- WebCache: 14ms
- Local: 1ms
위 그림에서 웹 캐시를 사용했을 때 일반적인 통신보다 2배 정도 빨라진 것을 확인할 수 있습니다.
웹 캐시를 쓰면 관리가 간편해진다.
웹 캐시의 또 다른 장점은 관리 포인트가 URL 하나로 일원화된다는 것입니다.
로컬에 저장된 콘텐츠를 읽는 경우 속도는 매우 빠르지만 이것이 최신 데이터인지 알 수 없습니다. 이를 보완하기 위해 통신 후 버전이 달라졌을 때 업데이트하는 버전 관리나, URL 변경으로 연결 지점을 변경해 새로운 것을 받게 하는 방법을 많이 사용하는데요. 이런 방식은 콘텐츠와 버전 또는 연결 지점을 동시에 업데이트해야 하는 번거로움이 있습니다.

- 버전 관리
- 버전과 콘텐츠를 동시에 업데이트하고 재사용
- URL 변경
- 콘텐츠를 다운로드하고 재사용, URL 변경 시 해당 콘텐츠를 다운로드하여 재사용
- 웹 캐시
- 네트워크 자체 검증하고 동일한 URL로 해당 콘텐츠를 다운로드하여 재사용
웹 캐시는 일반적인 통신과 동일하게 동일한 url로 최신 콘텐츠인지 검증하며 재사용할 수 있어 관리가 간편해집니다.
네트워크 통신을 이용하는 다양한 분야에 활용
네트워크 통신을 하는 대부분의 분야에 사용할 수 있습니다. 개별 URL로 검증하는 만큼 이벤트 배너 다운로드와 같은 단독 콘텐츠에 더 적합합니다. URL이 일원화되는 특성을 이용하면 YouTube나 SNS에 사용자가 업데이트한 콘텐츠도 빠른 성능을 보장할 수 있습니다.
웹 캐시를 써 보자
웹 캐시는 Unity에서 지원하지 않기 때문에 HTTP 방식으로 직접 구현해야 합니다. 통신을 할 때 필드에서 ETag와 Last-Modified를 받아 와 저장하고 다시 전송하여 검증하는 방식으로 구현합니다.
-
웹 데이터를 받아 와 캐시를 저장합니다.

-
저장된 ETag, Last-Modified를 전송해 재검증합니다.

이러한 캐싱 스펙은 RFC 표준 문서(Http Caching)에 정의되어 있습니다.
좀 더 자세한 내용은 NHN FORWARD 2022에서 발표한 내용을 참고해 주세요. 👉 [NHN Forward 2022] Unity에서 Web Cache와 성능 향상: CacheStorage의 활용 바로 가기
CacheStorage로 웹 캐시를 쉽게 쓰자
웹 캐시를 직접 구현하면 HTTP로 연동하고 캐시를 관리하는 것 외에도 해야 할 작업이 많습니다. CacheStorage를 활용하면 웹 캐시를 쉽게 사용할 수 있습니다. 무료로 사용할 수 있어 부담도 없습니다.
설치
CacheStorage는 Game Package Manager를 통해 NHN에서 제공하는 서비스입니다. Game Package Manager는 게임을 개발할 때 사용할 수 있는 다양한 서비스를 무료로 제공하고 있습니다.
AssetStore에서 Game Package Manager를 내려받은 후 CacheStorage 서비스를 설치해 사용합니다.
- Game Package Manger 설치 | AssetStore
- 실행: Unity Menu > Tools > GPM > Manager | 가이드
- 서비스 설치: CacheStorage

코드
CacheStorage로 웹 캐시를 쓴다면 아래와 같이 쉽게 사용할 수 있습니다. 좀 더 자세한 사용법은 가이드를 참조해 주세요.
// Request
GpmCacheStorage.Request(url, OnResult);
// Result
void OnResult(GpmCacheResult result)
{
if (result.IsSuccess() == true)
{
byte[] data = result.Data;
string text = result.Text;
}
}
웹 캐시를 더욱 효율적으로 사용하자
웹 캐시를 사용하면 일반 요청보다 속도가 2배 정도 빠릅니다. 로컬에서 불러오는 것은 훨씬 빠르지만 최신 상태 여부를 확인할 수 없습니다.
이러한 특징은 무결성 과 성능으로 아래와 같이 정리할 수 있습니다.

검증 전략
성능과 무결성이 다른 특징을 활용해 전략을 달리하여 더욱 효율적으로 웹 캐시를 사용할 수 있습니다.
보안이 중요하거나 지속적인 갱신이 필요할 경우는 일반적인 네트워크 통신을 이용해 무결성을 보장합니다. 그 외에는 로컬에서 읽을 때 더욱 빠른 점을 이용해 필요할 때 검증하여 웹 캐시의 성능을 극대화할 수 있습니다.
CacheStorage에서는 아래와 같이 4가지 검증 전략을 지원하고 있습니다.
- ALWAYS
- 항상 서버에 캐시 검증을 요청합니다. 빠르면서 무결성이 보장됩니다.
- FIRSTPLAY
- 캐시의 유효 기간이 지나면 재검증합니다.
- 앱이 종료된 후 다시 실행했을 때 불러오는 캐시는 서버에 검증을 요청합니다.
- ONCE
- 캐시의 유효 기간이 지나면 재검증합니다.
- LOCAL
- 캐시를 검증하지 않고 파일에서 바로 읽습니다.

웹 요청은 UnityWebRequest로 사용하고 별다른 전략 없이 웹 캐시를 사용할 때에는 ALWAYS를 사용하면 됩니다.
앱을 처음 실행할 때 불러오는 콘텐츠가 최신 상태로 검증되길 원한다면 FIRSTPLAY를 사용하면 됩니다. 처음 불러오는 콘텐츠들은 Always처럼 항상 재검증합니다. 앱이 종료되고 다시 실행시키면 다시 검증하기 때문에 첫 실행 시 최신 상태를 유지할 수 있습니다.
각각의 캐시 데이터에는 유효기간이 있습니다. 유효기간이 12시간이라면 이 시간이 지나면 재검증이 필요합니다. 유효 기간이 남아 있는 동안 Local에서 불러와 빠르게 더욱 빠르게 읽을 수 있습니다. FIRSTPLAY 와 ONCE는 실행되는 동안에는 유효 기간이 남아있는 동안 Local에서 불러와 빠르게 동작합니다.
ONCE는 다른 조건 없이 한번 불러온 후 유효 기간 동안 계속 Local에서 불러옵니다. 유효 기간이 12시간이라면 이 시간 동안 Local에서 불러오고 다시 검증합니다.
LOCAL은 특수한 경우에 사용합니다. 무조건 Local에서 불러오며 저장된 캐시가 없으면 불러오지 않습니다. Local에서만 부르는 만큼 속도가 매우 빠르기 때문에 기존 데이터를 미리 불러올 때 사용하면 좋습니다. 예를 들면 이미지 아이콘을 불러온다고 했을 때 웹에서 요청하면 그만큼 지연이 발생하기 때문에 아이콘 이미지가 뜨지 않습니다. 이럴 때 Local로 저장된 아이콘을 불러와 설정 후 다시 웹에서 검증하고 불러오면 사용자는 빠르게 아이콘을 볼 수 있습니다.
시간 제어
이러한 검증 전략은 시간 제어와 함께 사용하면 더욱 효율적입니다.
기본적으로 캐시의 유효 기간은 서버의 데이터를 중심으로 합니다. 그 전에는 웹 통신하기 전까지 이 유효 기간은 갱신되지 않습니다.
그러나 콘텐츠의 중요도에 따라 더 자주 검증해야 할 때가 있습니다. 우리는 클라이언트에서 캐시를 사용하는 만큼 콘텐츠에 따라 검증 시간을 제어할 수 있습니다. 콘텐츠에 따라 시간 제어를 두면 검증 전략을 더욱 공격적으로 짤 수 있습니다.

예시를 들어 보면 ONCE 전략을 사용하면 유효 기간 전 검증을 하지 않기에 성능이 빠릅니다. 그러나 서버의 유효 기간을 사용하는 만큼 언제 재검증될지 알 수 없습니다. 빠르게 바뀌지는 않지만 어느 정도 주기로 갱신되는 콘텐츠를 처리하기에 검증 전략만으로는 한계가 있습니다.
이때 시간 제어를 통해 30분마다 다시 검증하도록 해 봅시다. 그러면 30분마다 재검증을 하는 만큼 30분 마다의 무결성도 보장하게 됩니다. 빠른 성능을 유지하면서 무결성이 좋아지는 두 마리의 토끼를 잡을 수 있는 것입니다.
검증 전략과 시간 제어를 콘텐츠에 따라 적절히 사용하면 할수록 성능과 무결성이 좋아지게 될 것입니다.
코드
CacheStorage에서는 검증 전략과 시간 제어를 Request 함수 파라미터를 통해 간단히 적용할 수 있습니다. 파라미터로 포함하지 않았을 때의 기본값도 설정 가능합니다. 자세한 것은 가이드를 참고해 주세요.
CacheRequestType requestType = CacheRequestType.FIRSTPLAY; // 검증 전략
double reRequestTime = 60; // 시간 제어(초)
// Request
GpmCacheStorage.Request(url, OnResult);
GpmCacheStorage.Request(url, requestType, OnResult);
GpmCacheStorage.Request(url, requestType, reRequestTime, OnResult);
용량 제어
캐시를 재사용하기 위해서는 우선 저장해야 합니다. 캐시가 저장될 때마다 용량이 점점 쌓이게 되는 것이죠. CacheStorage에서는 캐시 용량을 쉽게 제어할 수 있습니다.
캐시 저장되는 개수, 용량의 한계를 설정하면 내부에서 잘 사용하지 않는 캐시 위주로 자동으로 제거됩니다. 이 외에 실시간 삭제 및 삭제 주기도 설정할 수 있습니다. 자세한 것은 가이드를 참고해 주세요.
long maxSize = 10 * 1024 * 1024; // 10 MB
bool applyStorage = true; // 저장소 적용(자동 삭제)
GpmCacheStorage.SetMaxSize(maxSize, applyStorage);
int maxCount = 50000;
bool applyStorage = true; // 저장소 적용(자동 삭제)
GpmCacheStorage.SetMaxCount(maxCount, applyStorage);
정리
웹 캐시를 사용하여 네트워크 성능을 향상시킬 수 있습니다. CacheStorage를 통해 웹 캐시를 쉽게 사용할 수 있고, 적절한 검증 전략과 시간 제어를 통해 성능을 극대화할 수 있습니다.
GPM CacheStorage 공식 문서: https://github.com/nhn/gpm.unity/tree/main/docs/CacheStorage
추가 제안이나 문의, 이슈 발생 시 아래로 연락해 문제를 해결할 수 있습니다.
- Email: dl_gpm_help@nhn.com
- Github issue URL: https://github.com/nhn/gpm.unity/issues