์๋ ํ์ธ์~
์ค๋์ URLSession์ ๋ํด์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค : )
์ ํ ๊ฐ๋ฐ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ์ ๋งํฌ ๋จ๊ฒจ๋๋ฆฝ๋๋ค ๐
Apple Developer Documentation
developer.apple.com
URLSession์ด๋?
URLSession์ ๋คํธ์ํฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋ API์ ๋๋ค.
URLSession์ ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๋ฉฐ, HTTP, HTTPS ๋ฐ FTP ๋ฑ์ ํ๋กํ ์ฝ์ ์ง์ํฉ๋๋ค.
URLSession์ NSURLSessionConfiguration ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ์ ๊ตฌ์ฑํ๊ณ , ๋ค์ํ ์ ํ์ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ URLSessionDataTask, URLSessionDownloadTask ๋ฐ URLSessionUploadTask์ ๊ฐ์ ์์ ํด๋์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
URLSession์ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
1. ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ / ์ ๋ก๋ํ๋ ๋ฑ์ API๋ฅผ ์ ๊ณตํด ์ฃผ๋ ํด๋์ค๋ก์ URL์ด ๊ฐ๋ฆฌํค๋ End Point๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
2. ๋ฐ์ดํฐ ์ ์ก, ๋์ ๋ฑ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ฑ ์ ์ค์ ํ ์ ์์ต๋๋ค.
3. ์ ์ก์์์ ๊ธฐ๋ณธ ์ ์ฑ ์ Shared Session์ด๊ณ ์ด์ธ์๋ Session Configure๋ฅผ ์ด์ฉํด Default, Ephemeral, Background Session์ ์์ฑํ ์ ์์ต๋๋ค.
์ข ํฉํด์ ์ค๋ช ํ๋ฉด
URL์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ / ์ ๋ก๋๋ฅผ ํ ์ ์๊ฒ ๋์์ฃผ๋ API๋ก์
๋ค ๊ฐ์ง์ Session Configure๋ฅผ ์ด์ฉํด์ ์ ์ฑ ์ ์ค์ ํ ์ ์์ต๋๋ค.
URLSession์ ์ข ๋ฅ
์ฒซ ๋ฒ์งธ, Shared Session
- ์ฑ๊ธํด ํจํด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋จ์ํ ๋คํธ์ํฌ ์์ฒญ์ ์ฌ์ฉํฉ๋๋ค.
- ๋คํธ์ํฌ ์๋ต์ Completion Handler๋ฅผ ์ด์ฉํด ์ ๋ฌ๋ฐ์ต๋๋ค.
- ์ฅ์ : ๊ตฌํ์ด ์ฝ์ต๋๋ค.
- ๋จ์ : ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ์ก์ ์ง์ํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ์ก์ด๋ผ ํ๋ฉด ๋ง ๊ทธ๋๋ก ๋ค๋ฅธ ์์ ์์๋ ์ง์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ / ์ ๋ก๋ํ ์ ์๋ ๊ฑธ ๋งํฉ๋๋ค. ๋ํ ์ปค์คํฐ๋ง์ด์ง์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋ ๋ฒ์งธ, Default Session
- Shared Session๊ณผ ์ ์ฌํ์ง๋ง ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅํฉ๋๋ค.
- Delegate๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ์ง์ ์ผ๋ก ๋ฐ์์ค๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ธ ๋ฒ์งธ, Ephemeral Session
- Shared Session๊ณผ ๋น์ทํ์ง๋ง ์บ์, ์ฟ ํค, ์ธ์ฆ ์ ๋ณด์ ๊ฐ์ ๊ฒ์ ๊ธฐ๋กํ์ง ์์ต๋๋ค. ํฌ๋กฌ์ ์ํฌ๋ฆฟ ๋ชจ๋์ ์ฌํ๋ฆฌ์ ์ํฌ๋ฆฟ ๋ชจ๋๊ฐ ์ด์ ๋น์ทํ๋๋ค.
๋ค ๋ฒ์งธ, Background Session
- ์์ ๋งํ๋ Share Session์์๋ ๋ถ๊ฐ๋ฅํ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ Session์ผ๋ก ๋ค๋ฅธ ์์ ์ ํน์ ํด๋น ์ฑ์ด ์ข ๋ฃ๋๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ์ ๋ก๋ํ ์ ์์ต๋๋ค.
URL Session Task์ ์ข ๋ฅ
์ธ์ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ์ ํ์ ์ผ๋ก ์ ๋ก๋ํ๊ฑฐ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ Task๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ ๋์คํฌ์ ํ์ผ ํํ๊ฐ ๋ ์๋ ์๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ NSData ๊ฐ์ฒด ํํ์ผ ์๋ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ, Data task
- NSData ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ๋ฐ์ต๋๋ค. Data task๋ ์งง๊ณ , ์ฆ์ ์์ฒญ์ ์๋ฒ์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
- HTTP / GET ์์ฒญ์ ์ฒ๋ฆฌ
๋ ๋ฒ์งธ, Upload task
- data task์ ๋น์ทํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค. ๋ํ ์ฑ์ด ์คํ ์ค์ด์ง ์์ ๋์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ก๋๋ฅผ ์ง์ํ๋๋ค.
- HTTP / POST ์์ฒญ์ ์ฒ๋ฆฌ
์ธ ๋ฒ์งธ, Download task
- ํ์ผ์ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ต๋๋ค. ๋ํ ์ฑ์ด ์คํ ์ค์ด์ง ์์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ค์ด๋ก๋๋ฅผ ์ง์ํฉ๋๋ค.
- HTTP / GET ์์ฒญ์ ์ฒ๋ฆฌ
์์ฑ๋ task๋ฅผ resume() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์คํํ ์ ์์ต๋๋ค.
URLRequest
URLRequest๋ ๋คํธ์ํฌ ์์ฒญ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด์ ๋๋ค.
URLRequest๋ NSURLRequest ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค.
URLRequest ๊ฐ์ฒด๋ ์์ฒญ URL, HTTP ๋ฉ์๋, ํค๋ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
์ด ์ ๋ณด๋ URLSession ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ง๋ค ๋ ์ ๋ฌ๋ฉ๋๋ค.
์์ ๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
let url = URL(string: "https://fu.com/data")
var request = URLRequest(url: url!)
request.httpMethod = "GET"
์ ์ฝ๋์์๋ ์์ฒญ URL์ ์์ฑํ๊ณ , URLRequest๋ฅผ ์์ฑํฉ๋๋ค.
์ดํ HTTP ๋ฉ์๋๋ฅผ GET์ผ๋ก ์ค์ ํ์ฌ ์์ฒญ์ ๋ง๋ญ๋๋ค.
URLResponse
URLResponse๋ ๋คํธ์ํฌ ์๋ต์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด์ ๋๋ค.
URLResponse๋ NSURLResponse ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค.
URLResponse ๊ฐ์ฒด๋ ์๋ต ์ํ ์ฝ๋, ํค๋ ๋ฑ์ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค.
์ด ์ ๋ณด๋ URLSession ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ๋ณด๋ผ ๋ ์๋ต์ ๋ฐ์ ๋ ์ ๋ฌ๋ฉ๋๋ค.
์๋๋ HTTP GET ์์ฒญ์ ๋ํ ์๋ต์ ๋ฐ์ URLResponse ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ๋๋ค.
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let httpResponse = response as? HTTPURLResponse,
(200...299).contains(httpResponse.statusCode) else {
print("Error: invalid response")
return
}
print("Response status code: \(httpResponse.statusCode)")
}
task.resume()
URLSession ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ HTTP GET ์์ฒญ์ ๋ณด๋ธ ์ดํ ์๋ต์ด ์ค๋ฉด URLResponse ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์๋ต ์ํ ์ฝ๋๋ฅผ ํ์ธํ๋ ์์ ์ ๋๋ค.
์์ ์ค๋ช ํ๋ shared session๊ณผ dataTask๋ฅผ ์ด์ฉํ๊ณ ์์ต๋๋ค. ์์ ๊ตฌํํ๋ request๋ฅผ ์ฌ์ฉํด ์์ฒญํ URL, httpMethod๋ฅผ ๋คํธ์ํฌ ์์ฒญ์ ์ถ๊ฐํ๊ณ ์์ต๋๋ค.
URLSessionDataDelegate
์์ ์์ฑํ๋ ์์์์ Completion Handler ํํ๋ก ์๋ต์ ๋ฐ์ ๊ฑธ ํ์ธํ์ค ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ ๋ง๊ณ ๋ URLSessionDataDelegate๋ฅผ ํตํด์๋ ์๋ต์ ํ์ธํ ์ ์์ต๋๋ค.
URLSessionDataDelegate๋ URLSession ๊ฐ์ฒด์ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ
URLSessionDataTask ๋ฐ URLSessionUploadTask์ ํจ๊ป ์๋ํฉ๋๋ค.
์ด ๋ธ๋ฆฌ๊ฒ์ดํธ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋, ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ ๋, ์์ ์ด ์๋ฃ๋ ๋ ๋ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ํธ์ถ๋ฉ๋๋ค.
์๋๋ URLSessionDataDelegate๋ฅผ ๊ตฌํํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ์์ ์ ๋๋ค.
class ViewController: UIViewController, URLSessionDataDelegate {
override func viewDidLoad() {
super.viewDidLoad()
}
func getData() {
let url = URL(string: "https://fu.com/data")
var request = URLRequest(url: url!)
request.httpMethod = "GET"
let session = URLSession(configuration: .default, delegate: self, delegateQueue: nil)
let task = session.dataTask(with: request)
task.resume()
}
func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
// ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ ํธ์ถ๋๋ ๋ฉ์๋
print("๋ฐ์ ๋ฐ์ดํฐ: \(data)")
}
func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
// ์์
์ด ์๋ฃ๋ ๋ ํธ์ถ๋๋ ๋ฉ์๋
if let error = error {
print("Error: \(error.localizedDescription)")
} else {
print("์ฑ๊ณต์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ใ
ใท์์ต๋๋ค.")
}
}
}
URLSession ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋, delegate ๋งค๊ฐ๋ณ์์ self๋ฅผ ์ ๋ฌํ์ฌ ์ด ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ดํ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ฉด, urlSession(:dataTask:didReceive:) ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
์์ ์ด ์๋ฃ๋๋ฉด, urlSession(:task:didCompleteWithError:) ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
์์ ์์ ์์๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋๋ง๋ค print๋ฌธ์ ์ฌ์ฉํ๊ณ ์์ง๋ง ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ฑฐ๋ UI์ ํ์ํ๋ ๋ฑ์ ์์ ์ ์ํํ์๋ฉด ๋ฉ๋๋ค.
URLSession, URLRequest, URLResponse์ ๋ํด์ ์ ๋ฆฌํด ๋ดค์ต๋๋ค.
์๋ชป๋ ์ ์ด ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์ : )
๊ทธ๋ผ ์ด๋ง ๐๐ป ๐๐ป ๐๐ป
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๋๋ ์คํ์์ค์ ๊ธฐ์ฌํด๋ณด๊ณ ์ถ๋ค (๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ ๋ฐฉ๋ฒ) (0) | 2022.02.08 |
---|---|
[Swift] Moya๋ฅผ ์ฌ์ฉํด๋ด ์๋ค. (0) | 2022.02.07 |
[Swift] R.swift SPM์ผ๋ก ์ค์นํด๋ณด๊ธฐ (0) | 2022.02.06 |
[Swift] Foundation Framework์ ๋ํด์ (0) | 2022.02.05 |
[Swift] Codable ( Decodable & Encodable ) ์ ๋ํด์ (0) | 2021.12.22 |