[iOS] URLSession

고재경·2021년 5월 3일
1

URLSession이란?

URLSession은 iOS에서 제공하는 HTTP를 이용한 네트워킹을 통해 데이터를 주고받을 수 있게 도와주는 API를 제공해주는 클래스입니다. URLSessionThread-Safty하기 때문에 어떤 스레드에서든 자유롭게 Session과 Task를 생성할 수 있습니다.

URLSessionURLSessionConfiguration을 통해 생성할 수 있습니다.
이렇게 생성된 URLSession을 통해 한 개 이상의 URLSessionTask를 생성할 수 있으며, 이 URLSessionTask를 통해 실제로 서버와 통신을 할 수 있습니다.

URLSessionConfiguration은 아래의 세가지 타입으로 만들 수 있습니다.

  • Default : 기본적인 네트워킹 정책을 사용합니다.
  • Ephemeral : 쿠키와 캐시를 저장하지 않을 때 사용합니다.
  • Background : 앱이 background에 있을 때 컨텐츠를 다운로드 혹은 업로드 할 때 사용합니다.

URLSessionTask 또한 작업에 따라 세가지로 분류할 수 있습니다.

  • URLSessionDataTask : 데이터를 받는 작업 수행 시 사용합니다. background 세션에 대한 지원을 하지 않습니다.
  • URLSessionUploadTask : 데이터 업로드 시 사용합니다.
  • URLSessionDownloadTask : 데이터 다운로드 시 사용합니다.

URLSession 실습

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이라는 프로토콜을 따르고 있는것을 확인하실 수 있습니다.

CodableJSON형태의 데이터를 쉽게 처리하기 위한 프로토콜입니다.
사용법을 간단히 설명하면 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건 출력됩니다.

References

패스트캠퍼스 iOS 앱개발 올인원 패키지 Ch 14

1개의 댓글

comment-user-thumbnail
2022년 5월 17일

좋은 글 감사합니다👍

답글 달기