TIL - 2021.05.27 (Thu)

Youngwoo Lee·2021년 6월 27일
0

TIL

목록 보기
28/29
post-thumbnail

캐시란 무엇이고 어떤 역할일까?

개념

Caching은 저장한다는 뜻, 캐시는 임시 저장소라고 할 수 있다. 추상적인 개념으로 소프트웨어적, 하드웨어적으로 캐시를 구현할 수 있다

컴퓨터구조에서의 cache

  • CPU와 메인 메모리 사이의 속도 차이를 완충하기 위해서 중간에 메인 메모리의 데이터를 미리 복사해두는 임시적인 메모리

  • 디스크, GPU 등등 여러 곳에서 cache를 둠으로써 장치들 간의 속도 차이를 완충하고 있다

네트워크 환경에서의 cache(Web Cache, HTTP Cache)

  • 백엔드 리소스에 대한 로드와 네트워크 정체를 줄여 웹 사이트의 응답성을 향상시킬 수 있다



몇 가지 기준으로 캐시를 구분해볼까?

분류 기준 = (캐시를 활용하는 주체)

  • Client-side caching

    좁은 의미로 브라우저 캐싱이라고도 한다
    브라우저에 의해 만들어진 폴더에 서버로부터 받은 데이터를 저장한다
    다음에 부라우저를 켜면 서버로부터 데이터를 다시 받아오지 않고, 로컬의 해당 폴더에 있는 데이터를 활용한다

  • Server-side caching

  1. Client 에서 자주 들어오는 Request에 해당하는 정보를 매번 디스크로부터 가져오기에 부담이 되기에, Server 컴퓨터의 메모리에 Caching 해두는 방법이 있다

  2. 자주 들어오는 정보들만 저장하는 Cache Server를 운영할 수도 있다



분류 기준 (저장하는 공간)

  • 디스크 캐시 → 하드 디스크에 저장

    • 항상 가지고 있어야하는 데이터
    • 자주 업데이트 되지 않는 데이터
    • 큰 사이즈의 데이터
    • 예시: 브라우저 캐싱의 경우 파일시스템 상에 저장해서 활용
  • 메모리 캐시 → 메인 메모리에 저장

    • 임시적인 데이터

    • 자주 업데이트 되는 데이터

    • 작은 사이즈의 데이터

    • 예시: NSCache의 wrapper를 통해 NSCache인스턴스를 배열로 관리하는 경우



캐시는 클라이언트 서버 구분이 있나?

  • 물리적인 캐시와 SW 캐시로 구분 가능
  • SW에서의 캐시는 클라이언트-서버 캐시로 구분할 수 있을 것 같음
    - 캐시 서버를 활용하여 CDN 같은 서비스도 운용할 수 있다. CDN은 콘텐츠를 딜리버리 해주는 서버이다. 아주 먼 곳에 있는 파일을 매번 가져와야 한다면 네트워크 구간이 멀어서 실패율도 있고, 전송 속도가 느리고, 오래 걸릴 수 있다. 이를 자주 쓰는 파일들을 가까운 지역의 서버에 올려 놓는다. (서버와 서버 사이의 통신)

ex) 넷플릭스 중계 서버를 통해 데이터를 가져갈 수 있게 구현하기도 한다.

캐시는 어디에 저장할까?

힙 영역에 저장할 수 있다

근거: 공식 문서 내 discardContentIfPossible()
Called to discard the contents of the receiver if the value of the accessed counter is 0
-> 참조 횟수가 0이 되면 실행되는 함수가 있는 것으로 보아, 캐시가 참조되는 친구임을 유추할 수 있을 것이라고 예측함


캐시를 구현할 때 고려해야 하는 캐시 운용 정책에는 어떤 것들이 있을까?

일정한 URL을 써라

  • 같은 자원을 다른 URL로 서비스 하고 있다면 그 자원은 여러번 요청되고 저장될 것이다.

재사용하면 안되는 리소스는 캐시하지않게 하자

  • 민감한 데이터의 경우 no-store 설정을 해줘서 저장하지 않도록.

어떤 자원들이 중간 저장을 가능하게 할지 결정하라

  • 모든 사용자들에게 동일한 자원은 CDN(Content Delivery Network)이나 다른 중간 매개체들에게도 캐시할 수 있게 하는 좋은 후보다.

각 자원의 최적의 캐시 기간을 정해라

  • 다양한 자원은 각기 다른 신선도를 요구한다. 살펴보고 각각의 max-age를 적절히 선택하라.



iOS 환경에서 캐싱하는 방법에는 무엇무엇이 있을까?

NSCache.

Apple에서 제공되는 기능으로 캐싱과 관련될 때 사용된다. 데이터를 Key-Value로 저장하는 컬렉션으로 캐싱된 데이터가 너무 많은 메모리를 사용하면 시스템에서 자동으로 캐시된 메모리를 삭제해준다

  1. 이미지가 memory cache(NSCache) 에 있는지 한다.
    만약에 이미지가 없다면?

  2. disk cache(UserDefault 혹은 기기 Directory에 있는 file 형태)에서 확인하고
    있다면 memory cache에 추가해주고 다음에는 더 빨리 가져 올 수 있도록 할 수 있다
    만약 없다면?

  3. 서버 통신을 통해서 받은 URL로 이미지를 가져와야 한다
    이때 서버통신을 통해서 이미지를 가져왔으면 memory와 disk cache에 저장해줘야 캐시처리가 될 것이다



메모리 캐싱 :

  • NSCache를 구현하고,
private let imageCache = NSCache
  • 키 값으로 쓸 타입과 캐시에 넣을 타입을 정하면 된다. URL String 을 키 값으로 구분하고 image를 넣을 예정
imageCache.setObject(image, forKey: url.lastPathComponent as NSString)

Dictionary

  • key-value 값으로 이루어져있어서 메모리상에 cache가 가능함.
  • 하지만 단순한 Collection이기 때문에, 실제 운용에 있어서 설정해줘야하는 부분이 많을 것이다.

FileManager

디스크 캐싱 :

guard let path = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first else { 
	return 
}
profile
iOS Developer Student

0개의 댓글