๐ŸŽ ์•„์ด-์˜ค-์—์Šค/๐Ÿ“ฑ iOS ๊ฐœ๋ฐœ

[iOS] ๊ณต์‹๋ฌธ์„œ๋กœ ๊ณต๋ถ€ํ•˜๋Š” URLSession

๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด 2022. 1. 11. 18:23
 

Apple Developer Documentation

 

developer.apple.com

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

 

URLSession for HTTP/2 | Apple Developer Forums

I'm confused on how to initiate an HTTP/2 session. I keep seeing that URLSession supports it, but I don't know what that means. I'm on a mac (not iOS) and I've got all the code already to encode/decode the frames that the spec describes. Now I want to make

developer.apple.com

์ด ์Šค๋ ˆ๋“œ๋ฅผ ๋ณด๋ฉด ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์— ๋งž๊ฒŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

 

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๋กœ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ง€์ •ํ•ด์ฃผ์—ˆ๋„ค์š”.. ์—ญ์‹œ ์–ด์ค‘๊ฐ„ํ•˜๊ฒŒ ์•„๋Š”๊ฑด ์ œ๋Œ€๋กœ ์•„๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ๋Š”๊ฑธ ์˜ค๋Š˜๋„ ๊นจ๋‹ซ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค..