๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS/๐Ÿ˜ถ ๊ถ๊ธˆ์ฆ

[NSCache&URLCache]์™œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด URLCache์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋””์Šคํฌ์— ์ €์žฅ๋ ๊นŒ?

by MINT09 2024. 1. 28.

์•ˆ๋…•ํ•˜์‹ญ๋‹ˆ๊นŒ, ๋ฏผํŠธ์ž…๋‹ˆ๋‹ค. ๐Ÿ˜ˆ

๋ฐ์ดํ„ฐ๋“ค์€ ์–ด๋””์— ์ €์žฅ๋˜๊ณ  ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋ ๊นŒ์š”?

๋จผ์ € ํ•˜๋“œ ๋””์Šคํฌ์— ์šฐ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋“ค์ด ์ „๋ถ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ํ•˜๋“œ ๋””์Šคํฌ๋Š” ์šฉ๋Ÿ‰์ด ๋งค์šฐ ํฌ๊ณ , ๊ธฐ์–ต์„ ํ•˜๋Š” ๊ฒƒ์— ์น˜์ค‘๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

RAM, ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ํ•˜๋“œ ๋””์Šคํฌ์—์„œ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ์— ํ•„์š”ํ•œ ์ค‘์š” ๋ฐ์ดํ„ฐ๋“ค์„ ๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ์ „ํžˆ ๋‚ด์šฉ์€ ๋ฐฉ๋Œ€ํ•˜๊ณ , RAM์€ ๋””์Šคํฌ๋ณด๋‹จ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋Š” ์–‘์ด ์ ๊ณ , CPU์™€ ๊ฐ€๊นŒ์›Œ์„œ ๋น ๋ฅด์ง€๋งŒ ์–ด์ฐŒ ๋˜์—ˆ๊ฑด ๊ธฐ์–ต์„ ํ•˜๋Š” ๊ฒƒ์—๋งŒ ๋Šฅ๋ ฅ์ด ์น˜์ค‘๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

CPU๋Š” RAM์—์„œ ๋ฐ›์€ ๋ฐ์ดํ„ฐ๋“ค์„ ์ด์šฉํ•ด ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์–ต๋ณด๋‹ค๋Š” ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•ด, ๊พธ์ค€ํ•˜๊ฒŒ ์„ฑ๋Šฅ์ด ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— RAM๊ณผ CPU๋Š” ๊ธฐ์–ต๊ณผ ์„ฑ๋Šฅ์œผ๋กœ ๊ฐ์ž์˜ ๋ชฉ์ ์ด ๋‹ค๋ฅด๊ธฐ์— ์„œ๋กœ์„œ๋กœ ์„ฑ๋Šฅ์ฐจ์ด๊ฐ€ ์ ์  ์‹ฌํ•˜๊ฒŒ ๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. RAM์ด CPU๋ฅผ ์ซ“์•„๊ฐ€์ง€ ๋ชปํ•ด CPU๊ฐ€ RAM์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์™„์ถฉ๊ธฐ์˜ ์—ญํ• ์„ ํ•˜๋Š” ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์†๋„๋ฅผ ๋†’์ด๊ณ  ๋น„์šฉ์„ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. CPU์˜ ์ผ๋ถ€๋ผ๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์€ ์นฉ์œผ๋กœ CPU์— ์ง์ ‘ ๋ถ™์–ด ์žˆ๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ ๊ทœ์น™
    • ์‹œ๊ฐ„ ์ง€์—ญ์„ฑ : ์ตœ๊ทผ์— ์ ‘๊ทผ๋œ ๋ฐ์ดํ„ฐ, ์งง์€ ์‹œ๊ฐ„์— ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์— ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ
    • ๊ณต๊ฐ„ ์ง€์—ญ์„ฑ : ์ตœ๊ทผ์— ์ ‘๊ทผ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฃผ๋ณ€ ๋ฐ์ดํ„ฐ

๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ•˜๋“œ์›จ์–ด์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ’์„ ๋ฏธ๋ฆฌ ๋ณต์‚ฌํ•ด๋†“๋Š” ์ž„์‹œ ๊ณต๊ฐ„.

๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์บ์‹œ์˜ ๊ฐœ๋…์— ์ถฉ์กฑํ•˜๊ธฐ๋งŒ ํ•˜๋‹ค๋ฉด ์บ์‹œ๋Š” CPU, ๋ฉ”๋ชจ๋ฆฌ, ํ•˜๋“œ ๋””์Šคํฌ ์–ด๋””์—์„œ๋“  ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CDN(Contents Delivery Network): ์„œ๋ฒ„๊ฐ€ ์™ธ๊ตญ์— ์žˆ๋Š” ๊ฒฝ์šฐ ๋กœ์ปฌ์šฉ์œผ๋กœ ๋”ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ์ €์žฅํ•ด๋‘๋Š”. (์บ์‹œ์™€ ๊ฐœ๋…์ƒ ์œ ์‚ฌ)

๐Ÿ”ฅ NS Cache

class NSCache<KeyType, ObjectType> : NSObject where KeyType : AnyObject, ObjectType : AnyObject
  • ios์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์บ์‹ฑ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜.
  • key - value
  • ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ
  • ์ž๋™ ์ œ๊ฑฐ ์ •์ฑ…

๐Ÿ”ฅ URL Cache

class URLCache : NSObject
class var shared: URLCache { get set }
  • ios์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์บ์‹ฑ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜.
  • request - response
  • ์บ์‹œ๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์ฐพ์•„์„œ ๋งค์นญ์‹œ์ผœ์ค€๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ/ ๋””์Šคํฌ ์บ์‹œ ๋ชจ๋‘ ๊ฐ€๋Šฅ.
      ๋ฉ”๋ชจ๋ฆฌ ๋””์Šคํฌ
    ์†๋„ ๋น ๋ฆ„ ๋Šฆ์Œ
    ์šฉ๋Ÿ‰ ์ ์Œ ๋งŽ์Œ
    ์ €์žฅ ๊ธฐ๊ฐ„ ๊ธฐ๊ธฐ ์ข…๋ฃŒ์‹œ ์‚ญ์ œ๋จ ๊ธฐ๊ธฐ ์ข…๋ฃŒ๋˜๋„ ๋‚จ์•„์žˆ์Œ.

์ด์— URL Cache๊ฐ€ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์— ์žˆ์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์บ์‹ฑํ•˜๊ณ  ๊ฐ€์ง€๊ณ  ์˜ค๊ฒŒ ํ•ด์ฃผ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ policy๋ฅผ allowedInMemoryOnly๋กœ ํ•ด์ฃผ์—ˆ๋”๋‹ˆ ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋งŒ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.

์™œ์ผ๊นŒ์š”? Policies์˜ defalut๊ฐ’์œผ๋กœ๋Š” URLCache๋Š” request์— ๋Œ€ํ•œ response๋ฅผ ์˜จ๋””์Šคํฌ์™€ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋‘˜ ๋‹ค์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค๋Š”๋ฐ. ์ด๋Š” ์šฉ๋Ÿ‰ ์ฐจ์ด์— ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. URL Cache์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์‚ดํŽด๋ณด๋ฉด ๋ฉ”๋ชจ๋ฆฌ 4MB, ๋””์Šคํฌ 20MB๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ด€๋ จ ์„ค๋ช…์— response๊ฐ€ ์บ์‹œ ์šฉ๋Ÿ‰์˜ 5% ์ด์ƒ์ธ ๊ฒฝ์šฐ๋Š” ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ๋งค๋ฒˆ ์ƒˆ๋กœ์šด request๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์šฉ๋Ÿ‰์„ ๋ฐ”๊ฟ”์ฃผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

policy๋Š” ์—ฌ์ „ํžˆ allowedInMemoryOnly์ง€๋งŒ, memory์˜ ์šฉ๋Ÿ‰์„ ๋Š˜๋ ธ๋”๋‹ˆ ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์šฉ๋Ÿ‰ ์ฐจ์ด ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค! ์ด๋ฏธ์ง€, ์˜์ƒ ๋“ฑ๊ณผ ๊ฐ™์€ ์šฉ๋Ÿ‰์ด ๋งŽ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” NSCache๋ณด๋‹ค URLCache์ชฝ์ด ๋” ์ ์ ˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

https://developer.apple.com/documentation/foundation/nscache

 

NSCache | Apple Developer Documentation

A mutable collection you use to temporarily store transient key-value pairs that are subject to eviction when resources are low.

developer.apple.com

https://developer.apple.com/documentation/foundation/urlcache

 

URLCache | Apple Developer Documentation

An object that maps URL requests to cached response objects.

developer.apple.com

https://github.com/apple/swift-corelibs-foundation/blob/main/Sources/FoundationNetworking/URLCache.swift

https://github.com/apple/swift-corelibs-foundation/blob/main/Sources/Foundation/NSCache.swift

https://developer.apple.com/documentation/foundation/nsurlrequest/cachepolicy/useprotocolcachepolicy

 

NSURLRequest.CachePolicy.useProtocolCachePolicy | Apple Developer Documentation

Use the caching logic defined in the protocol implementation, if any, for a particular URL load request.

developer.apple.com

https://tech.justeattakeaway.com/2021/02/01/urlcache-default-size-is-not-enough/

 

URLCache – Default size is not enough – Tech Blog

Even though networks are getting faster every day, the amount of data transferred between your device and the cloud is also increasing. Here at Just Eat, we always aim to write reliable, and efficient code that results in fast, problem free transactions. H

tech.justeattakeaway.com