[TIL] URLSession

valse·2022년 8월 30일
0

iOSInterViewController

목록 보기
6/8
post-thumbnail

URLSession

내 앱, 사용자의 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

  1. default : 싱글톤 세션과 거의 유사하게 작동한다.
    점진적으로 데이터를 받아올 수 있도록 구현되어 있으며, 커스터마이징이 가능하다.
    사용자 키체인에 접근할 수 있다!
    아규먼트로 .default를 전달하여 생성한다.
  2. ephemeral : default 설정으로 생성된 세션과 유사하지만 쿠키와 캐싱을 디스크에서 저장하지 않는다.
    세션 관련 데이터와 캐시는 RAM 에 저장한다.
    개인정보 보호를 위해 주로 사용한다.
    따라서 앱이 종료되면 사라지고, 휘발성이 비교적 강하다.
    다만 RAM에 저장하기 때문에 그 크기에 따라 성능 저하가 일어날 수 있다.
    아규먼트로 ephemeral을 전달하여 생성한다.
  3. background : 앱이 작동하지 않을 때 데이터를 업로드, 다운로드할 수 있다.
    네트워크 통신이 앱 단에서 OS 단으로 넘어가 수행되며, 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 은 정리하는 깊이에 따라 굉장히 많은 내용을 다루어야 할 것 같다.
내가 이해할 수 있는 선까지만 정리하고, 사용에 익숙해진 뒤에 더 깊게 알아보는 게 좋을 것 같다.


정리

  1. URLSession 은 싱글톤 객체와 그외 3개 옵션으로 설정되는 세션을 바탕으로 네트워크 데이터 전송을 지원하는 애플의 API 이다.
  2. HTTP 프로토콜 규약에 따라 실행해야 하며, URLSession은 기본적인 HTTP 규약을 내부 로직으로 지원하고 있다. URLProtocol을 상속하여 구체적으로 지정해줄 수 있다.
  3. 세션의 각 configuration은 사용자 키체인에 접근가능한 default, 보안을 중점적으로 통신하지만 RAM 성능저하가 발생할 수 있는 ephemeral, dataTask()는 지원하지 않지만 dataUpload(), dataDownload()를 지원하는 background 로 나뉜다.

참고자료

애플 공식 문서 - URLSession

profile
🦶🏻🦉(발새 아님)

0개의 댓글