URLSession : HTTP ํต์ ํ๊ธฐ
์ฐ๊ด๋ ๋คํธ์ํฌ ๋ฐ์ดํฐ ์ ์ก ํ์คํฌ๋ค์ ๊ทธ๋ฃน์ ์กฐ์ ํ๋ ๊ฐ์ฒด
๊ฐ์
URLSession ๋ฐ ๊ด๋ จ ํด๋์ค๋ค์ URL์ด ๊ฐ๋ฆฌํค๋ ์๋ํฌ์ธํธ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ์ ๋ก๋ํ๊ธฐ ์ํ API๋ฅผ ์ ๊ณตํ๋ค. URLSession์ ์ฑ์ด ์คํ์ค์ด์ง ์๊ฑฐ๋ ์ฑ์ด ์ผ์์ ์ง ์ํ์ผ๋์๋ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋ค์ด๋ก๋๋ฅผ ์ํํ ์ ์๋๋ก ํด์ค๋ค.
URL Session์ ์ข ๋ฅ
ํ๋์ URL session์ ์ํ task๋ค์ ๊ฐ์ session configuration ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ค. ์ด ๊ฐ์ฒด๋ ํธ์คํธ๋น ์์ฑ ๊ฐ๋ฅํ ๋์ ์ ์๊ฐฏ์๋ cellular ๋คํธ์ํฌ๋ฅผ ํ์ฉํ ๊ฒ์ธ์ง์ ๊ฐ์ ์ ์ ๋์์ ์ ์ํ๋ค.
- shared๊ธฐ๋ณธ์ ์ธ ์์ฒญ์ ์ ํฉํ ์ฑ๊ธํค ์ธ์ ์ผ๋ก ์์ ๋กญ๊ฒ ์ปค์คํฐ๋ง์ด์งํ ์๋ ์์ง๋ง ์์ฃผ ์ ํ์ ์ธ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋ค๋ฉด ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
- default sessionshared session๊ณผ ์๋นํ ๋น์ทํ๊ฒ ๋์ํ์ง๋ง ๋ ๋ง์ ์ค์ ์ด ๊ฐ๋ฅํ๋ฉฐ delegate๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ง์ ์ผ๋ก ๋ฐ์์ค๋ ๊ฒ์ด ๊ฐ๋ฅ
- Ephemeral sessionshared session๊ณผ ๋น์ทํ์ง๋ง ์บ์๋ ์ฟ ํค, ์๊ฒฉ์ฆ๋ช ์ ๋์คํฌ์ ๊ธฐ๋กํ์ง ์๋๋ค.
- Background session์ฑ์ด ์คํ์ค์ด์ง ์์ ๋๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ปจํ ์ธ ๋ฅผ ์ ๋ก๋ํ๊ฑฐ๋ ๋ค์ด๋ก๋ํ ์ ์๊ฒ ํด์ค๋ค.
URL Session Task์ ์ข ๋ฅ
์ธ์ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ํ์ ์ผ๋ก ์ ๋ก๋ํ๊ฑฐ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ Task๋ฅผ ์์ฑํ ์ ์๋ค. ๋ฐ์ดํฐ๋ ํ์ผ ํํ๊ฐ ๋ ์๋ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ ์์ NSData ๊ฐ์ฒด ํํ์ผ ์๋ ์๋ค.
- Data taskNSData ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ๋ฐ๋๋ค. Data task๋ ์งง๊ณ , ์ฆ์ ์์ฒญ์ ์๋ฒ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ก๋ค.
- Upload taskdata Task์ ๋น์ทํ์ง๋ง (์ฃผ๋ก ํ์ผ ํํ๋ก) ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ค. ๋ํ ์ฑ์ด ์คํ์ค์ด์ง ์์ ๋์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ก๋๋ฅผ ์ง์ํ๋ค.
- Download taskํ์ผ์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ๋ค. ๋ํ ์ฑ์ด ์คํ์ค์ด์ง ์์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ด๋ก๋์ ์ ๋ก๋๋ฅผ ์ง์ํ๋ค.
Session Delegate ์ฌ์ฉ
ํ ์ธ์ ์์ ์๋ task๋ค์ ๊ณตํต delegate๋ฅผ ๊ณต์ ํ๋ค. delegate๋ ๋ค์ํ ์ด๋ฒคํธ(์ธ์ฆ ์คํจ, ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ ๋์ฐฉํ์ ๋, ๋ฐ์ดํฐ๊ฐ ์บ์ํ ์ค๋น๊ฐ ๋์์ ๋ ๋ฑ๋ฑ)๊ฐ ๋ฐ์ํ์๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ๋ฐ์ ์ ์๊ฒ ํด์ค๋ค.
๋น๋๊ธฐ์ฑ๊ณผ URL session
๋๋ถ๋ถ์ ๋คํธ์ํน API๋ค๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก URLSession API๋ ๋น๋๊ธฐ์ ์ด๋ค. ์ด API๋ ํธ์ถ๋๋ ๋ฉ์๋์ ๋ฐ๋ผ ๋๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
- ์ ์ก์ด ์ฑ๊ณต์ ์ผ๋ก ๋๋ฌ๊ฑฐ๋ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ completion handler ๋ธ๋ก์ ํธ์ถ
- ๋ฐ์ดํฐ๊ฐ ์์ ๋๊ณ ์ ์ก์ด ์๋ฃ๋ ํ์ delegate๊ฐ ๋ฉ์๋๋ฅผ ํธ์ถ
URLSession API๋ Delegate๋ฅผ ํตํด์ ์ ๋ณด๋ค์ ์ ๋ฌํ๋ ๊ฒ ์ธ์๋ status์ progress ํ๋กํผํฐ๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ task์ ํ์ฌ ์ํ์ ๊ธฐ๋ฐํ์ฌ ํ๋ก๊ทธ๋๋ฐ์ ์ธ ๋ฐฉ์์ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋๋ฐ ๋์์ ์ค๋ค.
URL Session์ ๋ํ task์ ์ทจ์, ์ฌ์์, ์ผ์์ ์ง ๋ฐ ์ฌ๊ฐ๋ฅผ ์ง์ํ๋ฉฐ ์ทจ์, ์ผ์์ ์ง, ์คํจํ ๋ค์ด๋ก๋๋ ํด๋น ์ง์ ๋ถํฐ ์ฌ๊ฐํ๋๋ก ํ ์ ์๋ค.
shared ์ธ์ ์ฌ์ฉํ๊ธฐ
- class var shared: URLSession ๊ณต์ ์ฑ๊ธํค ์ธ์ ๊ฐ์ฒด
์ธ์ ์์ฑํ๊ธฐ
- init(configuration: URLSessionConfiguration) ํน์ session configuration์ผ๋ก ์ธ์ ์ ์์ฑํฉ๋๋ค.
- init(configuration: URLSessionConfiguration, delegate: URLSessionDelegate?, delegateQueue: OperationQeueu?) ํน์ session configuration๊ณผ delegate, delegateQueue๋ก ์ธ์ ์ ์์ฑํฉ๋๋ค.
- class URLSessionConfiguration URL session์ ๋์๊ณผ ์ ์ฑ ์ ์ ์ํ๋ configuration ๊ฐ์ฒด
- var configuration: URLSessionConfiguration session configuration ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ
Delegate๋ก ์์ ํ๊ธฐ
- var delegate: URLSessionDelegate? delegate๋ ์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง ๋ ํ ๋น๋ฉ๋๋ค.
- protocol URLSessionDelegate URL session ์ธ์คํด์ค๊ฐ (์ธ์ ์๋ช ์ฃผ๊ธฐ ๋ณ๊ฒฝ ๊ฐ์) ์ธ์ ์์ค์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ํธ์ถํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ํ๋กํ ์ฝ
- protocol URLSessionTaskDelegate URL session ์ธ์คํด์ค๊ฐ task ์์ค์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ ํธ์ถํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ํ๋กํ ์ฝ
- var delegateQueue: OperationQueue ์ด operation queue๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ์ ๊ณต๋ฉ๋๋ค.
Data Task๋ฅผ ์ธ์ ์ ์ถ๊ฐํ๊ธฐ
- func dataTask(with: URL) -> URLSessionDataTask ํน์ URL์ ์ปจํ ์ธ ๋ฅผ ๋ถ๋ฌ์ค๋ task๋ฅผ ์์ฑํฉ๋๋ค.
- func dataTask(with: URL, completionHandler: (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask ํน์ URL์ ์ปจํ ์ธ ๋ฅผ ๋ถ๋ฌ์์ ํ์ผ๋ก ์ ์ฅํ๊ณ , ์๋ฃ ํ์ handler๋ฅผ ํธ์ถํ๋ download task๋ฅผ ์์ฑํฉ๋๋ค.
- func downloadTask(with: URLRequest) -> URLSessionDownloadTask ํน์ URLRequest ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก URL์ ์ปจํ ์ธ ๋ฅผ ๋ถ๋ฌ์์ ํ์ผ์ ์ ์ฅํ๋ download task๋ฅผ ์์ฑํฉ๋๋ค.
- func downloadTask(with: URLRequest, completionHandler: (URL?, URLResponse?, Error?) -> Void) -> URLSessionDownloadTask ํน์ URLRequest ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ ์ธ ๋ฅผ ๋ถ๋ฌ์์ ํ์ผ๋ก ์ ์ฅํ๊ณ , ์๋ฃ ํ์ handler๋ฅผ ํธ์ถํ๋ download task๋ฅผ ์์ฑํฉ๋๋ค.
- func downloadTask(withResumeData: Data) -> URLSessionDownloadTask ์ด์ ์ ์ต์๋์๊ฑฐ๋ ์คํจํ ๋ค์ด๋ก๋๋ฅผ ์ฌ๊ฐํ๋ download task๋ฅผ ์์ฑํฉ๋๋ค.
- func downloadTask(withResumeData: Data, completionHandler: (URL?, URLResponse?, Error?) -> Void) -> URLSessionDownloadTask ์ด์ ์ ์ต์๋์๊ฑฐ๋ ์คํจํ ๋ค์ด๋ก๋๋ฅผ ์ฌ๊ฐํ๊ณ ์๋ฃ ํ์ handler๋ฅผ ํธ์ถํ๋ download task๋ฅผ ์์ฑํฉ๋๋ค.
- class URLSessionDownloadTask ๋ค์ด๋ก๋๋ ๋ฐ์ดํฐ๋ฅผ ํ์ผ๋ก ์ ์ฅํ๋ URL session task
- protocol URLSessionDownloadDelegate A protocol defining methods that URL session instances call on their delegates to handle task-level events specific to data and upload tasks.
์ธ์ ๊ด๋ฆฌ
- func finishTasksAndInvalidate() ์ธ์ ์ ๋ฌดํจํํ๊ณ ์๋ฃ๋์ง ์์ task๋ฅผ ์๋ฃ์ํต๋๋ค.
- func flush(completionHandler: () -> Void) Flushes cookies and credentials to disk, clears transient caches, and ensures that future requests occur on a new TCP connection.
- func getTasksWithCompletionHandler(([URLSessionDataTask], [URLSessionUploadTask], [URLSessionDownloadTask]) -> Void) ์ธ์ ๋ด ๋ชจ๋ data, upload, download task๋ค์ completion ์ฝ๋ฐฑ์ ๋น๋๊ธฐ ํธ์ถํฉ๋๋ค.
- func getAllTasks(completionHandler: ([URLSessionTask]) -> Void) ์ธ์ ๋ด ๋ชจ๋ task๋ค์ completion ์ฝ๋ฐฑ์ ๋น๋๊ธฐ ํธ์ถํฉ๋๋ค.
- func invalidateAndCancel() ๋ชจ๋ ์๋ฃ๋์ง ์์ task๋ค์ ์ทจ์ํ๊ณ ์ธ์ ์ ๋ฌดํจํ์ํต๋๋ค.
- func reset(completionHandler: () -> Void) ๋ชจ๋ ์ฟ ํค์ ์บ์, ์๊ฒฉ์ฆ๋ช ์ ์ฅ์๋ฅผ ๋น์ฐ๊ณ , ๋์คํฌ ํ์ผ์ ์ง์ฐ๋ฉฐ, ์งํ์ค์ธ ๋ค์ด๋ก๋๋ฅผ ๋์คํฌ๋ก ์ฎ๊ฒจ์ ํฅํ์ ์์ฒญ์ด ์ ์์ผ์์ ๋ฐ์ํ ์ ์๋๋ก ํฉ๋๋ค.
- var sessionDescription: String? ์ธ์ ์ ๋ํด์ ์ฑ์ด ์ ์ํ ์ค๋ช ๋ ์ด๋ธ
์๋ฌ ์ฒ๋ฆฌ
- NSURLSessioin-Specific NSError userInfo Dictionary Keys NSURLSession API์์ ๋ฐํํ NSError ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉ๋๋ ํค.
- Background Task Cancellation ๋ฐฑ๊ทธ๋ผ์ด๋ task๊ฐ ์ทจ์๋ ์ด์ ๋ฅผ ์ค๋ช ํ๋ ์์
์ค์ต