๊ฐ๋ ์ ๋ฆฌ
Swift์์ ๋คํธ์ํฌ ํต์ ์ ์ฑ๊ณผ ์๋ฒ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ์์ ์ ์๋ฏธํ๋ค. ์ฃผ๋ก URLSession์ ์ฌ์ฉํด HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์ JSON ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ์ด๋ฏธ์ง, ํ์ผ ๋ฑ์ ๋ค์ด๋ก๋ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค.
JSONJavaScript Object Notation)์ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ํ ๊ฒฝ๋์ ๋ฐ์ดํฐ ํฌ๋งท์ด๋ค. ๋๋ถ๋ถ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฐ์ดํฐ ๊ตํ์์ ์ฌ์ฉ๋๋ค.
ํน์ง:
Key
-Value
์ ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค. JSON ์์:
{
"name": "John",
"age": 25,
}
APIApplication Programming Interface)๋ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ก ์ํตํ ์ ์๋๋ก ๋๋ ์ค๊ฐ ๋งค๊ฐ์ฒด๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
Codable
์ Swift์์ JSON ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐ์ฒด ๋๋ ํด๋์ค์ ์ฝ๊ฒ ๋ณํํ ์ ์๊ฒ ํด์ฃผ๋ ํ๋กํ ์ฝ์ด๋ค.
struct User: Codable {
let name: String
let age: Int
}
// JSON ๋ฐ์ดํฐ๋ฅผ Swift ๊ฐ์ฒด๋ก ๋์ฝ๋ฉ
if let jsonData = jsonString.data(using: .utf8) {
let user = try? JSONDecoder().decode(User.self, from: jsonData)
}
URL(Uniform Resource Locator)์ ์น ์์์ ์์์ ์ฐพ๊ธฐ ์ํ ์ฃผ์๋ค.
<URL ์์: https://api.example.com/users?name=John>
- ํ๋กํ ์ฝ: https
- ๋๋ฉ์ธ: api.example.com
- ๊ฒฝ๋ก: /users
- ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ: "name=John"
REST API๋ HTTP ํ๋กํ ์ฝ์ ๊ธฐ๋ฐ์ผ๋ก ์์์ CRUD(Create, Read, Update, Delete) ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ ์ํคํ ์ฒ๋ค.
<์ฃผ์ ๋ฉ์๋>
- GET: ๋ฐ์ดํฐ ์กฐํ
- POST: ๋ฐ์ดํฐ ์์ฑ
- PUT: ๋ฐ์ดํฐ ์์
- DELETE: ๋ฐ์ดํฐ ์ญ์
๊ฐ๋ ์ ๋ฆฌ
Swift์์
URLSession
์ ๋คํธ์ํฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ๋ฐ๊ธฐ ์ํ API๋ก, HTTP ์์ฒญ์ ํตํด ์๋ฒ์ ํต์ ํ ๋ ์ฌ์ฉ๋๋ค. ๋น๋๊ธฐ ์์ ์ ์ง์ํ๋ฉฐ, ๋ฐ์ดํฐ ์์ฒญ, ํ์ผ ๋ค์ด๋ก๋ ๋ฐ ์ ๋ก๋์ ๊ฐ์ ๋ค์ํ ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
URLSession
์ ๋คํธ์ํฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ๋ฐ๊ธฐ ์ํ ํด๋์ค๋ค. ๋น๋๊ธฐ์ ์ผ๋ก ์์
์ ์ฒ๋ฆฌํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ๊ฐ์ ํ๋ค.
URLSession
์ ์ค์ ํ ๋ ๋ค์ํ Configuration
์ ์ฌ์ฉํ ์ ์๋ค.
// Configuration ์ฌ์ฉ ์์
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
URLSession
์ ์ธ ๊ฐ์ง ์ฃผ์ ์์
(Task)์ ์ ๊ณตํ๋ค.
// URLSession ์ฌ์ฉ ์์
let url = URL(string: "https://api.example.com/data")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
// ๋ฐ์ดํฐ ์ฒ๋ฆฌ
}
}
task.resume() // ํ์ ํค์๋
์ฌ๊ธฐ์ resume()
๋ฉ์๋๋ Task
๋ฅผ ์คํํ ๋ ๋ง๋์ ์ฌ์ฉํด ์ฃผ์ด์ผ ํ๋ ๋ฉ์๋์ด๋ค.
1๏ธโฃ resume()์ ์ญํ
URLSessionTask(์: dataTask, downloadTask, uploadTask)๋ ๋น๋๊ธฐ ๋คํธ์ํน ์์ ์ ์ํ ๊ฐ์ฒด๋ค. ๊ทธ๋ฌ๋, ๋คํธ์ํฌ ์์ฒญ์ด ์์ฑ๋ ์งํ์๋ ๋ฉ์ถ ์ํ๋ก ์ค๋น๋ง ๋์ด ์์ ๋ฟ, ์๋์ผ๋ก ์คํ๋์ง ์๋๋ค.
resume()
๋ฉ์๋๋ ๋คํธ์ํฌ ์์
์ ์์์ํค๋ ํธ๋ฆฌ๊ฑฐ๋ค. ์ด ๋ฉ์๋๋ฅผ ํธ์ถํด์ผ๋ง ๋คํธ์ํฌ ์์ฒญ์ด ์๋ฒ๋ก ๋ณด๋ด์ง๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ค๋ ์์
์ด ์คํ๋๋ค.
2๏ธโฃ resume()๊ฐ ํ์ํ ์ด์
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ค๋น ์ํ
URLSession
์ ์์ฒญ์ ๋ฐ๋ก ์คํํ์ง ์๊ณ ๋๊ธฐ ์ํ๋ก ๋ง๋ ๋ค.resume()
์ ํธ์ถํ๊ธฐ ์ ๊น์ง๋ ์์
ํ์๋ง ๋ฑ๋ก๋ ์ํ๋ก, ์๋ฌด๋ฐ ๋คํธ์ํฌ ํต์ ๋ ์ผ์ด๋์ง ์๋๋ค.๋ช ํํ ์์ ๊ด๋ฆฌ
3๏ธโฃ resume() ํธ์ถ ์์
let url = URL(string: "https://api.example.com/data")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let data = data {
print("Data received: \(data)")
}
}
// ์์
์ ์์ํ๋ ค๋ฉด ๋ฐ๋์ resume() ํธ์ถ ํ์
task.resume()
4๏ธโฃ resume()์ ํธ์ถํ์ง ์์ผ๋ฉด?
5๏ธโฃ suspend()์์ ๊ด๊ณ
resume()
์ธ์๋, ๋คํธ์ํฌ ์์
์ ์ผ์ ์ค์งํ๋ ค๋ฉด suspend()
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.resume()
๊ณผ suspend()
๋ฅผ ๋ฒ๊ฐ์ ํธ์ถํ์ฌ ์์
์ ์ ์ดํ ์ ์๋ค.task.suspend() // ์์
์ผ์ ์ค์ง
task.resume() // ์ผ์ ์ค์ง ํ ์ฌ๊ฐ
์ฆ, resume()
์ URLSessionTask
์ ์์
์คํ์ ์์ํ๋ ์ค์ํ ๋ฉ์๋๋ค. ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด ๋คํธ์ํฌ ์์
์ด ๋๊ธฐ ์ํ๋ก๋ง ๋จ์, ์์ฒญ๊ณผ ์๋ต ์ฒ๋ฆฌ๊ฐ ์ ํ ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
๋ฐ๋ผ์ URLSession
์์
์ ์ฌ์ฉํ ๋ ๋ฐ๋์ resume()
์ ํธ์ถํด ๋คํธ์ํน ์์
์ ์คํํ๋๋ก ํด์ผ ํ๋ค.
URLRequest
๋ HTTP ์์ฒญ์ ์์ฑํ ๋ ์ฌ์ฉ๋๋ค. ์์ฒญ ๋ฉ์๋, ํค๋, ๋ฐ๋ ๋ฑ์ ์ค์ ํ ์ ์๋ค.
var request = URLRequest(url: url)
request.httpMethod = "POST" // HTTP ๋ฉ์๋ ์ค์
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
var components = URLComponents(string: "https://api.example.com/search")
components?.queryItems = [
URLQueryItem(name: "query", value: "Swift"),
URLQueryItem(name: "page", value: "1")
]
if let url = components?.url {
print(url) // https://api.example.com/search?query=Swift&page=1
}
์ค๋์ JSON ํ์ผ ํ์์ ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ์ ๋ํด ํ์ตํ๊ณ ,
API๋ ๋ฌด์์ธ์ง, Swift์์ ๋คํธ์ํน ํต์ ์ ์ด๋ป๊ฒ ํ๋์ง์ ๋ํด ๊ณต๋ถํ๋ค.
์์ง์ ๋ชจ๋ ์ด๋ ต๊ณ ๋ฏ์ ๊ฐ๋
๋ค์ด๋ผ ๋ฐ๋ณต์ ์ธ ์ฐ์ต๊ณผ ๋ง์ ๊ณต๋ถ๊ฐ ํ์ํ ๊ฒ ๊ฐ๋ค.