TIL(Today I Learned)

2월 4일(목)

학습내용

  • 캐시란?
    • 자주 사용하는 데이터가 더 빨리 로드될수 있도록 미리 복사해놓는 임시 저장소.
    • 다양한 분야에서 사용되는 개념이며, 분야마다 약간의 의미차이가 있을 수 있다.
    • 캐시를 구분하는 기준은 어디에 저장하냐에 따라 구분할 수 있다. (디스크 캐시, 메모리 캐시)
    • 캐시 정책: 어떤 데이터를 삭제하고, 어떤 데이터를 유지할 것인가?
    • 서버가 캐시를 하는 것처럼 클라이언트도 캐시를 할 수 있다. 웹브라우저가 웹페이지를 캐싱하는 것처럼 앱도 데이터를 캐시해 둘 수 있다. 웹브라우저는 사용자가 직접 새로고침할 수 있지만, 앱은 보통 직접 새로고침 기능이 포함되지 않으므로 서버에서 갱신된 데이터를 로컬에서 어떻게 반영할지를 주의해야한다.
  • 캐시 데이터 중 바뀐 데이터만 요청하는 방법
    • 데이터의 메타데이터를 서버한테 받아와서 비교해보고, 메타데이터가 다르면 다시 데이터를 서버에 요청해서 받아온다.
  • 프록시 서버는 클라이언트와 서버사이의 중간서버이며, 서버의 일을 대신하여 서버의 부하를 줄여주는 서버이다.
  • iOS에서 캐시를 구현하는 방법
    • 메모리 캐시는 NSCashe, 디스크 캐시는 FileManager를 이용한다.
    • Linked list와 Dictionary를 이용하여 LRU Cache를 구현한다.

문제점/고민한점

  1. 프록시 패턴이란?
  2. 서버에 메타데이터를 요청하는 방법은?
  3. NSCashe는 메모리 캐시만 가능한가?

해결방법

  1. 프록시 패턴은 모듈의 인터페이스를 대신하는 Wrapper를 구현하여 기능이나 로직을 추가하는 패턴이다. 삼성전자의 저가형 A시리즈 스마트폰은 중국제조사에서 만든 스마트폰을 택갈이(?)를 해서 사후 서비스만 제공하는 식으로 판매를 하는데, 모듈(중국 제조사 핸드폰)의 Wrapper(삼성전자라는 브랜드)를 구현하여 기능을 추가(삼성전자 애프터 서비스)하는 것이 프록시 패턴과 유사해 보인다.
  2. HTTP Method중 HEAD를 이용하여 Response Header만 서버에서 받을 수 있다. HEAD 요청으로 Response Header를 받고, Response Header의 Last-Modified field값을 캐시 데이터의 Last-Modified 값과 비교하여 다시 서버에 요청하면 될 것 같다. 만약 두 값이 다르면 최근에 수정된 것이므로 GET이나 POST로 서버에 Response Body를 요청하면 될 것 같다. 이렇게 하면 클라이언트에서 Last-Modified 값을 갖고 있도록 구현해야한다는 단점이 있다.
  3. NSCache의 Apple 공식문서에 “You typically use NSCache objects to temporarily store objects with transient data that are expensive to create.” 라고 나와있는걸로 봐서, 메모리 캐시만 가능하다고 판단하였다.

참고