URLSession은 iOS에서 제공하는 HTTP를 이용한 네트워킹을 통해 데이터를 주고받을 수 있게 도와주는 API를 제공해주는 클래스입니다. URLSession은 Thread-Safty하기 때문에 어떤 스레드에서든 자유롭게 Session과 Task를 생성할 수 있습니다.
URLSession은 URLSessionConfiguration을 통해 생성할 수 있습니다.
이렇게 생성된 URLSession을 통해 한 개 이상의 URLSessionTask를 생성할 수 있으며, 이 URLSessionTask를 통해 실제로 서버와 통신을 할 수 있습니다.
URLSessionConfiguration은 아래의 세가지 타입으로 만들 수 있습니다.
URLSessionTask 또한 작업에 따라 세가지로 분류할 수 있습니다.
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
var urlComponents = URLComponents(string: "https://itunes.apple.com/search?media=music&entity=song&term=IU")!
let requestURL = urlComponents.url!
위의 코드를 통해 URLConfiguration의 객체를 생성하고 이를 통해 URLSession을 생성한 것을 확인할 수 있습니다.
위의 requestURL에는 아래와 같이 50건의 IU님의 곡에 대한 정보가 나와 있습니다.
여기서 원하는 정보만을 뽑아내기 위해 구조체를 생성합니다.
struct Response: Codable {
let resultCount: Int
let tracks: [Track]
enum CodingKeys: String, CodingKey {
case resultCount
case tracks = "results"
}
}
struct Track: Codable {
let title: String
let artistName: String
enum CodingKeys: String, CodingKey {
case title = "trackName"
case artistName
}
위의 두 구조체는 Codable이라는 프로토콜을 따르고 있는것을 확인하실 수 있습니다.
Codable은 JSON형태의 데이터를 쉽게 처리하기 위한 프로토콜입니다.
사용법을 간단히 설명하면 JSON의 키와 Codable을 따르는 구조체의 프로퍼티를 동일하게 맞춰 주면 됩니다. 만약 프로퍼티를 다르게 정의할 경우 위와같이 CodingKeys를 통해 Codable을 사용하실 수 있습니다.
즉, 위의 Track에서 프로퍼티를 trackName, artistName로 생성하게 된다면 enum과 그 뒤의 내용을 지워도 무관합니다.
이제 DataTask를 생성하여 데이터를 가져와 보겠습니다.
// data task 생성
let dataTask = session.dataTask(with: requestURL) { (data, response, error) in
guard error == nil else {
return
}
// HTTP 응답 여부 확인
guard let statusCode = (response as? HTTPURLResponse)?.statusCode else {
return
}
// HTTP 응답 성공 범위
let successRange = 200..<300
guard successRange.contains(statusCode) else {
return
}
// 네트워크를 통해 받은 데이터를 resultData에 저장
guard let resultData = data else { return }
// 데이터 파싱 및 결과 출력
do {
let decoder = JSONDecoder()
let response = try decoder.decode(Response.self, from: resultData)
let tracks = response.tracks
print("--> tracks: \(tracks)")
} catch let error {
print("---> error: \(error.localizedDescription)")
}
}
dataTask.resume()
위의 코드를 실행하면 아래와 같이 곡제목, 가수만 50건 출력됩니다.
패스트캠퍼스 iOS 앱개발 올인원 패키지 Ch 14
좋은 글 감사합니다👍