# 7월 21일 학습 활동
## 🧏♂️ iOS의 캐싱에 대해서 알아봅시다.
### 1) NSCache와 URLCache는 어떤 차이가 있나요?
- **NSCache**
- 로컬에서 사용하는 캐시방법
- 다른 응용 프로그램에서 메모리가 필요한 경우 이러한 자동 제거 정책은 캐시에서 일부 항목을 제거하여 메모리 사용 공간을 최소화
- **URLCache**
- 클라이언트의 요청에 의해서 맵핑되는 캐시
- 캐시 운용 정책이 존재함
- **차이점**
- NSCache는 자동 제거 기능이 있지만, URLCache는 이러한 기능이 없어서 디스크 공간이 부족해질 때까지 캐시된 데이터를 유지함
<br>
### 2) 메모리 캐싱과 디스크 캐싱의 차이는 무엇일까요?
- 1) RAM 메모리
- 임시적인 데이터
- 자주 업데이트 되는 데이터
- 작은 사이즈의 데이터
- 2) 디스크 캐시
- 항상 가지고 있어야하는 데이터
- 자주 업데이트 되지 않는 데이터
- 큰 사이즈의 데이터
>
[참고 - GitHub](https://github.com/FE-Lex-Kim/-TIL/blob/master/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EC%BA%90%EC%8B%9C%2C%20%EB%94%94%EC%8A%A4%ED%81%AC%20%EC%BA%90%EC%8B%9C.md)
<br>
### 3) URLCache의 기본 캐시 정책은 무엇일까요?
- case allowed
- URLCache제한 없이 보관 이 가능합니다.
- case allowedInMemoryOnly
- 저장 URLCache이 허용됩니다. 그러나 스토리지는 메모리로만 제한되어야 합니다.
- case notAllowed
- URLCache메모리나 디스크에 저장하는 것은 어떤 방식으로도 허용되지 않습니다.

### 4) URLRequest에서도 캐싱에 대한 설정을 해줄 수 있답니다. URLRequest의 기본 캐시 정책은 무엇인가요?
- URL 로드 요청에 대한 기본 정책
- 1) 요청에 대해 캐시된 응답이 없으면 URL 로딩 시스템은 원래 소스에서 데이터를 가져옵니다.
- 2) 요청에 대해 캐시된 응답이있고 그 응답이 매번 유효성을 다시 확인해야 한다고 표시하지 않고, 오래되지 않은 경우(만료 날짜가 지나지 않은 경우) URL 로딩 시스템은 캐시된 응답을 반환합니다.
- 3) 캐시된 응답이 오래되었거나 재검증이 필요한 경우 URL 로딩 시스템은 리소스가 변경되었는지 확인하기 위해 원본 소스에 HEAD 요청을 보냅니다.
- 4) 만약 변경이 됐으면 URL 로딩 시스템은 원본 소스에서 데이터를 가져옵니다. 변경이 안됐으면 캐시된 응답을 반환합니다.

[URLCache - 기본정책?](https://developer.apple.com/documentation/foundation/nsurlrequest/cachepolicy/useprotocolcachepolicy)
<br>
### 5) 캐시를 구현할 때 고려해야하는 캐시 운용 정책에는 어떤 것들이 있을까요?
1) 보안성 (캐시 접근 및 저장 관련)
2) 데이터 수명
3) 캐시 교체 정책 (Cache Replacement Policy)
- 데이터 사용시간에 따른 교체 (사용시간 작은것 부터..)
- LRU, FIFO, LFU 구조에 따라 교체
- Random, NUR, Optimal 등등...
4) 저장하는 시점에 따른 정책
- Write Through: 쓰기 요청 시 즉시 저장
- Write Back: 쓰기 요청 시 캐시에서만 이뤄지고 바로 저장되지 않고 추후 캐시에서 해당 사항이 끝날때 최종으로 한번에 변경사항 저장
[참고](https://green1229.tistory.com/57)