์บ์?
- ์บ์๋
๋ฐ์ดํฐ๋ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ณต์ฌํด ๋๋ ์์ ์ฅ์
๋ฅผ ๊ฐ๋ฆฌํจ๋ค.- ์บ์๋ ์ ๊ทผ์๊ฐ์ ๋นํด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ๋ ๊ฐ์ ๋ค์ ๊ณ์ฐํ๋ ์๊ฐ์ ์ ์ฝํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
- ์บ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ณต์ฌํด๋๋ฉด ์ ๊ทผ ์๊ฐ ์์ด ๋ ๋น ๋ฅธ ์๋๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋ค.
- ์บ์ฑ์ ์ฌ์ฉํ๋ฉด ์ด์ ์ ๊ฒ์ํ๊ฑฐ๋ ๊ณ์ฐํ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์๋ค.
์บ์ฑ์ ์ด๋ป๊ฒ ์๋ํ ๊น?
- ์บ์์ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก RAM๊ณผ ๊ฐ์ด ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ ํ๋์จ์ด์ ์ ์ฅ๋๋ค.
- ์ํํธ์จ์ด ๊ตฌ์ฑ ์์์ ํจ๊ป ์ฌ์ฉ๋ ์ ๋ ์๋ค.
- ์บ์์ ์ฃผ ๋ชฉ์ ์
๋ ๋๋ฆฐ ๊ธฐ๋ณธ ์คํ ๋ฆฌ์ง ๊ณ์ธต์ ์ ๊ทผํด์ผํ๋ ํ์๋ฅผ ์ค์ฌ์ ๋ฐ์ดํฐ ๊ฒ์์ ์ฑ๋ฅ์ ๋์ด๋ ๊ฒ
์ด๋ค. - ์๋๋ฅผ ์ํด ์ฉ๋์ ์ ์ถฉํ๋ ์บ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ์ ํ์ ์งํฉ์ ์ผ์์ ์ผ๋ก ์ ์ฅํ๋ค.
- ๋ณดํต ์์ ํ๊ณ ์๊ตฌ์ ์ธ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์กฐ์ ์ด๋ค.
IOS์์์ Cache
1๏ธโฃ Memory Cache
- IOS์์ ์์ฒด์ ์ผ๋ก ์ ๊ณตํด์ฃผ๋ ์บ์
- App์ ๋๋ฉด ์บ์์ ์ ์ฅ๋ ๋ด์ฉ์ด ์ฌ๋ผ์ง
- NSCache๋ฅผ ํตํด์ ๊ฐ๋ฅ
- ์ฒ๋ฆฌ์๋๊ฐ ๋น ๋ฅด์ง๋ง ์ ์ฅ ๊ณต๊ฐ์ด ์๋ค.
2๏ธโฃ Disk Cache
- ์บ์์ ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๊ธฐ ๋ด๋ถ์ ์์นด์ด๋น ํ๋ ๋ฐฉ์์ผ๋ก App์ ๊ป๋ค๊ฐ ์ผ๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง์ง ์๊ณ ๋จ์์๋ค.
FileManager
๋ฅผ ํตํด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.- App์ ์ญ์ ํ ๋ ์บ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ฒ ๋ง๋ค ์๋ ์๊ณ , ๊ทธ๋ ์ง ์๊ณ ๊ณ์ ๋จ์์๊ฒ ๋ง๋ค ์๋ ์๋ค.
UserDefault
๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ๊ฒ ์ ์ฅํ๋ฉด, App ์ญ์ ์ ๋ฐ์ดํฐ๋ ๊ฐ์ด ์ญ์ ๋๋ค.- ํ์ผ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๋ฉด, App์ด ์ญ์ ๋์ด๋ ์บ์๊ฐ ๋จ์์๊ฒ ๋๋ค. (๋ณดํต ํ์ผ ๊ฒฝ๋ก์ ์ด๋ฏธ์ง ์ ์ฅ)
- ์ ์ฅ๊ณต๊ฐ์ ๋น๊ต์ ํฌ์ง๋ง, ํ์ผ ์ ์ถ๋ ฅ์ผ๋ก ์ธํด ์ฒ๋ฆฌ์๋๊ฐ ๋ฉ๋ชจ๋ฆฌ ์บ์๋ณด๋ค ๋๋ฆฌ๋ค.
- ์์ : ์นด์นด์คํก์์ ์ด๋ฏธ์ง๋ ๋์์์ ๋๋ฐ์ด์ค์ ์ ์ฅํ์ง ์๊ณ ๋์ผ๋ก ๋ณด๊ธฐ ์ํด ๋ค์ด ๋ฐ์ ๊ฒฝ์ฐ, Disk์์ Caching ๋์ด ์ฑ์ ์ข ๋ฃํ๋ค๊ฐ ๋ค์ ์คํํด๋ ๋ณผ ์ ์๊ฒ ๋๋ค.
์ด๋ฏธ์ง ์บ์ฑ ๊ณผ์
์ด๋ฏธ์ง๋ฅผ ์บ์ฑํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ STEP์ ๋ฐ๋ผ์ ํ์ธํด๋ด์ผํ๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์บ์์์ ์ด๋ฏธ์ง๋ฅผ ๊ฒ์
- ์๋ ๊ฒฝ์ฐ, ๋์คํฌ ์บ์์์ ์ด๋ฏธ์ง๋ฅผ ๊ฒ์
- ์๋ ๊ฒฝ์ฐ, URL์์ ์ด๋ฏธ์ง ๋น๋๊ธฐ ๋ก๋
- ๋ฉ๋ชจ๋ฆฌ ์บ์์ ๋์คํฌ ์บ์์ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์ ์ฅ
- ๋ค์ ์์ฒญ ์ ๋ฉ๋ชจ๋ฆฌ ์บ์์์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ด
- ํ๋ก์ธ์ค ์ฌ์์ ์ดํ์ ์์ฒญ์๋ ๋์คํฌ ์บ์์์ ๋ถ๋ฌ์จ ํ ๋ฉ๋ชจ๋ฆฌ ์บ์์ ์ถ๊ฐ
Swift์์์ ์บ์ฑ ์ ์ฉ
NSCache
๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ๋ฉด ์ญ์ ๋ ์๋ ์๋ ์์ key, value ์์ ์ผ์์ ์ผ๋ก ์ ์ฅํ๋ ๊ฐ๋ณ ์ฝ๋ ์ ์ด๋ค.
class NSCache<KeyType, ObjectType> : NSObject where KeyType : AnyObject, ObjectType : AnyObject
- ์ฃผ๋ก
์์ฑํ๋๋ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.- ์ฌ์์ฑํ๊ฑฐ๋, ๋ค์ ๊ณ์ฐํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์์ ์ด์ ์ ๊ฐ์ง ์ ์๋ค.
- NSCache์ ํน์ง
- ์บ์๊ฐ ์์คํ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ์ง ์๋๋ก
๋ค์ํ ์๋ ์ ๊ฑฐ ์ ์ฑ
์ ์์ฉํ๋ค.- ๋ง์ฝ ๋ค๋ฅธ Application์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ์บ์์์ ์ผ๋ถ ํญ๋ชฉ์ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ค์ธ๋ค.
Thread-safe
ํ๊ธฐ ๋๋ฌธ์ ์บ์๋ฅผ ์ ๊ธ ํ์ ์์ด ๋ค๋ฅธ ์ค๋ ๋์์ ์บ์์ ํญ๋ชฉ ์ถ๊ฐ, ์ ๊ฑฐ ๋ฑ์ด ๊ฐ๋ฅํ๋ค.- NSMutableDictionary ๊ฐ์ฒด์๋ ๋ค๋ฅด๊ฒ, ์บ์๋
์ ์ฅ๋ key ๊ฐ์ฒด๋ค์ ๋ณต์ฌํ์ง ์๋๋ค.
- ์บ์๊ฐ ์์คํ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฌด ๋ง์ด ์ฌ์ฉํ์ง ์๋๋ก
Memory Cache
1๏ธโฃ ImageCacheManager ์ฑ๊ธํค ํด๋์ค ์์ฑ
import UIKit
final class ImageCacheManager {
static let shared = NSCache<NSString, UIImage>()
private init() {}
}
- NSCache๋ <KeyType, ObjectType>์ ํํ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , URLString์ ํค ๊ฐ์ผ๋ก ๊ตฌ๋ถํ๊ณ image๋ฅผ ๋ฃ์ด์ค ๊ฒ์ด๋ค.
2๏ธโฃ ์บ์ฑ๋ ๋ฐ์ดํฐ์ ์ด๋ฏธ์ง๊ฐ ์๋์ง ๊ฒ์ฌ
extension UIImageView {
func loadImage(_ imageID: String) {
let cacheKey = NSString(string: imageID)
if let cachedImage = ImageCacheManager.shared.object(forKey: cacheKey) { // 2๋ฒ ์ํ
self.image = cachedImage
return
}
- ์ด๋ฏธ์ง๊ฐ ์๋ค๋ฉด ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ค๋ฉด ๋ค์๋จ๊ณ๋ก ์ด๋ํ๋ค.
3๏ธโฃ ๋คํธ์ํฌ ํต์ ์ ํ์ฌ ๋น๋๊ธฐ์ฒ๋ฆฌ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ์ฌ์ฉ
// ์ด๋ NetworkManager.shared.loadImage() ํจ์๋
// ๊ธฐ์กด์ ์ด๋ฏธ์ง id๋ฅผ ๋ฐ์์ ๋คํธ์ํฌ ํต์ ํ์ฌ ๋น๋๊ธฐ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ๋ฐํํ๋ ํจ์
NetworkManager.shared.loadImage(imageID: imageID) { result in // 3๋ฒ ์ํ
switch result {
case .success(let data):
if let data = data, let image = UIImage(data: data) {
DispatchQueue.main.async { [weak self] in
ImageCacheManager.shared.setObject(image, forKey: cacheKey)// 4๋ฒ ์ํ
self?.image = image
}
}
case .failure:
self.image = UIImage()
return
}
}
}
}
ImageCacheManager
์ ์บ์์ ์๋กญ๊ฒ ๊ฐ์ ธ์จ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฉํ๋ค.
Ref
๋ฐ์ํ