Monti

Swift URLSession HTTP ํ†ต์‹  - 1 ๋ณธ๋ฌธ

IOS/Swift

Swift URLSession HTTP ํ†ต์‹  - 1

montt 2022. 9. 30. 21:38
๐ŸŒ

URLSession : HTTP ํ†ต์‹ ํ•˜๊ธฐ

์—ฐ๊ด€๋œ ๋„คํŠธ์›Œํฌ ๋ฐ์ดํ„ฐ ์ „์†ก ํƒœ์Šคํฌ๋“ค์˜ ๊ทธ๋ฃน์„ ์กฐ์ •ํ•˜๋Š” ๊ฐ์ฒด

 

๊ฐœ์š”

URLSession ๋ฐ ๊ด€๋ จ ํด๋ž˜์Šค๋“ค์€ URL์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ์—”๋“œํฌ์ธํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ API๋ฅผ ์ œ๊ณตํ•œ๋‹ค. URLSession์€ ์•ฑ์ด ์‹คํ–‰์ค‘์ด์ง€ ์•Š๊ฑฐ๋‚˜ ์•ฑ์ด ์ผ์‹œ์ •์ง€ ์ƒํƒœ์ผ๋•Œ์—๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋‹ค์šด๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

URL Session์˜ ์ข…๋ฅ˜

ํ•˜๋‚˜์˜ URL session์— ์†ํ•œ task๋“ค์€ ๊ฐ™์€ session configuration ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์ด ๊ฐ์ฒด๋Š” ํ˜ธ์ŠคํŠธ๋‹น ์ƒ์„ฑ ๊ฐ€๋Šฅํ•œ ๋™์‹œ ์ ‘์†๊ฐฏ์ˆ˜๋‚˜ cellular ๋„คํŠธ์›Œํฌ๋ฅผ ํ—ˆ์šฉํ•  ๊ฒƒ์ธ์ง€์™€ ๊ฐ™์€ ์ ‘์† ๋™์ž‘์„ ์ •์˜ํ•œ๋‹ค.

  1. shared๊ธฐ๋ณธ์ ์ธ ์š”์ฒญ์— ์ ํ•ฉํ•œ ์‹ฑ๊ธ€ํ†ค ์„ธ์…˜์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ์•„์ฃผ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  1. default sessionshared session๊ณผ ์ƒ๋‹นํžˆ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ๋” ๋งŽ์€ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ delegate๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ
  1. Ephemeral sessionshared session๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์บ์‹œ๋‚˜ ์ฟ ํ‚ค, ์ž๊ฒฉ์ฆ๋ช…์„ ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜์ง€ ์•Š๋Š”๋‹ค.
  1. Background session์•ฑ์ด ์‹คํ–‰์ค‘์ด์ง€ ์•Š์„ ๋•Œ๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ปจํ…์ธ ๋ฅผ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

 

URL Session Task์˜ ์ข…๋ฅ˜

์„ธ์…˜ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ์—…๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” Task๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํŒŒ์ผ ํ˜•ํƒœ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ , ๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ NSData ๊ฐ์ฒด ํ˜•ํƒœ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

  1. Data taskNSData ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ๋ฐ›๋Š”๋‹ค. Data task๋Š” ์งง๊ณ , ์žฆ์€ ์š”์ฒญ์„ ์„œ๋ฒ„์™€ ์ฃผ๊ณ  ๋ฐ›๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ๋‹ค.
  1. Upload taskdata Task์™€ ๋น„์Šทํ•˜์ง€๋งŒ (์ฃผ๋กœ ํŒŒ์ผ ํ˜•ํƒœ๋กœ) ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์•ฑ์ด ์‹คํ–‰์ค‘์ด์ง€ ์•Š์„ ๋•Œ์—๋„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์—…๋กœ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.
  1. Download taskํŒŒ์ผ์˜ ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค. ๋˜ํ•œ ์•ฑ์ด ์‹คํ–‰์ค‘์ด์ง€ ์•Š์„ ๋•Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋‹ค์šด๋กœ๋“œ์™€ ์—…๋กœ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค.

Session Delegate ์‚ฌ์šฉ

ํ•œ ์„ธ์…˜ ์•ˆ์— ์žˆ๋Š” task๋“ค์€ ๊ณตํ†ต delegate๋ฅผ ๊ณต์œ ํ•œ๋‹ค. delegate๋Š” ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ(์ธ์ฆ ์‹คํŒจ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ๋„์ฐฉํ–ˆ์„ ๋•Œ, ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์„ ๋•Œ ๋“ฑ๋“ฑ)๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๐Ÿ’ก
Session ๊ฐ์ฒด๋Š” ์•ฑ์ด ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ํ•ด๋‹น session์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ฌดํšจํ™”ํ•˜๊ธฐ ์ „๊นŒ์ง€ delegate์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ๋งŒ์•ฝ session์„ ๋ฌดํšจํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด ์•ฑ์ด ์ข…๋ฃŒ๋˜์ง€ ์ „๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

๋น„๋™๊ธฐ์„ฑ๊ณผ 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๊ฐ€ ์ทจ์†Œ๋œ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์ƒ์ˆ˜

์‹ค์Šต


 

'IOS > Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

swift - WKWebView ์ž๋™๋กœ๊ทธ์ธ ๊ตฌํ˜„  (0) 2022.10.03
Swift URLSession HTTP ํ†ต์‹  - 2  (0) 2022.09.30
Swift - NotificationCenter  (0) 2022.09.29
Swift - UserDefault  (0) 2022.09.29
Swift - UITabBarController  (0) 2022.09.28
Comments