iOS App์์ ์๋ฒ์ ํต์ ํ๊ธฐ ์ํด Apple์์๋ URLSession์ด๋ผ๋ ๊ธฐ๋ณธ API๋ฅผ ์ ๊ณตํ๊ณ ์๋ค. third-party library๋ก ๋ง์ด ์ฌ์ฉํ๋ Alamofire, kingfisher ๋ฑ์ ๊ธฐ๋ฐ์ด ๋๋ API๋ก ์๋ฒ ํต์ ์ ์ํด ํ์์ ์ผ๋ก ์์์ผ ํ๋ค. Apple ๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉด์ ์ดํดํด๋ณด์.
Concept
์ผ๋จ ์ด๋ค ํ๋ฆ์ผ๋ก ๋คํธ์ํฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋์ง ๊ฐ๊ด์ ์ผ๋ก ์ดํดํด๋ณด์.
- Session configuration ๊ฒฐ์
- Session ์์ฑ
- URL ์์ฑ
- Request ๊ฐ์ฒด ์์ฑ
- ์ฌ์ฉํ Task ๊ฒฐ์
- Completion handler Or Delegate ์ฌ์ฉ ์ฌ๋ถ ๊ฒฐ์
- Task ์คํ
- Completion handler Or Delegate ์คํ
URLSessionConfiguration

let `default` = URLSessionConfiguration.default
let ephemeral = URLSessionConfiguration.ephemeral
let background = URLSessionConfiguration.background(withIdentifier: "configurationIdentifier")URLSessionConfiguration ๊ฐ์ฒด๋ URLSession ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์
๋ก๋ํ๊ฑฐ๋ ๋ค์ด๋ก๋ํ ๋ ์ฌ์ฉํ ์ ์ฑ
๊ณผ ํ๋์ ์ ์ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ task๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ธฐ ์ ์, ์ด ์ค์ ์์
์ด ์ต์ฐ์ ์ผ๋ก ์งํ๋์ด์ผ ํ๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ค์ ํ ์ ์๋ค.
- timeout ๊ฐ
- caching ์ ์ฑ
- connection ์๊ตฌ ์ฌํญ
- cellular ํ์ฉ ์ฌ๋ถ
- connectivity
URLSessionConfiguration ๊ฐ์ฒด๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค. ์๋ํ๋ฉด ์ด ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก URLSession object๊ฐ ์์ฑ๋๊ฒ ๋๋๋ฐ, URLSession Object๊ฐ ์์ฑ๋ ์ดํ์ configuration์ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ผ๋จ URLSession ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ instance๋ก ์ค์ ๋๋ฉด, URLSessionConfiguration instance์ ๋ฐ์ํ๋ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ด ์์ฑ๋ URLSession์ ๋ฐ์๋์ง ์๋๋ค. ์ด๋ฅผ ๋ฐ์ํ์ฌ ์์
ํ๊ณ ์ถ๋ค๋ฉด ์๋ก์ด URLSession ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ๋ฐ์ ์๋ค.
Default
class var `default`: URLSessionConfiguration { get }๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ configuration์ด๋ค. ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ๋๋ค.
- disk-based cache
- ๊ฒฐ๊ณผ๊ฐ ํ์ผ๋ก ๋ค์ด๋ก๋ ๋๋ ๊ฒฝ์ฐ๋ ์ ์ธ
- user์ keychain์ ์ธ์ฆ์๋ค์ ์ ์ฅ
- cookie ์ ์ฅ
Ephemeral
class var ephemeral: URLSessionConfiguration { get }ephemeral configuration์ ๊ฒฝ์ฐ default์ ๋น์ทํ๋ค. ๋ค์๊ณผ ๊ฐ์ ์ ๋ง ๋ค๋ฅด๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- cache๋ฅผ ์ ์ฅํ์ง ์์
- ์ธ์ฆ์๋ฅผ ์ ์ฅํ์ง ์์
- session๊ณผ ๊ณผ๋ จ๋ ์ด๋ค ๋ฐ์ดํฐ๋ disk์ ์ ์ฅํ์ง ์์
- ram์ ์ ์ฅํจ
๋๋ถ๋ถ์ ์ ๋ณด๋ฅผ ram์ ์ ์ฅํ๊ฑฐ๋, ์ ์ฅํ์ง ์๋๋ค. URL content๊ฐ file์ธ ๊ฒฝ์ฐ์๋ง disk์ ์ ์ฅํ๋ค.
์ด๋ ๊ฒ ephemeral configuration์ ์ฌ์ฉํ๋ ์ต๋ ์ฅ์ ์ ์ญ์ privacy์ด๋ค. ์ ์ฌ์ ์ผ๋ก ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ disk์ ์ ์ฅํ์ง ์์์ผ๋ก์ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ก์ฑ์ ธ์ ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค. ์ค์ ๋ก ํด๋น ์ธ์ ์ด private browsing mode ํน์ ๋น์ทํ ์ํฉ์์ ๋ง์ด ์ฌ์ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ผ๋จ ephemeral configuration์ด disk์ cacheํ์ง ์๊ณ ram์ ํ๊ธฐ ๋๋ฌธ์, cache size๋ ram size์ ๋ฐ๋ผ ์ ํ๋๋ค. ์ฆ, ์์ ์ ์ฅ๋ cache๊ฐ ๋ ๋นจ๋ฆฌ ์ ๊ฑฐ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค๋ ๋ง์ด๋ค. ๋ํ user๊ฐ app์ ๋ซ๊ฑฐ๋ ์ฌ์คํํ๋ฉด ์ด cache ์ ๋ณด๋ ๋ค ๋ ์๊ฐ๋ค. ๊ฒฐ๊ตญ app์ ํน์ฑ์ ๋ฐ๋ผ perfomance๊ฐ ๋ฌ๋ผ์ง ์ ์์์ ์ธ์งํ๊ณ ์์ด์ผ ํ๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ด configuration์ผ๋ก ๋ง๋ค์ด์ง session์ invalidateํ๋ค๋ฉด, ๋ด๋ถ session data๋ ์๋์ ์ผ๋ก ์ญ์ ๋๋ค. ์ ๊ทธ๋ฐ๋ฐ memory cache์ ๊ฒฝ์ฐ์๋ app์ด suspend ์ํฉ(home์ผ๋ก ๋์ด๊ฐ ์ํฉ์์ background์์ ์์ ์ ํ์ง ์๋ ๊ฒฝ์ฐ)์ธ ๊ฒฝ์ฐ ์๋์ ์ผ๋ก ์ญ์ ๋์ง๋ ์๋๋ค. ๋ค๋ง app์ด terminated ๋๊ฑฐ๋ memory๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ(๋ถ์กฑํ๋ฉด suspend ์ํ app์ด ์ ๊ฑฐ๋๋๊น) ์ญ์ ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. (๋ชจํธํ๊ฒ ๋งํด๋๋ค)
Background
class func background(withIdentifier identifier: String) -> URLSessionConfigurationํด๋น configuration์ ์ถ๊ฐ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๋๋ฐ, ์๋ nil์ด๊ฑฐ๋ empty string์ด๋ฉด ์๋๋ค.
์ด๋
์์ app์ด background์์ ์๋ํ๋ ๋์ data๋ฅผ ๋ณด๋ด๊ธฐ ์ํด ์ ์ ํ configuration์ด๋ค. ์ด configuration์ผ๋ก ๋ง๋ค์ด์ง URLSession์ ์์คํ
์ผ๋ก ์ ์ก ์ ์ด๊ถ์ ๋๊ธฐ๊ณ , ์ด ์ธ์
์ ๋ณ๋์ process์์ ์ ์ก์ ์ฒ๋ฆฌํ๋ค. ์ฌ์ง์ด iOS์ ๊ฒฝ์ฐ, ์ด configuration์ผ๋ก ๋ง๋ค์ด์ง URLSession์ app์ด suspend ํน์ terminated๋ ์ํ์์๋ ์ ์ก์ ๊ณ์ํ ์ ์๋ค.(system์ผ๋ก ๋๊ฒจ์ ๊ทธ๋ฐ ๋ฏ)
๋ง์ฝ์ iOS app์ด system์ ์ํด terminated๋๊ฑฐ๋ ์ฌ์คํ๋ ๊ฒฝ์ฐ, app์ด ์ด session์ ์ฐพ์์ผ ํ ์ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์๋ก์ด configuration๊ณผ session object๋ฅผ ๋ง๋ค๊ณ , ์ข
๋ฃ์์ ์ ์ ์ก progress๋ฅผ ์ป๊ธฐ ์ํด ์ค์ ํ ๊ฐ์ identifier๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ system์ ์ํด ์ ์์ ์ผ๋ก ์ข
๋ฃ๋ ์์ ์๋ง ๊ฐ๋ฅํ๋ค. ๋ง์ฝ์ user๊ฐ app์ ๋ฉํฐ ํ์คํนํ๋ฉด์ผ๋ก๋ถํฐ ์ข
๋ฃํ ๊ฒฝ์ฐ, system์ ๋ชจ๋ background ์ ์ก์ ์ข
๋ฃํ๋ค. ๊ฒ๋ค๊ฐ system์ user๊ฐ app์ ๊ฐ์ ์ข
๋ฃํ ๊ฒฝ์ฐ ์๋์ ์ผ๋ก app์ ์คํํ์ง ์๋๋ค. ๋ค์ transfer๊ฐ ์์๋๋ ค๋ฉด user๊ฐ ๋ช
์์ ์ผ๋ก app์ ๋ค์ ์ผ์ผ ํ๋ค.
isDiscredit property๋ฅผ ์ฌ์ฉํ๋ฉด ์ต์ ์ ์ฑ๋ฅ์ ์ํด system ์ฌ๋์ ๋ฐ๋ผ ์ ์ก์ ์์ฝํ๋๋ก background configuration์ ๋ง๋ค ์ ์๋ค. ๋ง์ฝ์ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ผ์ด ์๋ค๋ฉด ์ด value๋ฅผ true๋ก ๋ฐ๊ฟ์ฃผ์. ์ถ๊ฐ์ ์ผ๋ก ์์๊ฐ ๊ถ๊ธํ๋ค๋ฉด Downloading Files in the Background ์ฌ๊ธธ ๋ณด์. (์ด๊ฑด ๋ชป๋ณด๊ฒ ๋ค ํ๋ค๋ค)
URLSession
let defaultSession = URLSession(configuration: .default)
let ephemeralSession = URLSession(configuration: .ephemeral)
let backgroundSession = URLSession(configuration: .background(withIdentifier: "backgroundIdentifier"))
let defaultSession = URLSession(configuration: .default, delegate: self, delegateQueue: nil) // with delegateURLSession ๊ฐ์ฒด ํน์ ๊ด๋ จ๋ ๊ฐ์ฒด๋ ์ง์ ๋ URL๋ค๋ก ๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ํ๊ฑฐ๋ ์
๋ก๋ํ ์ ์๋ API๋ฅผ ์ ๊ณตํ๋ค. App์ด runํ์ง ์๊ฑฐ๋ suspended ์ํ์ธ ๊ฒฝ์ฐ Background download๋ฅผ ์ํํ ์ ์๋ค. URLSessionDelegate ํน์ URLSessionTaskDelegate๋ฅผ ์ฌ์ฉํ๋ฉด authentication ์ง์์ด๋ redirection, task completion๊ณผ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ค.
App์ด ํ๋์ด์์ URLSession instance๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๊ฐ๊ฐ์ instance๋ ๊ด๋ จ๋ data transfer task๋ฅผ ์กฐ์ ํ๋ค. ์๋ฅผ ๋ค์ด web browser๋ฅผ ๋ง๋ ๋ค๋ฉด, Tab ํน์ window๋ง๋ค ํ๋์ ์ธ์
์ ๋ง๋ค ์ ์๋ค. ํน์ interactiveํ ์ฌ์ฉ์ ์ํ Session, background download๋ฅผ ์ํ Session ์์ผ๋ก ๋ง๋ค์ด์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๊ฐ Session์์ App์ ํน์ URL์ ๋ํ ์์ฒญ์ ๋ํ๋ด๋ task๋ฅผ ์ถ๊ฐํ๋ค. (ํ์ํ ๊ฒฝ์ฐ HTTP redirect๋ฅผ ๋ฐ๋ฆ)
URLSession์ ๋ง๋ค๊ฒ ๋๋ฉด configuration ๊ฐ์ฒด๊ฐ ํ์ํ๋ค. ์์์ ์ค๋ช
ํ๋ฏ, ๋จ์ผ ํธ์คํธ์ ์ฐ๊ฒฐํ ์ต๋ ๊ณต์ ์ฐ๊ฒฐ ์, cellular network ์ฌ์ฉ ์ฌ๋ถ๋ฑ๊ณผ ๊ฐ์ ๋์์ ์ ์ํ๋ URLSessionConfiguration ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ๋ง๋ค ์ ์๋ค. ๊ธฐ๋ณธ์ ์ธ request๋ฅผ ์ํ shared singleton ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๋ค. ์ด๋
์์ configuration object๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค. ์ด๋
์์ custimziation์ด ๋ถ๊ฐํ์ง๋ง, ์ ํ๋ requirement๋ผ๋ฉด ์ข์ ์์์ ์ด ๋ ์ ์๋ค. ์ถ๊ฐ ์ค์ ์ด ํ์ํ๋ค๋ฉด URLSessionConfiguration ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ค์ด์ ์ฌ์ฉํ๋๋ก ํ์.
async/await ๊ตฌ๋ฌธ ์ญ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ์ด ๋ถ๋ถ์ ์ถ๊ฐ ํฌ์คํ ์ผ๋ก ์์ฑํ ์์ ์ด๋ค.
URLSession์ ์์ฒด์ ์ผ๋ก data, file, ftp, http, https URL Scheme์ ์ง์ํ๋ค. ๋ํ HTTP/1.1, HTTP/2, HTTP/3 ํ๋กํ ์ฝ ์ญ์ ์ง์ํ๋ค. ์ถ๊ฐ์ ์ผ๋ก custom networking protocl์ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๊ฒ๋ ์ง์ํ๋๋ฐ, URLProtocol์ ์ฐธ๊ณ ํ์.
iOS 9.0 ๋ฐ macOS 10.11 ์ด์์ URLSession์ผ๋ก ๋ง๋ค์ด์ง ๋ชจ๋ HTTP ์ฐ๊ฒฐ์ ์ฑ ์ ์ก ๋ณด์(App Transport Security: ATS)์ ์ฌ์ฉํ๋ค. ๋ณด์์ ์ทจ์ฝํ ๋คํธ์ํฌ์ ์ฐ๊ฒฐ์ ์ฐจ๋จํ๊ฒ ๋๋๋ฐ, ๋ณดํต ๋คํธ์ํฌ ์ฐ๊ฒฐํ๊ณ http๋ก ๋ url์ ์ ์ํ๋ ๊ฒฝ์ฐ ๋ณด๊ฒ๋๋ ์๋ฌ์ ๊ด๋ จ์๋ค. App Transport Security์ ์ฐธ๊ณ ํ์.
URLSession API๋ thread safeํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ์์ ๋กญ๊ฒ session๊ณผ task๋ฅผ ์ด๋ thread์์๋ ๋ง๋ค์ด๋ ๋๋ค. delegate method๊ฐ completion handler๋ฅผ ํธ์ถํ๋ฉด, ์ฌ๋ฐ๋ฅธ delegate queue์ ์๋์ผ๋ก ์์ฝ๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ป๊ฒ Session์ ๋ง๋ค๊ณ , Session์ ๋ง๋๋๋ฐ ํ์ํ ์ค์ ์ด ์ด๋ค ๊ฒ๋ค์ด ์๋์ง ์์๋ณด์๋ค. ๋ค์์ URL๊ณผ Request ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์์๋ณด์. ๋!