[iOS/Swift] 캐시 충전하러 가자

Allie·2022년 1월 13일
68

지금까지 내가 알던 캐시

요런 방법으로다가 충전해서 헤네시스에서 갑부의 삶을 살았었다ㅋ
(초3때 핸드폰으로 40만원 충전하다가 쫒겨난 적 있음)

암튼 오늘은 캐시와 캐싱에 대해 알아보자.

다음에 알아보자..


다음에 알아보려고 했는데 열화와 같은 성원에 힘입어 이어 씁니다.. 멋쓱..


캐시❓

컴퓨터의 성능을 향상시기기 위해 사용되는 메모리. 주기억장치와 CPU 사이에 위치하고, 반복적으로 사용하는 데이터를 저장해놨다가 빠르게 불러올 수 있도록 하는 것이다.

넥슨에선 반복적으로 지르는게 캐시였는데.. 충전 못하겠네 이거..

캐싱❓

이 캐시 영역으로 데이터를 가져와서 접근하는 방식, 다른 의미로는 메모리 상에 있는 데이터를 연산하는데, 이 연산을 더 빠른 CPU 메모리 영역으로 가져와서 처리를 수행하는 것도 캐싱한다고 표현한다. 미리 복사해논 데이터에 접근하는 것이기 때문에 어플리케이션의 처리 속도를 높여준다.


💵 캐시를 구분하는 기준

- 캐시는 클라이언트 서버 구분이 있나? 
	- Client-side caching
    - Server-side caching
- 캐시는 어디에 저장할까?
	- Disk Cache (하드 디스크에 저장)
    - Memory Cache (메인 메모리에 저장)
- 또 다른 기준이 있나?

Memory Cache

메모리 캐시는 어플리케이션 메모리 영역의 일정 부분을 캐싱에 사용한다.
어플리케이션을 종료해 메모리에서 해제되면 저장된 내용이 비워진다. (들어가. 쓰레기통 🗑🗑)
Swift에서는 캐시기능을 지원하는데, NSCache라는 것을 사용해서 구현할 수 있다.

Disk Cache

디스크 캐시는 FileManager이용 데이터를 파일형태로 디스크에 저장한다.
기기안에 저장되어있어 어플리케이션을 껐다가 켜도 저장된 내용이 남아있다.

ex) 디스크 캐시의 예시를 찾아보면 카카오톡이 가장 많이 나오는데, 친구들이 보내는 사진, 동영상들을 보려면 저장은 안해도 다운로드를 받아야 볼 수 있다. 이렇게 다운로드를 받은 사진과 동영상 파일들이 캐시에 포함되고 용량이 커지면 저장공간 관리를 보면 저장된 캐시 데이터를 삭제해서 공간을 확보할 수 있다. 한번씩 야무지게 비워주자.. 👌🏻👌🏻


NSCache❓

NSCache는 위에서 말했듯이 iOS에서 메모리 캐싱에 주로 사용된다.

공식문서의 정의를 보면,
리소스가 부족할 때 제거될 key-value 쌍을 임시로 저장하는데 사용하는 가변 컬렉션입니다. 라는데 이게 몬말이냐❓ㅎ 시스템 메모리 많이 차지하면 처형대상이라는 말인듯,, 각박한 세상ㅠ

추가적으로 Cache 객체와 다른 가변 컬렉션과 다른점에 대해서도 나와있다.

  • NSCache 클래스는 캐시가 시스템 메모리를 너무 많이 사용하지 않도록 하는 자동 제거 정책이 있다. 다른 어플리케이션에서 메모리가 필요한 경우 이러한 정책은 캐시에서 일부 항목을 제거하여 메모리 사용 공간을 최소화한다.
  • 캐시를 직접 lock하지 않고도 다른 스레드에서 캐시의 항목을 추가, 삭제 및 쿼리할 수 있다. (thread-safe라고 함니다)
  • NSMutableDictionary 객체와 달리 캐시는 캐시에 저장된 키 개체를 복사하지 않는다.

✔️ 결론적으로 생성하는데 비용이 많이드는 임시 데이터를 저장할 때 NSCache를 사용한다고 한다. 이러한 객체를 재사용함으로써 해당 값을 다시 계산할 필요가 없기 때문에 성능상의 이점을 얻을 수 있다.

(근데 위에 나와있듯이 메모리가 부족할 때는 삭제될 수 있고, 삭제된 후에는 필요할 때 다시 계산되어야한다.)

NSCache를 이용한 image caching

곧 추가할게욘,, 넘 졸려,,

class ImageCacheManager {
    static let shared = NSCache<NSString, UIImage>()
    
    init() { }
}
extension UIImageView {
    func loadImage(from imageUrl: String) {
        let cacheKey = NSString(string: imageUrl)
        if let cachedImage = ImageCacheManager.shared.object(forKey: cacheKey) {
        self.image = cachedImage
        return
        }
        
        guard let url = URL(string: url) else { return }
        
        URLSession.shared.dataTask(with: url) { data, response, error in 
        	guard error == nil else {
                return
            }
            
            guard let data = data else {
                return
            }

            DispatchQueue.main.async {
                guard let image = UIImage(data: data) else {
                    return
                }
                
                imageCache.setObject(image, forKey: cacheKey)
                completion(image)
            }
        }.resume()
    }
}

ㄴr의 ㅋH싱 정책?으로 ㅁr무ㄹi...

처음에 메모리에서 확인하고, 있으면 꺼내오고 없으면 디스크에서 찾아유. 근데 저장된게 있다? 그럼 메모리에 NSCache로 등록하고 없으면 다운로드 해버림니다. 다운받고 나서 메모리랑 디스크에 둘다 저장 ㄱㄱ!
그래야 나중에 메모리에서 삭제되면 디스크에서 찾을 수 있기때문 임니다.

profile
게발자🦀 되는 중.. 궁김하다.. 궁김해..

37개의 댓글

comment-user-thumbnail
2022년 1월 14일

????

답글 달기
comment-user-thumbnail
2022년 1월 14일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 14일

다음에 알아보면 알려주세요 ..

답글 달기
comment-user-thumbnail
2022년 1월 14일

????????????

답글 달기
comment-user-thumbnail
2022년 1월 14일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 15일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 나중에 꼭 알려줘요

답글 달기
comment-user-thumbnail
2022년 1월 15일

파워 엘릭서 하나만 나눔해주세요

답글 달기
comment-user-thumbnail
2022년 1월 16일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 꼭 알려주세요 ㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 16일

너무 기대됩니다...

답글 달기
comment-user-thumbnail
2022년 1월 16일

얼른 추가해주세요 Allie님😂😂😂😂
API도...

답글 달기
comment-user-thumbnail
2022년 1월 16일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 17일

아무튼 서론이 제일 중요합니다

답글 달기
comment-user-thumbnail
2022년 1월 17일

ㅋㅋㅋㅋㅋ 졸렸는데 졸음이 사라졌어요

답글 달기
comment-user-thumbnail
2022년 1월 17일

선생님... 엠넷도 이러진않아요 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

답글 달기
comment-user-thumbnail
2022년 1월 17일

ㄹㅇ ㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 17일

zzzzzzzzzzzzzzzzzzzzzzzzz

답글 달기
comment-user-thumbnail
2022년 1월 17일

빨리 캐시 충전해주세요 !!

답글 달기
comment-user-thumbnail
2022년 1월 18일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 18일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 18일

덕분에 어려운 케시의 게념에 대해 이해하게 되었습니다. 감사합니다. 😃

답글 달기
comment-user-thumbnail
2022년 1월 18일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 18일

ㅋㅋㅋㅋㅋ 꼭 이어서 써주세요!!

답글 달기
comment-user-thumbnail
2022년 1월 18일

이러니 개콘이 망하져...

답글 달기
comment-user-thumbnail
2022년 1월 19일

댓글 처음 달아보네요
너무 궁금합니다.

답글 달기
comment-user-thumbnail
2022년 1월 19일

엥?

답글 달기
comment-user-thumbnail
2022년 1월 19일

빵터졌넼ㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 20일

너무 궁금한데 제발 알려주세요

답글 달기
comment-user-thumbnail
2022년 1월 20일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 20일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 20일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 21일

헤네시스 출신 금수저면 다음에 알아봐도 되지요,,, 암요,,,

답글 달기
comment-user-thumbnail
2022년 1월 22일

??? ㅋㅋㅋㅋㅋㅋㅋ 글은 이렇게 쓰는건가.. 배워갑니다

답글 달기
comment-user-thumbnail
2022년 1월 22일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 22일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 1월 23일

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ포스팅 잘 보고 갑니다!!! 정말 재치있으시네요!

답글 달기
comment-user-thumbnail
2022년 2월 11일

다음편 기대합니다...ㅋㅋㅋ

답글 달기
comment-user-thumbnail
2022년 2월 16일

드디어 완결이 나왔군요. 다음 시즌 기대하고 있습니다.

답글 달기