내 앱, 사용자의 CoreData
에 없는 정보는 어디서 가져올 수 있나?
인터넷의 힘을 빌려보면 어떨까.
URLSession
객체를 써서 우리는 쉽게, 비동기로 네트워크의 데이터를 가져올 수 있다.
데이터를 업로드하는 것도 당연 가능하다.
Foundation
에서 제공하는 네트워킹 객체다.
싱글톤 shared
도 사용할 수 있다.
데이터를 업로드하거나 다운로드할 수 있도록 API를 제공한다.
앱 생명주기 중 백그라운드에서도 작동할 수 있다.
네트워크를 위한 기본 규약인 HTTP 프로토콜을 준수해야 하며, API 세션 델리게이트로 캐싱도 가능하다.
한 번에 URLSession.shared.DataTask()
를 호출하면 하나의 메소드가 너무 많은 일을 하게 되어서 보기가 어렵다.
아래 예시는 클로저를 활용해서 실제로 세션을 수행하는 부분과 작업을 진행할 url
을 넘겨주는 메소드를 분리한 예시이다.
URL로 데이터 작업을 할 때
// MARK: API Object
typealias NetworkCompletion = (Result<String, NetworkError>) -> Void
func curlWord(completion: @escaping NetworkCompletion) {
let urlString = "url링크"
performRequest(with: urlString) { result in
completion(result)
}
}
private func performRequest(with urlString: String, completion: @escaping NetworkCompletion) {
guard let url = URL(string: urlString) else { return }
let session = URLSession(configuration: .default)
let task = session.dataTask(with: url) { data, response, error in
// code
}
task.resume()
}
dataTask()
는 URLSessionDataTask
타입을 리턴하는데, 이것을 .resume()
해주어야 정상적으로 네트워킹이 실행된다.
참, dataTask()는 백그라운드 세션에서 지원되지 않는다.
URLSessionDataTask
는 다운로드한 데이터를 앱 메모리에 직접적으로 리턴해주는 결과 데이터이다.
예시에서 session
인스턴스를 생성할 때, configuration
에 .defalut
를 아규먼트로 전달하고 있다.
싱글톤으로 쓴다면 이렇게 생성자를 쓸 필요는 없다!
다만 사용자 커스터마이징이 제한된다는 단점이 있기 때문에 네트워크 통신의 목적과 용도에 알맞게 configuration
을 이해해서 적재적소에 활용하는 것이 좋다.
configuration
은 총 3가지 설정을 지원한다.
configuration
default
: 싱글톤 세션과 거의 유사하게 작동한다..default
를 전달하여 생성한다.ephemeral
: default
설정으로 생성된 세션과 유사하지만 쿠키와 캐싱을 디스크에서 저장하지 않는다.RAM
에 저장한다.RAM
에 저장하기 때문에 그 크기에 따라 성능 저하가 일어날 수 있다.ephemeral
을 전달하여 생성한다.background
: 앱이 작동하지 않을 때 데이터를 업로드, 다운로드할 수 있다.isDiscretionary
속성으로 최적화 시점에 네트워크 통신이 진행되도록 예약이 가능하다.background(withIdentifier:String)
을 전달하여 생성한다.private lazy var urlSession: URLSession = {
let config = URLSessionConfiguration.background(withIdentifier: "MySession")
config.isDiscretionary = true
config.sessionSendsLaunchEvents = true
return URLSession(configuration: config, delegate: self, delegateQueue: nil)
}()
let backgroundTask = urlSession.downloadTask(with: url)
backgroundTask.earliestBeginDate = Date().addingTimeInterval(60 * 60)
backgroundTask.resume()
URLSession
은 정리하는 깊이에 따라 굉장히 많은 내용을 다루어야 할 것 같다.
내가 이해할 수 있는 선까지만 정리하고, 사용에 익숙해진 뒤에 더 깊게 알아보는 게 좋을 것 같다.
URLSession
은 싱글톤 객체와 그외 3개 옵션으로 설정되는 세션을 바탕으로 네트워크 데이터 전송을 지원하는 애플의 API 이다.URLSession
은 기본적인 HTTP 규약을 내부 로직으로 지원하고 있다. URLProtocol
을 상속하여 구체적으로 지정해줄 수 있다.configuration
은 사용자 키체인에 접근가능한 default
, 보안을 중점적으로 통신하지만 RAM 성능저하가 발생할 수 있는 ephemeral
, dataTask()는 지원하지 않지만 dataUpload(), dataDownload()를 지원하는 background
로 나뉜다.