URLSession

Panther·2021년 3월 29일
0

URLSession, URLSessionTask에 대한 내용이 담긴 링크를 아래에 남기겠습니다.

URL Loading System
https://developer.apple.com/documentation/foundation/url_loading_system
https://velog.io/@panther222128/URL-Loading-System

URLSessionTask
https://developer.apple.com/documentation/foundation/urlsessiontask
https://velog.io/@panther222128/URLSessionTask

https://developer.apple.com/documentation/foundation/urlsession

"An object that coordinates a group of related, network data-transfer tasks."

Declaration

class URLSession : NSObject

Overview

네트워크를 통해 데이터 전송 수행을 담당하는 그룹을 조직화하는 객체입니다.

URLSession 클래스 그리고 이 클래스와 관련이 있는 클래스들은 URL에 의해 나타나는 엔드포인트로부터 데이터를 다운로드하거나 업로드하는 API를 제공합니다. 앱이 실행되고 있지 않거나 중지된 상태일 때도 데이터를 다운로드 받을 수 있도록 하기도 합니다. 또한, URLSessionDelegateURLSessionTaskDelegate를 통해 authentificaion을 지원하기도 하고, 재연결이나 수행 완료 같은 이벤트를 받을 수도 있습니다.

Note
URLSession API는 여러 클래스와 연관이 있는데, r레퍼런스 문서만을 읽는 것만으로는 사용하기에 복잡해보일 수 있습니다. API를 사용하기 전에 URL Loading System 주제에 나와있는 오버뷰를 읽어보시길 권합니다. 그 문서에 필수요소, 업로드, 다운로드 섹션이 포함되어 있으며, 일반적인 사용방법에 대한 예제를 제공하고 있습니다.

URL Loading System
https://developer.apple.com/documentation/foundation/url_loading_system
https://velog.io/@panther222128/URL-Loading-System

앱은 하나 혹은 그 이상의 URLSession 인스턴스를 생성하게 될 것입니다. 각각은 데이터가 오고 가는 수행에 조직화되어 있을 것입니다. 예를 들어 만약 웹 브라우저를 생성하려고 한다면, 탭 하나에 하나의 세션이나 윈도우 혹은 상호작용을 위한 세션을 생성해야 할 것입니다. 또한, 앱이 백그라운드 상태에서 다운로드가 지속되길 원한다면 별도의 세션이 필요합니다. 각 세션 내에서 앱은 정해놓은 URL에서 요청을 보내는 연속적인 수행을 추가하게 될 것입니다.

Types of URL Sessions

주어진 URL 세션 내에서 이뤄지고 있는 수행은 일반적인 세션 설정 객체를 공유합니다. 이 객체는 단일 호스트를 만들기 위한 최대 동시 연결 개수, cellular 네트워크를 사용할 수 있도록 할 것인지 등을 정의하도록 합니다.

URLSession은 설정 객체를 갖고 있지는 않은 싱글턴을 갖고 있습니다. 생성하려고 하는 세션의 커스텀이 필요없고, 제한된 요구사항만을 가지고 있다면 쉽게 접근할 수 있도록 도와줄 것입니다. 싱글턴을 호출하면 쉽게 접근할 수 있습니다. 다른 종류의 세션을 생성하려면 아래 세 가지 중 하나일 것입니다.

  • 기본값 세션이 싱글턴을 사용하는 것과 거의 유사할 것입니다. 이때 설정은 필요한 요소입니다. 그리고 데이터를 얻기 위해서 기본값 세션에 딜리게이트를 할당해야 합니다.
  • ephemeral 세션 역시 싱글턴 세션과 유사합니다. 그러나 디스크에 캐시, 쿠키, credential을 쓰지(write) 않습니다.
  • 백그라운드 세션은 앱이 실행 중이지 않고 백그라운드 상태에 있을 때에도 업로드 혹은 다운로드를 수행할 수 있도록 합니다.

각각의 설정을 생성하길 원한다면, URLSessionConfiguration 클래스 내에 Creating a Session Configuration Object를 살펴보시길 권합니다.

URLSessionConfiguration
https://developer.apple.com/documentation/foundation/urlsessionconfiguration#1660412

Types of URL Session Tasks

세션 내에서 서버에 데이터를 선택적으로 업로드하는 작업을 생성할 수 있으며, 파일을 디스크에 불러오거나 하나 이상의 NSData 객체를 메모리에 불러올 수 있습니다. URLSession API는 네 가지 유형의 작업을 제공합니다.

  • 데이터 작업은 NSData 객체를 사용해 데이터를 보내고 받을 수 있습니다. 데이터 작업은 작은 단위로 여러번 서버에 요청합니다.
  • 업로드 작업은 데이터 작업과 비슷하지만, 데이터를 보낼 수 있고 앱이 백그라운드 상태에 있어도 업로드할 수 있도록 합니다.
  • 다운로드 작업은 파일의 형태로 데이터를 회수하고, 앱이 실행되지 않는 동안에도 다운로드, 업로드를 수행할 수 있도록 합니다.
  • 웹소켓 작업은 TCP와 TLS를 거쳐 메시지를 교환합니다. 이 작업은 RFC 6455 프로토콜을 사용하면서 진행됩니다.

Using a Session Delegate

세션의 수행은 일반적인 딜리게이트 객체를 공유합니다. 특정 이벤트가 발생했을 때 정보를 제공하고 얻기 위해 이 딜리게이트를 사용합니다. 대표적인 예시는 아래와 같습니다.

  • authentication 실패의 경우입니다.
  • 서버로부터 데이터 도착한 경우입니다.
  • 캐싱을 위한 데이터가 사용 가능해질 때입니다.

딜리게이트에 의해 제공되는 것들이 필요하지 않다면, 세션 생성 시 nil을 전달시켜주는 것을 통해 이 API를 사용할 수 있습니다.

Important
세션 객체는 앱이 종료되거나 세션이 무효화될 때까지 딜리게이트에 강한 참조를 유지하고 있습니다. 만약 세션을 무효화하지 않는다면 앱 종료까지 메모리 누수가 발생합니다.

Asynchronicity and URL Sessions

대부분의 네트워킹 API처럼 URLSession API는 비동기입니다. 두 가지 방법으로 데이터를 반환할 수 있으며, 작성하는 메소드에 따라 달라집니다.

  • 데이터 전송이 성공적으로 마무리되거나 에러를 갖고 있을 때 컴플리션 핸들러 블록을 호출하는 것이 있습니다.
  • 데이터가 도착하고 전송이 완료되었을 때 세션의 딜리게이트를 호출하는 것이 있습니다.

이러한 정보를 딜리게이트에 전달하는 것과 더불어, URLSession은 현재 상태를 제공합니다. 또한, 작업의 현재 상태에 따라 어떻게 결정할 것인지에 대해 쿼리할 수 있는 프로그레스 속성을 제공합니다.

Protocol Support

URLSession 클래스는 데이터, 파일, ftp, http, https URL 스킴을 지원합니다. 그리고 이러한 지원은 프록시 서버와 SOCKS 게이트웨이와 함께합니다. 이들은 사용자 시스템의 prefrence가 설정된 형태로 이뤄집니다.

URLSession은 HTTP/1.1과 HTTP/2 프로토콜을 지원합니다. RFC 7540에 명시된 것처럼 HTTP/2는 Application-Layer Protocol Negotiation(ALPN)을 지원하는 서버에 요청할 수 있습니다.

가지고 있는 커스텀 네트워킹 프로토콜을 추가할 수도 있고, URLProtocol을 상속받은 객체를 만들면서 URL 스킴 또한 추가할 수 있습니다.

App Transport Security (ATS)

iOS 9.0과 macOS 10.11 이후 버전은 URLSession으로 만들어진 모든 HTTP 연결에 대해 App Transport Security(ATS)를 사용합니다. ATS는 HTTP 연결이 HTTPS(RFC 2818)를 사용하길 요청합니다.

더 많은 정보가 필요하다면 NSAppTransportSecurity를 살펴보시길 권합니다.

https://developer.apple.com/documentation/bundleresources/information_property_list/nsapptransportsecurity

Foundation Copying Behavior

세션과 작업 객체는 NSCopying 프로토콜을 따르며, 이 프로토콜은 아래와 같습니다.

  • 앱이 세션을 복사하거나 작업 객체를 복사할 때, 다시 같은 객체를 가져옵니다.
  • 앱이 설정 객체를 복사할 때, 독자적으로 수정이 가능한 새로운 복사본을 얻게 됩니다.

Thread Safety

URLSession API는 스레드 세이프합니다. 자유롭게 세션과 작업을 생성할 수 있습니다. 딜리게이트 메소드가 컴플리션 핸들러를 호출할 때, 작업은 자동으로 올바른 딜리게이트 큐에 스케줄됩니다.

0개의 댓글