본문은 야곰 아카데미 커리어 스타터 캠프를 통해 학습한 내용을 회고한 글입니다.
URLSession
URLSession 클래스와 관련된 클래스는 URL로 표시된 데이터를 다운로드하고 업로드하기 위한 API를 제공한다. 앱이 실행되고 있지 않을 때, 혹은 iOS에서 앱이 일시 중단 되었을 때에도 역시 백그라운드 다운로드를 수행하기 위해 이 API를 사용할 수 있다. URLSessionDelegate와 URLSessionTaskDelegate를 이용해 인증을 지원하고 리디렉션 및 작업 완료와 같은 이벤트를 수신할 수 있다.
앱은 하나 혹은 그 이상의 URLSession 인스턴스를 생성하며, 각각의 인스턴스는 관련된 데이터 전송 작업 그룹을 조정한다. 예를 들어서, 만약 웹 브라우저를 만든다면, 앱은 탭이나 윈도우 하나당 하나의 세션을, 혹은 상호작용을 하기 위한 용도와 백그라운드 다운로드를 위한 용도로 세션을 하나씩 만들 것이다. 각 세션 내에서, 앱은 일련의 작업을 추가하며, 그 작업들은 특정 URL에 대한 요청을 나타낸다.
Types of URL Sessions
주어진 URLSession내의 작업은 공통된 세션 configuration 객체를 공유한다. 이 객체는 단일 호스트에 대한 최대 동시 연결 수, 연결이 셀룰러 네트워크를 사용할 수 있는지 여부 등과 같은 연결 동작을 정의한다.
URLSession은 기본 요청에 대해 싱글톤 shared세션(configuration 객체 없음)을 가지고 있다. 이건 생성하는 세션만큼 커스텀할 수는 없지만, 굉장히 제한적인 요구사항에 대해서는 좋은 시작점 역할을 한다. shared 클래스 메서드를 호출하여 이 세션에 접근할 수 있다. 다른종류의 세션의 경우 다음 세 가지 configuration 중 하나로 URLSession을 만들 수 있다:
- default session은 shared session과 유사하게 작동하지만, 사용자가 구성할 수 있다. 데이터를 증가하도록 얻기 위해서 default session에는 delegate를 지정할 수도 있다.
- Ephemeral session(임시 세션)은 shared session과 유사하지만, caches, cookies, 혹은 credential을 디스크에 쓰지 않는다.
- Background session은 앱이 실행되지 않을 때 백그라운드에서 콘텐츠 업로드와 다운로드를 실행하도록 할 수 있다.
각 유형의 configuration 유형에 대해서 알아보려면 URLSessionConfiguration 문서의 Creating a Session Configuration Object를 살펴보시오.
Types of URL Session Tasks
세션 내에서, 선택적으로 데이터를 서버에 업로드 하고 디스크에 파일로서 혹은 메모리에 하나 혹은 그 이상의 NSData 객체로서 데이터를 서버에서 검색하는 작업을 만든다. URLSession API는 네 가지 유형의 작업을 제공한다:
- Data task는 NSData 객체를 사용해서 데이터를 보내고 받는다. Data tasks는 짧은 상호작용의 요청을 위한 것이다.
- Upload task는 data task와 유사하지만, 앱이 실행되지 않을 때 (종종 파일의 형태로) 데이터를 보내고, 백그라운드 업로드를 지원한다.
- Download task는 앱이 실행되지 않을 때 데이터를 파일의 형태로 검색하고, 백그라운드 다운로드와 업로드를 지원한다.
- WebSocket task는 RFC6455에 정의된 WebSocket 프로토콜을 사용하여 TCP와 TLS를 통해 메세지를 교환한다.
Using a Session Delegate
세션 내의 작업도 공통된 delegate 객체를 공유한다. 다음과 같은 여러가지 이벤트들이 일어날 때, 정보를 얻고 제공하기 위해서 이 delegate를 구현한다:
인증 실패
데이터가 서버로부터 도착함
데이터를 캐싱할 수 있음
Delegate에서 제공하는 기능이 필요하지 않은 경우, 세션을 만들 때 nil을 전달하여 이 API를 사용할 수 있다.
세션을 통해 만드는 각각의 작업들은 URLSessionTaskDelegate에 정의된 메서드를 사용하며 세션의 delegate를 다시 호출한다. 이 콜백이 세션 delegate에 전달되기 전에 작업에 특화되어있는 separate delegate를 만들어 이러한 콜백을 가로챌 수도 있다.
Asynchronicity and URL Session
대부분의 네트워킹 API와 마찬가지로 URLSessionAPI는 매우 비동기적이다. 어떤 메서드를 호출하는지에 따라서 세 가지 방법 중 하나로 앱에 데이터를 반환한다:
- Swift를 사용하는 경우, 일반적인 작업을 수행하기 위해서 async 키워드가 있는 메서드를 사용할 수 있다. 예를 들어서, download(from:delegate:)가 파일을 다운로드하는 동안에 data(from:delegate:)는 데이터를 가져온다. 콜포인트는 await키워드를 사용하여 전송이 완료될 때까지 실행을 일시중단한다. 데이터를 AsyncSequence로 받기 위해서 bytes(from:delegate:) 메서드를 사용할 수도 있다. 이런 접근 방식을 통해서, 앱이 데이터를 받을 때까지 반복하기 위해 for-await-in 문을 사용한다. URL 타입은 shared URLSession에서 bytes나 lines을 가져오기 위해 편의 메서드를 제공하기도 한다.
- Swift혹은 Objective-C에서, 전송이 완료되면 작동하는 Completion Handler 블록을 만들 수도 있다.
- Swift혹은 Objective-C에서, 전송이 진행 중일 때와 완료 직후에 delegate 메서드에 대한 콜백을 받을 수 있다.
이러한 정보를 delegate에 전달하는 것 외에도, URLSession은 상태와 진행에 대한 프로퍼티를 제공한다. 만약 작업의 현재 상황에 기반해서 프로그래매틱한 결정을 내려야하는 경우 이러한 프로퍼티들을 query할 수 있다.
여기까지가 공식 문서를 번역한 것이고..
그래서 정리해보자면 이렇지 않을까 싶다..
URLSession configuration
기본적으로는 shared 싱글톤 URLSession을 사용할 수 있다. 근데 이건 커스텀이 안 된다. 그래서 커스텀이 되는 세 가지 종류가 있다고 볼 수 있다:
- default: 싱글톤 shared와 비슷하지만 delegate를 이용해서 점진적으로 데이터를 얻을 수 있음
- ephemeral: 캐시, 쿠키, 자격 등을 디스크에 저장하지 않을 때 사용함
- background: 앱이 실행되지 않는 동안 백그라운드에서 콘텐츠 업로드와 다운로드를 할 수 있음
우리 테스트에서 요로코롬 만들어준게 default를 사용해서 구성을 해준거라고 생각하면 될 것 같다:
override func setUpWithError() throws {
let configuration = URLSessionConfiguration.default
configuration.protocolClasses = [MockURLProtocolObject.self]
let session = URLSession(configuration: configuration)
sut = NetworkManager(session: session)
}
Tasks
Task도 네 가지로 나뉜다:
- Data Task: NSData 객체를 이용해 통신하며 짧은 상호작용 요청을 위한 것임(GET)
- Upload Task: Data Task와 비슷하지만 파일형태의 데이터도 보내고 앱이 실행중이지 않을 때 백그라운드 통신도 지원함(POST, PUT)
- Download Task: 데이터를 다운로드(파일형태도 가능)을 하며, 앱이 실행중이지 않을 때 백그라운드 통신도 지원함
- WebSocket Task
짧은 형태는 그냥 Data Task를 쓰면 되는 것 같고, 긴 형태?는 상황에 따라서 Upload Task과 Download Task 중 선택해서 쓰면 되는 것 같다.
KirKim 블로그에 따르면, Task는 URL과 URLRequest로 만들어 줄 수 있다.
참조
https://developer.apple.com/documentation/foundation/urlsession
https://greatpapa.tistory.com/66
https://kirkim.github.io/swift/2022/08/13/urlsession.html
'YAGOM CAREER STARTER' 카테고리의 다른 글
[토요스터디A반] 20230408: KeyChain (0) | 2023.04.14 |
---|---|
[TIL] 20230411: URL Loading System (0) | 2023.04.14 |
[TIL] 20230330: Escaping closure/Defer (0) | 2023.04.04 |
[TIL] 20230327: class/struct, 네트워크 통신 없이 Test하는 이유 (0) | 2023.03.28 |
[TIL] 20230321: Fetching Website Data into Memory (0) | 2023.03.25 |