[iOS] ๊ณต์๋ฌธ์๋ก ๊ณต๋ถํ๋ URLSession
URLSession
URLSession์ ๋คํธ์ํฌ ํต์ ๊ณผ ๊ด๋ จ๋ ์์ ๋ค์ ๊ทธ๋ฃน์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ ๋๋ค. Foundation ํ๋ ์์ํฌ์ ํฌํจ๋์ด ์๊ณ ํด๋์ค์ ๋๋ค.
Overview
URLSession์ URL์ ํตํด ํน์ ๋๋ ์๋ ํฌ์ธํธ์ ๋ํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ก๋ํ๊ฑฐ๋ ๋ค์ด๋ก๋ ํ ์ ์๋๋ก API๋ฅผ ์ ๊ณตํ๋ ํด๋์ค์ ๋๋ค. URLSession์ ํตํด์ ์ฑ์ด ์คํ๋์ง ์์๋, ํน์ Suspended ์ํ์ฌ๋(ํ ์ฒ์์์๋ค์..) ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋๋ฅผ ์งํํ ์ ์๊ฒ ๋์์ค๋๋ค. URLSessionDelegate๋ URLSessionTaskDelegate๋ฅผ ์ฌ์ฉํ๋ฉด ๊ถํ์ด๋ ๋ฆฌ๋ค์ด๋ ์ , ์์ ์๋ฃ์ ๋ํ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์๋ ์์ด์.
์ค๋ฒ๋ทฐ์๋ ์ด๋ฐ ๋ ธํธ๊ฐ ์ ํ์ ธ ์๋๋ฐ์, ์ค๋ฒ๋ทฐ๋ฅผ ๋ง์ ๋ณด๊ณ ๋ ธํธ์์ ์๊ฐํ๋ ๋ฌธ์๋ฅผ ์ ๊น ์ดํด๋ณผ๊ฒ์.
๊ฐ๋ตํ๊ฒ URLSession API๋ ๋ค๋ฅธ ํด๋์ค๋ค๊ณผ ๋ณต์กํ๊ฒ ์ฝํ์ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ํผ๋ฐ์ค ๋ฌธ์๋ง ๋ณด๋ฉด ์ ์๋ฟ์ง ์์ ์๋ ์๋ค๊ณ ํ๋๋ฐ ์ข ์ ์ ์ด์ฃผ์ง..
์๋ฌดํผ ์ฑ์์๋ ์ฌ๋ฌ๊ฐ์ URLSession ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๊ณ , ๊ฐ ์ธ์คํด์ค๋ค์ด ๋ฐ์ดํฐ ํต์ ๊ณผ ๊ด๋ จ๋ ์์ ๋ค์ ๊ทธ๋ฃน์ง์ด์ ๊ด๋ฆฌํ๊ณ ์์ด์. ์๋ฅผ ๋ค์ด์ ์น ๋ธ๋ผ์ฐ์ ์ฑ์ ๊ตฌํํ๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ์ ๊ฐ ํญ์ด๋ ์ฐฝ์ ๋ํด ์ธ์ ์ ํ๋์ฉ ๋ง๋ค์ด์ค์ผํ ์๋ ์๊ณ , ์ฌ์ฉ์๊ฐ ์น์ํ์ ํ๋๋ฐ ์ฌ์ฉํ๋ ์ธ์ , ๊ทธ๋ฆฌ๊ณ ๋์์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋๋ฅผ ์ํํ๋ ์ธ์ ์ผ๋ก๋ ๋๋ ์ ์์ฃ .
URL Loading System
๋ ์งํํ๊ธฐ ์ ์ ๊ณต์๋ฌธ์์์ ์ฝ์ด๋ณด๋ผ๊ณ ์ถ์ฒํด์ค URL Loading System๋ถํฐ ์ฝ์ด๋ณผ๊ฒ์.
URL Loading System ์ญ์ Foundation ํ๋ ์์ํฌ์ ํฌํจ๋ ๊ธฐ๋ฅ์ธ๋ฐ์, ํ์ค ์ธํฐ๋ท ํ๋กํ ์ฝ(HTTP๋ฅผ ๋งํ๋ ๊ฒ์ด๊ฒ ์ฃ ?)์ ํตํด URL๋ก ์๋ณ๋๋ ์๋ฒ์ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค๊ณ ์๊ฐํ๊ณ ์์ด์. Loading์ ๋น๋๊ธฐ์ ์ผ๋ก ์ํ๋๊ณ ๋๋ถ์ ์ฐ๋ฆฌ์ ์ฑ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์์ ์ ํ๋ฉด์๋ ๊ณ์ ์ฌ์ฉ์์ ์ํธ์์ฉํ ์ ์์ฃ .
URLSession์ ์ฌ์ฉํ๋ฉด ํ๋ ์ด์์ URLSessionTask ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ด ์ธ์คํด์ค๊ฐ ํต์ ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฑ์ ์ ๋ฌํ๋ ์ญํ ์ ํ๊ฒ๋ฉ๋๋ค. ๋ง์ฝ ๊ฐ ์ธ์ ์ ๋ํ ์์ธํ ์ค์ ์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด URLSessionConfiguration ๊ฐ์ฒด๋ฅผ ํตํด ์ค์ ์ ๋ง๋ค ์ ์๊ณ , ์ด ์ค์ ์์ ์บ์์ ์ฟ ํค๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ๊ฑด์ง, ์ ๋ฃฐ๋ฌ ๋คํธ์ํฌ๋ฅผ ํ์ฉํ ๊ฒ์ธ์ง ๋ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ์ค์ ํ ์ ์์ด์.
ํ๋์ ์ธ์ ์ ํตํด์ ๋ฐ๋์ ํ๋์ URLSessionTask๋ง ๋ง๋ค ์ ์๋ ๊ฒ์ ์๋๊ณ ์ฌ๋ฌ๊ฐ์ Task๋ฅผ ์์ฑํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ์น ๋ธ๋ผ์ฐ์ ์ ๋๊ฐ์ ์ธ์ ์ ๋๊ณ ํ ์ธ์ ์ ์ผ๋ฐ ๋ชจ๋์ผ ๋์ Task๋ฅผ ๊ณ์ ์์ฑํ๊ณ , ์ฌ์ํ ๋ณดํธ๋ชจ๋์ผ ๋๋ ์บ์๋ฅผ ๋จ๊ธฐ์ง ์๋ ์ค์ ์ ์ธ์ ์ ์ ์ฉํด ์ด ์์์ Task๋ฅผ ์์ฑํด ์ฌ์ฉํ๊ฒ ํ ์ ์์ต๋๋ค.
URLSessionConfiguration์ ๋ํด์๋ ์ ๋ฌธ์์ ๊ฐ ์ค์ ๋ณ๋ก ์์ธํ๊ฒ ๋์์๋๋ฐ์, ๋์ค์ ์๊ฐ์ ๋ด์ ํ ๋ฒ ์ฝ์ด๋ณด์์ผ๊ฒ ์ต๋๋ค..!
Type of URL Sessions
ํ ์ธ์ ์์ ์์ฑ๋๋ Task๋ค์ ๋ชจ๋ ์ธ์ ์ ์ค์ ์ ๊ณต์ ํ๊ณ ์์ด์. ์์์ ์ธ๊ธํ ์ ๋ฃฐ๋ฌ ๋ฟ๋ง ์๋๋ผ ์ธ์ ์ ํ๋ฒ์ ์ฐ๊ฒฐํ ์ ์๋ ํธ์คํธ์ ์ต๋ ์์ ๊ฐ์ ์ค์ ๋ค๋ ๋ง๋ค์ด์ค ์ ์์ฃ .
URLSession์ shared๋ผ๋ ์ด๋ฆ์ผ๋ก ์ฑ๊ธํค ์ธ์ ์ ๊ฐ์ง๊ณ ์๋๋ฐ์, ์ด ์ธ์ ์ ์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์ ์ก๋ง์ ์ง์ํ๋ ์ธ์ ์ธ๊ฑฐ์ฃ . ์ด ์ธ์ ์ ์ง์ ์ธ์ ์ ๋ง๋ ๋ ๊ฒ์ฒ๋ผ ์ปค์คํฐ๋ง์ด์ง์ ํ ์๋ ์์ง๋ง ์ ํ์ ์ธ ๊ธฐ๋ฅ๋ง์ ์ฌ์ฉํ๋ค๋ฉด ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ง์ฝ ์ธ์ ์ธ์คํด์ค๋ฅผ ์ง์ ๋ง๋ค๊ณ ์ํ๋ค๋ฉด ์ธ ์ข ๋ฅ์ ์ค์ ์ ๊ฐ์ง๊ณ ๋ง๋ค ์ ์์ต๋๋ค.
1) ๋จผ์ Default ์ธ์ ์ธ๋ฐ์, shared ์ธ์คํด์ค์ฒ๋ผ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ๋ง์ ์ ๊ณตํ์ง๋ง ์ด๋ฒ์๋ ์ง์ ์ค์ ๋ค์ ์ค ์ ์๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. Delegate๋ฅผ ์ค์ ํ ์๋ ์์ด์.
2) ๊ทธ ๋ค์์ Ephemeral ์ธ์ ์ ๋๋ค. ์๊น ์ฌ์ํ ๋ณดํธ ๋ธ๋ผ์ฐ์ ๋ชจ๋๋ฅผ ๋งํ๋ฉด์ ์ฒจ๋ถํ ์ฌ์ง์ ๋์์์๋๋ฐ์, shared ์ธ์คํด์ค์ฒ๋ผ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง, Ephemeral ์ธ์ ์ ์บ์, ์ฟ ํค, ์ธ์ฆ์ ๋ณด๋ฅผ ๋์คํฌ์ ๋จ๊ธฐ์ง ์์์.
3) ๋ง์ง๋ง์ผ๋ก Background ์ธ์ ์ธ๋ฐ์, ์ ๋ก๋๋ ๋ค์ด๋ก๋๋ฅผ ์ฑ์ด ์คํ์ค์ด ์๋๋๋ผ๋ ์งํํ๊ณ ์ถ๋ค๋ฉด ์ด ์ธ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด URLSessionConfiguration ๊ฐ์ฒด๊ฐ ์ธ์ ์ ํ๋ฒ ์ค์ ๋๊ณ ๋ ๋ค์ ํต์ ์ ์ฑ ์ ์์ ํ๊ณ ์ ํ๋ค๋ฉด, ๊ธฐ์กด ์ธ์ ์ด ์๋๋ผ ์๋ก์ด URLSession ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด์ผ ํด์. ํ๋ฒ ์ ํด์ง ๋ค์๋ ์๋ก์ด URLSessionConfiguration๊ฐ ๋ค์ด์๋ ๋ฌด์๋ฉ๋๋ค.
Types of URL Session Tasks
URLSession์ ์์ ๋ค์ ๊ด๋ฆฌํ๋ ์ธ์ ๊ฐ์ฒด์ด๊ณ , ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฑฐ๋ ์ฌ๋ฆฌ๋ ์์ ์ Task ๋ผ๋ ๋จ์๋ก ์ด๋ฃจ์ด์ง๊ณ ์์ต๋๋ค. ๊ฐ ์ธ์ ์์์๋ Task ๊ฐ ํ๋ ์ผ์ ๋ฐ๋ผ ์ฌ๋ฌ ์ข ๋ฅ์ Task๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
1) ๋จผ์ Data Task ๋ NSData ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฆฌ๊ณ ๋ด๋ ค๋ฐ์์. Data task๋ ์๋ฒ์ ์งง๊ณ , ์์ฃผ ์์ฒญ๋๋ ์์ ์ ๋ํด ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค(์ง๊ธ๊น์ง ์ด๋ฏธ์ง ๋ค์ด๋ก๋๋ฅผ Data Task๋ก ํด์๋๋ฐ ๋ฐ์ฑํ๊ฒ ๋๋ค์..).
2) Upload Task๋ Data Task์ ์ ์ฌํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ ์ก์ด ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
3) Download Task๋ ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ํํ๋ก ์ฝ๊ณ ์ฑ์ด ์คํ๋์ง ์์ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋๊ฐ ๊ฐ๋ฅํ๋๋ก ํฉ๋๋ค(๋ฌธ์์๋ downloads and uploads ๋ผ๊ณ ๋์ด ์๋๋ฐ URLSessionDownloadTask ๋ฌธ์์๋ upload์ ๊ด๋ จ๋ ๋ด์ฉ์ด ์๋ค์.. ์๋ชป์ ํ ๊ฒ ๊ฐ์๋ฐ ์๊ณ ๊ณ์๋ ๋ด์ฉ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์!).
๋ค๋ฅธ ํ์คํฌ์๋ ๋ค๋ฅด๊ฒ Download Task๋ ๋ค์ด๋ก๋ ๋ฐ์ ํ์ผ์ ์์ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํด์. ๊ทธ๋ฆฌ๊ณ ๋ค์ด๋ก๋๊ฐ ์ฑ๊ณตํ๋ฉด ํด๋น ๋๋ ํ ๋ฆฌ์ ์ฃผ์๋ฅผ completion handler์ ๋ฐํํฉ๋๋ค. ์ด ์์ ํ์ผ์ completionHandler๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ๋ฐ๋์ ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋์์ผ์ฃผ์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด completion handler์ ๋ฐํ๊ณผ ํจ๊ป ๋ฐ์ดํฐ๊ฐ ์ญ์ ๋ฉ๋๋ค.
4) ๋ง์ง๋ง์ผ๋ก WebSocket Task๋ TCP๋ TLS๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ํฉ๋๋ค.
Session Delegate ์ฌ์ฉํ๊ธฐ
์ธ์ ๋ด์์ ์งํ๋๋ Task๋ค์ ๋ชจ๋ ๊ณตํต๋ Delegate ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๊ณ ์์ต๋๋ค. ์ด Delegate๋ฅผ ๊ตฌํํ๋ฉด ํต์ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ฌ๋ฌ ์ด๋ฒคํธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. ๊ถํ ์ธ์ฆ์ ์คํจํ๊ฑฐ๋, ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๊ฑฐ๋, ๋ฐ์ดํฐ๊ฐ ์บ์ฑ์ด ๊ฐ๋ฅํ ๋์ ๊ฐ์ ์ด๋ฒคํธ์ ๋ํ ๋ก์ง์ ์์ฑํ ์ ์์ฃ .
๋ง์ฝ Delegate๊ฐ ํ์ํ์ง ์๋ค๋ฉด Session์ ์์ฑํ ๋ ์ธ์๋ก nil์ ์ ๋ฌํ๋ฉด ๋ฉ๋๋ค.
์ค์ํ ๋ด์ฉ์ด ์๋๋ฐ์, ์ธ์ ๊ฐ์ฒด๋ delegate๋ฅผ ์ฑ์ด ์ข ๋ฃ๋๊ฑฐ๋ ์ธ์ ์ด ๋๋ ๋๊น์ง ๊ฐํ๊ฒ ์ฐธ์กฐํ๋ค๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ธ์ ์ด ์ข ๋ฃ๋์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ด ๋ฐ์ํ๋ค๋ ์ ์ ์๊ณ ์์ด์ผ ํด์. delegate๋ฅผ ์ฌ์ฉํ๋ ์ธ์ ์ ์ฌ์ฉ์ ๋ ์ด์ ํ์ง ์๋๋ค๋ฉด ๋ฐ๋์ invalidate๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ์ค์ํ๊ฒ ๋ค์..!
URLSessionTaskDelegate๋ฅผ ์ฑํํด์ ์ธ์ ๋ด์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ๋ํ ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์๊ณ , ๋ง์ฝ ํน์ ํ ํ์คํฌ์ ๋ํด์ ๋ฐ๋ก ๋์์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด URLSessionTask ๊ฐ์ฒด์ delegate ํ๋กํผํฐ์ ๋๋ฆฌ์๋ฅผ ์ง์ ํด์ค ์๋ ์์ต๋๋ค.
Asynchronicity and URL Sessions
๋๋ถ๋ถ์ ๋คํธ์ํฌ API๊ฐ ๊ทธ๋ฐ ๊ฒ ์ฒ๋ผ URLSession์ API๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํฉ๋๋ค. URL Session์ ๋ฐ์ดํฐ๊ฐ ๋์ฐฉํ๋ฉด ์ด๋ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋์ง์ ๋ฐ๋ผ์ ์ธ ๊ฐ์ง ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ์ฃ .
1) ๋ง์ฝ Swift๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด, ๋ฉ์๋์ async ํค์๋๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด data(from:delegate:) ๋ฉ์๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ณ download(from:delegate:)๋ก ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค๋ฉด, ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ง์ ์์ await ํค์๋๋ฅผ ์ฌ์ฉํด ๋ชจ๋ ํต์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ๋๋ก ํ ์ ์์ต๋๋ค.
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ bytes(from:delegate:) ๋ฉ์๋๋ฅผ ํธ์ถํด์ ๋ฐ์ดํฐ๋ฅผ AsyncSequence ํ์ ์ผ๋ก ๋ฐ์ ์๋ ์์ฃ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด for await-in ๋ฃจํ๋ฅผ ์ฌ์ฉํด์ ์ฑ์ด ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๊ฐ์๊ธฐ ์ต์์น ์์ AsyncSequence ๊ฐ ๋์์ ์ฐพ์๋ดค๋๋ฐ์, [๊ณต์๋ฌธ์]
Sequence ํ๋กํ ์ฝ๊ณผ ๋น์ทํ๊ฒ ๊ฐ์ ์ํํ ์ ์๋๋ฐ, ์์ง ์๋ฃ๋์ง ์์ ๊ฐ์ ๋ํด์๋ ๊ธฐ๋ค๋ฆฌ๊ฒ ํฉ๋๋ค.
bytes ๋ฉ์๋์ ์ ์๋ฅผ ๋ณด๋ฉด sequence of bytes๋ก ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๋ฌํ๋ค๊ณ ๋์ด์์ด์. ๊ทธ๋์ NSData๋ก ์์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๊ฒ ์๋๋ผ ๋ฐ์ดํธ ๋จ์๋ก ๋ค์ด์ค๋ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ๊ณ์ ์ ๋ฌํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์์ ๊ฒ ๊ฐ์์. ๊ทธ๋์ ๊ฐ ๋ฐ์ดํธ๋ค์ด ๋์ฐฉํ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋๊น for await in ์ ์ฌ์ฉํ๋ ๊ฒ์ด๊ตฌ์.
bytes ๋ฉ์๋์ ๋ฌธ์ ๋ง์ง๋ง์ ์ด๋ ๊ฒ ์ ํ์๋ ๊ฒ์ ๋ณด๋ ์ ๊ฐ ์๊ฐํ ๋ฐฉํฅ์ด ๋ง๋ ๊ฒ ๊ฐ๋ค์!
2) ๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์์ค๋ฉด.. ์ค์ํํธ๋ Objective-C์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ๋์ผํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ Completion Handler ํด๋ก์ ๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด์์. ์ ํฌ๊ฐ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๋ฐฉ๋ฒ์ด๊ธฐ๋ ํ์ฃ . ๊ทธ๋ฆฌ๊ณ Delegate ๋ฉ์๋ ์ค์์ ์์ ์ด ์๋ฃ๋์์ ๋์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋
func urlSession(URLSession, task:URLSessionTask, didCompleteWithError: Error?) ๋ฉ์๋๋ ์ ๊ณตํ๊ณ ์์ด์.
Protocol Support
URLSession์ ๊ธฐ๋ณธ์ ์ผ๋ก data, file, ftp, http, https์ URL Scheme์ ์ง์ํ๊ณ ์์ด์. ๊ทธ๋ฆฌ๊ณ HTTP ์ค์์๋ HTTP/1.1, HTTP/2, HTTP/3 ํ๋กํ ์ฝ์ ์ง์ํ๊ณ ์์ต๋๋ค.
๋ง์ฝ ๋คํธ์ํฌ ํ๋กํ ์ฝ์ ์ง์ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด URLProtocol ์ ์์ํด์ ๊ตฌํํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
ํน์ HTTP ๋ฒ์ ์ ์ํ๋๋๋ก ์ ํํด์ ์์ฒญ์ ๋ณด๋ผ ์ ์๋์ง ๊ถ๊ธํด์ ์ฐพ์๋ดค๋๋ฐ์, ๊ณต์์ ์ธ ๋ํผ๋ ์์ง๋ง
https://developer.apple.com/forums/thread/94907
์ด ์ค๋ ๋๋ฅผ ๋ณด๋ฉด ์๋ฒ์์ ์ ๊ณตํ๋ ํ๋กํ ์ฝ์ ๋ง๊ฒ ์ ์ฉ๋๋ ๊ฒ ๊ฐ์์.
Foundation Copying Behavior
URLSession์ ์ธ์ ๊ณผ ํ์คํฌ๋ ๋ชจ๋ NSCopying ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ด์. ๋ฐ๋ผ์ ์ด๋ค ์ธ์ ์ด๋ ํ์คํฌ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ฒ ๋๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๊ฐ ๊ทธ๋๋ก ๋ฐํ๋ฉ๋๋ค. ํ์ง๋ง Configuration ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๊ฒ๋๋ฉด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํด ๊ธฐ์กด ์ค์ ๊ฐ์ฒด์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์์ ํ ์ ์๊ฒ๋ฉ๋๋ค.
Thread Safety
URL Session์ API๋ Thread-Safe ํฉ๋๋ค. ์ด๋ค ์ค๋ ๋์์๋ ์ง ์ธ์ ์ด๋ ํ์คํฌ๋ฅผ ๋ง๋ค ์ ์๊ณ Completion Handler ๋ฅผ ์ ๊ณตํ๋ค๋ฉด, ์ฌ๋ฐ๋ฅธ delegate queue์ ์๋์ผ๋ก ํ ๋น์ด ๋ฉ๋๋ค.
delegate queue๊ฐ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ์ด์ ์ฐพ์๋ดค๋๋ฐ์,
์นดํ ๊ณ ๋ฆฌ๊ฐ ์ด๋ ๊ฒ ๋์์์ด์ URLSession์ด ๊ฐ์ง๋ ํ๋กํผํฐ๋ผ๋ ๊ฒ์ ์ ์ ์์๊ณ ,
์ ์๋ ์ด๋ ๊ฒ ๋์ด์์์ต๋๋ค. delegateQueue๊ฐ URLSession์ ํ๋กํผํฐ์ด๋๊น ์ฌ๊ธฐ์ ๋งํ๋ this object๋ URLSession ๊ฐ์ฒด๋ฅผ ๋งํ๋ ๊ฒ์ด๊ฒ ์ฃ ? ๊ทธ๋์ ์ผ๋จ ์ธ์ ํ๋๋น delegate์ ๋ํ ์์ ์ด ์์ด๋ ํ๊ฐ ์๋ค๊ณ ์๊ฐํ์ด์.
์ค๋ช ์ ๋ณด๋๊น ์ข ๋ ๋ช ํํด์ง๋ค์. ์ด๋ค ์ธ์ ์์ ์ผ์ด๋ ๋ชจ๋ delegate ๋ฉ์๋์ ํธ์ถ๊ณผ completion handler์ ํธ์ถ์ด ์ด ํ์ ์์ฌ์ ์คํ๋๋ค๊ณ ํ๋ค์. ๊ทธ๋ผ ์๊น ์ด๋ค ์ค๋ ๋์ด๋์ง "์ฌ๋ฐ๋ฅธ delegate queue์ ์๋์ผ๋ก ํ ๋น์ด ๋ฉ๋๋ค." ๋ผ๋ ๋ง์ ๊ฐ์ ์ค๋ ๋์ ์ฌ๋ฌ delegate๋ completion์ด ์์ด๋ ๊ฐ ์ธ์ ์ ๋ง๋ delegate queue์ ํ ๋น๋๋ค๊ณ ๋ณผ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทผ๋ฐ ๋น์ฐํ๊ฑฐ ์๋๊ฐ..? ์ธ์ ๋น ํ ํ๋๋ฉด.. ํ๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ์์ ์๋ ์๋ค๋ ๊ฑธ๊น์?? ์๊ฒฌ์ด ์์ผ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์ใ
๋ง๋ฌด๋ฆฌ
์ด๋ ๊ฒ ํด์ ์์ ์ด๋ก ๊ณผ ๋ฌธ์ ์ค์ฌ์ URLSession ๊ณต๋ถํ๊ธฐ๊ฐ ๋ง๋ฌด๋ฆฌ๋์์ต๋๋ค! ์ฌ์ค ๊ณต์ ๋ฌธ์์๋ ํ์ ๋ฌธ์๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ด๋ก๋๋ delegate์ ๋ํ ๋ ์์ธํ ์ด์ผ๊ธฐ๋ค์ด ์์ด์ ๋์ค์ ์๊ฐ์ ๋ด์ ๋ ์์ธํ ์ฝ์ด๋ด์ผ๊ฒ ์ต๋๋ค.
์ฌ์ค ์ด ํฌ์คํธ๋ URLSession์ ์ด๋ค ์ค๋ ๋์์ ๋์๊ฐ๊น? ๋ผ๋ ์ง๋ฌธ์์ ์์ํ๋๋ฐ, ๋ง์ ๊ทธ๋ฐ๋ด์ฉ์ ์์ด์ ์๋ฃ๋ฅผ ๋ ์ฐพ์๋ดค์ด์ใ ใ URLSession์ ์๋์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ ์์ ์ ํ ๋นํ๋ค๊ณ ํ๋ค์.
์๊ฐํด๋ณด๋๊น ๊ทธ๋์ ๋ฉ์ธ ์ค๋ ๋์์ URLSession ์ ํ์คํฌ๋ฅผ ์์ํ๋๋ผ๋ completion handler์์ UI ์ ๋ฐ์ดํธ๋ฅผ ํด์ฃผ๋ ค๋ฉด DIspatchQueue.main.async๋ก ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ง์ ํด์ฃผ์๋ค์.. ์ญ์ ์ด์ค๊ฐํ๊ฒ ์๋๊ฑด ์ ๋๋ก ์๋๊ฒ ์๋๋ผ๋๊ฑธ ์ค๋๋ ๊นจ๋ซ๊ฒ ๋ฉ๋๋ค..