์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- GCD
- ๊ณ ๋์ kit
- Til
- ์ด์งํ์
- concurrency
- ๊ธฐ์ด๋ฌธ๋ฒ
- binarySearch
- APPJAM
- SwiftUI ํํ ๋ฆฌ์ผ
- dfs
- 0์ด๋์ด์๋๊ธธ
- IOS
- DynamicProgramming
- Swift
- SQL
- URLSession
- SwiftUI
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- ํ๋ก๊ทธ๋๋จธ์ค
- SOPT
- duno
- algorithm
- SwiftUI Tutorials
- BFS
- ๋์ ๊ณํ๋ฒ
- GroupBy
- algoritm
- ์ฐ์ํ์ค๋ถ๋ถ์์ด์ํฉ
- discardableResult
- HAVIT
- Today
- Total
suvera-dev ๐ฅฆ
iOS ) URLSession ์์๋ณด๊ธฐ ๋ณธ๋ฌธ
์ค๋์ ์ ๊ฐ ์ต๊ทผ์ ์ผ๋ ๋ฑ๋ ์ฐ๊ฒ ๋ URLSession์ ๊ณต๋ถํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค !
์ธ๋ฏธ๋ ๋ Alamofire ๋ฐฐ์ฐ๊ณ .. ํฉ๋ ์ธ๋ฏธ๋์์๋ Moya ํ๊ณ .. ์ฑ์ผ์์๋ ์ด์ฉ๋ค URLSession์ ํ๊ฒ ๋์๋๋ ๋ํผ๋ ๐
์๋ฒํต์ ๋ ๋์ฒด ๋ญ๋ฐ..
์ด๋๋ก๋ ์๋๊ฒ ๋ค ์ถ์ด์ URLSession, Alamofire, Moya ์์ผ๋ก ๋ค์ ๊ฐ๋ ๋ถํฐ ์ค์ ๊น์ง .. ๊ณต๋ถํด๋ณด๋ ค๊ณ ํฉ๋๋ค :)
์ผ๋จ ์ ๊ฐ ๊ฐ์ฅ ์ต๊ทผ์ URLSession์ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ํ๋๋ฐ ๊ทธ๋ฅ.. ์๋ฌด ๊ฒ๋ ๋ชจ๋ฅด๊ณ ํ๋ฃจ๋ฃฉ ์จ๋ฒ๋ ธ๋ค์...
URLSession
iOS ์ฑ์์ ์๋ฒ์ ํต์ ํ๊ธฐ ์ํด ์ ํ์ URLSession์ด๋ผ๋ API๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
iOS ์ฑ ํต์ ์์ ์ ๋ช ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Alamofire์ ๊ธฐ๋ฐ์ด ๋๋ API๋ก ์๋ฒ์์ ๋ฐ์ดํฐ ๊ต๋ฅ๋ฅผ ์ํด์๋ ํ์์ ์ผ๋ก ์์์ผํ๋ API !
URLSession์ Request์ Response
- URLSession์ ๋ค๋ฅธ HTTP ํต์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Request์ Response๋ฅผ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ก ๊ฐ์ง
โจRequest
- URL ๊ฐ์ฒด๋ฅผ ํตํด ์ง์ ํต์ ํ๋ ํํ
- URLRequest ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ ์ต์ ์ ์ค์ ํ์ฌ ํต์ ํ๋ ํํ
โจResponse
- ์ค์ ๋ Task์ Completion Handler ํํ๋ก response๋ฅผ ๋ฐ๊ธฐ
- URLSessionDelgate๋ฅผ ํตํด ์ง์ ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ํํ
์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋จํ response๋ฅผ ์์ฑํ ๋์๋ Completion Handler๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ฑ์ด background ์ํ๋ก ๋ค์ด๊ฐ ๋์๋ ํ์ผ ๋ค์ด๋ก๋๋ฅผ ์ง์ํ๋๋ก ์ค์ ํ๊ฑฐ๋, ์ธ์ฆ๊ณผ ์บ์ฑ์ default ์ต์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ์ํฉ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ Delegate ํจํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ฐ๋ฐ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ถ๊ฐ ์ค๋ช !
URLSession ์ ํน์ ํ URL๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ ๋ก๋ ํ๊ธฐ ์ํ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ด๋ จ Delgegate๋ URLSessionDelegate ์ URLSessionTaskDelegate ๊ฐ ์์ต๋๋ค.
์ด Delegate๋ค์ ํ์ฉํ์ฌ ์ธ์ฆ์ ์ง์ํ๊ฑฐ๋ redirection, task๋๋จ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ ์๋ค๊ณ ํฉ๋๋ค.
session์ configureํ๊ธฐ ์ํด์ URLSessionConfiguration ๋ฅผ ์ฌ์ฉํฉ๋๋ค. configuration์ ํตํด cache์ cookie๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ง, ํต์ ๋ง์ connection์ ํ์ฉํ ์ง ๋ฑ์ ์ค์ ํ ์ ์๋ค๊ณ ํฉ๋๋ค.
URLSession์ ์ด๋์ ๋ผ์ด์ ์๋ configuration์ด ๊ผญ ๋ค์ด๊ฐ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ์ค๋ช ์ ์ ์ด๋ด๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค์ ํํ . ์ผ๋จ ๋ ์์๋ด ์๋ค..
URLSession์ ๊ธฐ๋ณธ ์งํ ์์
- Session configuration์ ๊ฒฐ์ ํ๊ณ , Session์ ์์ฑ
- ํต์ ํ URL๊ณผ Request ๊ฐ์ฒด๋ฅผ ์ค์
- ์ฌ์ฉํ Task๋ฅผ ๊ฒฐ์ ํ๊ณ , ๊ทธ์ ๋ง๋ Completion Handler๋ Delegate ๋ฉ์๋๋ค์ ์์ฑ
- ํด๋น Task๋ฅผ ์คํ
- Task ์๋ฃ ํ Completion Handler๊ฐ ์คํ
์๋ ๊ทธ๋์ configuration..? task...? ๋๋ค ๋ญ๋ฐ... ใ ใ ใ ใ ใ ใ ใ
1. URLSessionConfiguration
- URLSession์ ์์ฑํ๊ธฐ ์ํด์ ํ์ํ ์์
- Configuration์ ์์ฑํ ๋๋ URLSession ์ ์ฑ ์ ๋ฐ๋ผ์ default, ephemeral, background ์ธ ๊ฐ์ง ํํ๋ก ์์ฑ
- Default Session: ๊ธฐ๋ณธ์ ์ธ Session์ผ๋ก ๋์คํฌ ๊ธฐ๋ฐ ์บ์ฑ์ ์ง์ํฉ๋๋ค.
- Ephemeral Session: ์ด๋ ํ ๋ฐ์ดํฐ๋ ์ ์ฅํ์ง ์๋ ํํ์ ์ธ์ ์ ๋๋ค. ์ฟ ํค๋ ์บ์๋ฅผ ์ ์ฅํ์ง ์๋ ์ ์ฑ ์ ๊ฐ์ ธ๊ฐ ๋ (ex. Safari์ ๊ฐ์ธ์ ๋ณด๋ณดํธ ๋ชจ๋)
- Background Session: ์ฑ์ด ์ข ๋ฃ๋ ์ดํ์๋ ํต์ ์ด ์ด๋ค์ง๋ ๊ฒ์ ์ง์ํ๋ ์ธ์ ์ ๋๋ค. ์ฑ์ด ๋ฐฑ๊ทธ๋ผ์ด๋์ ์๋ ์ํฉ์์ ์ปจํ ์ธ ๋ค์ด๋ก๋, ์ ๋ก๋๋ฅผ ํ ๋ ์ฌ์ฉ
2. URLSessionTask
- Task ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก Session ๊ฐ์ฒด๊ฐ ์๋ฒ๋ก ์์ฒญ์ ๋ณด๋ธ ํ, ์๋ต์ ๋ฐ์ ๋ URL ๊ธฐ๋ฐ์ ๋ด์ฉ๋ค์ ๋ฐ๋(retrieve) ์ญํ ์ ํฉ๋๋ค. 3๊ฐ์ง ์ข ๋ฅ์ Task๊ฐ ์ง์๋ฉ๋๋ค.
- Data Task - HTTP์ ๊ฐ์ข ๋ฉ์๋๋ฅผ ์ด์ฉํด ์๋ฒ๋ก๋ถํฐ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ Data ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๋ ์์ ์ ์ํ(Response ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ฒ๋ฆฌ)
- Download Task - ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์์ ํ์ผ์ ํํ๋ก ์ ์ฅํ๋ ์์ ์ ์ํ. ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ด๋ก๋ ์ง์ (์๋ฒ์์ ์๋ต์ผ๋ก ์ค ๋ฐ์ดํฐ๋ฅผ ํ์ผ์ ์ ์ฅํด์ฃผ๋ task)
- Upload Task - ์ ํ๋ฆฌ์ผ์ด์ ์์ ์น ์๋ฒ๋ก Data ๊ฐ์ฒด ๋๋ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ์ ๋ก๋ํ๋ ์์ ์ ์ํ (๋ฐ์ดํฐ๋ฅผ request body์ ๋ฃ์ด์ ์๋ฒ์ ์ ๋ก๋ํ๋ task)
JSON, XML, HTML ๋ฐ์ดํฐ ๋ฑ ๋จ์ํ ๋ฐ์ดํฐ์ ์ ์ก์๋ ์ฃผ๋ก ๋ฐ์ดํฐ ์์ ์ ์ฌ์ฉํ๋ฉฐ, ์ฉ๋์ด ํฐ ํ์ผ์ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ํ์ธ ๊ฒฝ์ฐ์๋ ์ ๋ฌํ ์ ์๋๋ก ์ ๋ก๋(๋ค์ด๋ก๋) ์์ ์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
- URLSessionTask๋ฅผ ์ดํดํ๋๋ฐ ๋์์ด ๋์๋ ์์๋ฅผ ์ ์ ๊ฐ์ ธ์๋ณด์๋ฉด ..
์๋ฅผ ๋ค์ด, URLSession์ ์น ๋ธ๋ผ์ฐ์ ๋ผ๊ณ ์๊ฐํ๋ฉด ๊ทธ ์์ ์ฌ๋ฌ ํญ๋ค์ด ์์ ๊ฑฐ ์๋์์ฌ ?? ํฐ์คํ ๋ฆฌ.. ๋ค์ด๋ฒ.. ๋ฑ๋ฑ ์ฌ๋ฌ ์ฌ์ดํธ๋ค ?
๊ทธ๋ฐ ์น ์ฌ์ดํธ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ๋ก๋ํ๋ ํญ์ URLSessionTask๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค !
๊ทธ๋ฌ๋ฉด ํ๋์ URLSession์๋ ์ฌ๋ฌ URLSessionTask๊ฐ ๋ค๋ฅธ ์น ์ฌ์ดํธ๋ก ์์ฒญ์ ๋ณด๋ผ ์ ์๊ฒ ์ฃต !
- ๊ทธ๋ฆฌ๊ณ URLSession ๋คํธ์ํน ์์๋ฅผ ๋ ๊ฐ๋จํ๊ฒ ์ถ์ฝํ์๋ฉด..
- URL ๋ง๋ค๊ธฐ
- URLSession ๋ง๋ค๊ธฐ
- URLSession ์ธ์คํด์ค์๊ฒ task ์ฃผ๊ธฐ
- task ์์ํ๊ธฐ task.resume()
์ด์ ํ๋ฒ ์ฝ๋๋ฅผ ๋ด๋ณด๋๋ก ํ ๊ฒ์ !
1๋จ๊ณ : URL ๋ง๋ค๊ธฐ
2๋จ๊ณ : URLSession ๋ง๋ค๊ธฐ
func getData() {
if let url = URL(string: APIConstants.sampleURL) {
let session = URLSession(configuration: .default)
}
}
- APIConstants๋ผ๋ ํ์ผ์ sampleURL ๋ก url ์ฃผ์๋ฅผ ๋ฃ์ด๋์์ต๋๋ค!
- default session์ ์์ฑ
3๋จ๊ณ : URLSession ์ธ์คํด์ค์๊ฒ Task ์ฃผ๊ธฐ !!
open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
URLSession ์์ ๋ค์ด์๋ dataTask๋ผ๋ ๋ฉ์๋๋ฅผ ์์ธํ ์ดํด๋ณด๋ฉด ...
- ์ง์ ๋ URL์ ๋ด์ฉ์ ๊ฒ์ํ๋ ์์ ์ ๋ง๋ ๋ค์, ์๋ฃ์ ํด๋ก์ ํธ์ถ ( comletionHandler )
- completionHandler๋ก escaping closure ๊ฐ ๋ค์ด์์ . (๊ธฐ๋ณธ์ ์ผ๋ก ๋ด๋ถ์์ ๋น๋๊ธฐ์ฒ๋ฆฌ )
- ํด๋ก์ ์์ escaping ์ด ์์ผ๋ฉด, ํจ์์ ์์ ์ด ์๋ฃ๋ ํ์ ํด๋ก์ ๊ฐ ํธ์ถ๋ฉ๋๋ค.
func getData() {
if let url = URL(string: APIConstants.sampleURL) {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
// error๊ฐ ์กด์ฌํ๋ฉด ์ข
๋ฃ
guard error == nil else { return }
// status ์ฝ๋๊ฐ 200๋ฒ๋์ฌ์ผ ์ฑ๊ณต์ ์ธ ๋คํธ์ํฌ๋ผ ํ๋จ
let successsRange = 200..<300
guard let statusCode = (response as? HTTPURLResponse)?.statusCode,
successsRange.contains(statusCode) else { return }
guard let resultData = data else { return }
}
task.resume()
}
}
- completionHandler๋ก ๋ฐ์์จ data, response, error๋ค์ ๊ฐ๊ฐ ๋ฐ์์ ์ฒ๋ฆฌํด์ฃผ๋ฉด๋ฉ๋๋ค !
- 3๊ฐ์ง ๋ชจ๋ ์ต์ ๋ ํํ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ธ๋ฉ์ด ํ์ํฉ๋๋ค
์์ ์ ๋ง๋ ํ์๋ resume() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์์ํฉ๋๋ค !
< ์ ๋ฆฌ >
๋งค๊ฐ๋ณ์
1. request
- URL : URL ์์ฒญ ๊ฐ์ฒด
2. completionHandler : ๋ก๋ ์์ฒญ์ด ์๋ฃ๋๋ฉด ํธ์ถํ ํด๋ก์
- data: ์๋ฒ์์ ๋ฐํ๋ ๋ฐ์ดํฐ
- response: HTTP ํค๋ ๋ฐ ์ํ ์ฝ๋์ ๊ฐ์ ์๋ต ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๊ฐ์ฒด
- error : ์์ฒญ์ด ์คํจํ ์ด์
+++ 3๊ฐ์ง ์ ๋ถ optional ํํ !
๋ฆฌํด ๊ฐ : ์ ์ธ์ ๋ฐ์ดํฐ task
4๋จ๊ณ : ๋ฐ์ ๋ฐ์ดํฐ ํ์ธ !
func getData() {
if let url = URL(string: APIConstants.sampleURL) {
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
// error๊ฐ ์กด์ฌํ๋ฉด ์ข
๋ฃ
guard error == nil else { return }
// status ์ฝ๋๊ฐ 200๋ฒ๋์ฌ์ผ ์ฑ๊ณต์ ์ธ ๋คํธ์ํฌ๋ผ ํ๋จ
let successsRange = 200..<300
guard let statusCode = (response as? HTTPURLResponse)?.statusCode,
successsRange.contains(statusCode) else { return }
guard let JSONData = data else { return }
let dataString = String(data: JSONData, encoding: .utf8)
print(dataString!)
}
task.resume()
}
}
- data๋ฅผ ๋ฐ์ ์คํธ๋งํ์์ผ๋ก ์ ๋ค์ด์๋์ง ํ์ธ ์ดํ JSON๊ฐ์ฒด ๋์ฝ๋ ๊ณผ์ ์ ์งํํ์์ต๋๋ค !
5๋จ๊ณ : ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋์ฝ๋ฉํ๊ธฐ + ํ๋กํผํฐ์ ์ ์ฅ ํ, reload
do {
let decodeData = try decoder.decode(Category.self, from: JSONData)
self.cateogories = decodeData
DispatchQueue.main.async {
self.tableview.reloadData()
}
} catch {
// ๋์ฝ๋ฉ ์๋ฌ
print(error)
- data๋ฅผ ๋ฐ์์ ๋์ฝ๋ฉํ๋ ๊ณผ์ ์์ ๋์ฝ๋ฉ ์๋ฌ ํธ๋ค๋ง์ ํด์ฃผ์์ต๋๋ค.
- ์ ์์ ์ผ๋ก ๋์ฝ๋ฉ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๊ฒฝ์ฐ, ๋ทฐ์ปจ์์ ๋ง๋ ํ๋กํผํฐ์ ์ ์ฅ์ ํด์ค๋๋ค
- DispatchQueue๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ ๋ทฐ๋ฅผ reload ํด์ค๋๋ค.
++ ์ถ๊ฐ )
ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ณดํต URLSession์ ๋ง๋ค์ด์ฐ๊ธฐ๋ณด๋ค๋, shared๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
URLSession์ shared๋ผ๋ ๋ณ์๋ฅผ ํตํด ์ฑ๊ธํค ๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ํธํ๊ฒ URLSession์ ํจ์๋ค์ ์ฌ์ฉํ ์ ์์์ฃ !
shared๋ฅผ ์ฐ๋ฉด ํธํ์ง๋ง ์ ํ์ด ์์ต๋๋ค.
shared session์ delegate๋ ์๊ณ , ์ปค์คํฐ๋ง์ด์ง๋ configuration๋ ์๊ธฐ๋๋ฌธ์ ๋น์ฐํ ์ ํ์ด ์์ต๋๋ค.
shared๋ฅผ ์ฌ์ฉํ ๋ ์๋์ฒ๋ผ session์ ๋ฐ๋ก ๋ง๋ค์ง ์๊ณ , ๋ฐ๋ก shared ๋ณ์๋ฅผ ํตํด ์ ๊ทผํฉ๋๋ค !
let task = URLSession.shared.dataTask(with: url) {
...
}
+ ์์ ์ฝ๋ : ์ ํ๋ธ Smile Han ๋์ ๋ฐ์ค์คํผ์ค ์ฑ ๋ง๋ค๊ธฐ ๊ฐ์ข๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
iOS) WKWebView (0) | 2022.03.28 |
---|---|
iOS) Modal dismissํ ํ CollectionView reload ํ๊ธฐ (0) | 2022.03.28 |
iOS ) GCD ์ฌ์ฉ์ ์ฃผ์ํด์ผํ ์ฌํญ (0) | 2022.02.06 |
iOS ) iOS 15 UIButton.ConfigurationUpdateHandler (0) | 2022.02.05 |
iOS) CollectionView Cell - Drag & Drop (0) | 2022.02.01 |