원문 시리즈 (블로그 이전)
시리즈 | 🚀 iOS 네트워킹 정복하기 - averycode.log
요즘은 블로그대신 github 에 학습내용을 정리를 하게 되었는데,오랜만에 velog로 돌아와 iOS 네트워킹을 정복 시리즈를 작성해봅니다.iOS를 공부한지 몇개월이 지났는데 바쁘다는 핑계(?)로 네트워
velog.io
URLLoadingSystem
URL Loading System - 공식문서
The URL Loading System provides access to resources identified by URLs, using standard protocols like https or custom protocols you create. Loading is performed asynchronously, so your app can remain responsive and handle incoming data or errors as they arrive.
URL Loading System은 https 또는 사용자가 만든 커스텀 프로토콜과 같은 표준 프로토콜을 사용하여 URL로 식별된 리소스에 대한 액세스를 제공합니다. Loading은 비동기식으로 수행되므로 앱이 responsive하게 유지하고 들어오는 데이터나 오류를 처리할 수 있습니다.
- URL을 통해 네트워크에 존재하는 서버와 통신하는 기술
- 이에 포함된 프레임워크는 높은 수준의 API를 제공하기 때문에 이것만으로 서버연동, 다운로드, 업로드 기능을 구현할 수 있다.
음.. 알겠는데, 모르겠네요
이 URLLoadingSystem에서 가장 중요한 URLSession 부터 알아보도록 하겠습니다
URLSession
URLSession은 HTTP/HTTPS를 통해 콘텐츠(데이터)를 주고받는 API를 제공하는 클래스입니다.
이 API는 인증 지원을 위한 많은 델리게이트
메서드를 제공하며, 애플리케이션이 실행 중이지 않거나 일시 중단된 동안 백그라운드 작업을 통해 콘텐츠를 다운로드
하는 것을 수행하기도 합니다.
URLSession API를 사용하기 위해 애플리케이션은 세션을 생성합니다. 해당 세션은 관련된 데이터 전송작업 그룹을 조정합니다. 예를 들면 웹 브라우저를 사용 중인 경우 탭 당 하나의 세션을 만들 수 있습니다. 각 세션 내에서 애플리케이션은 작업을 추가하고, 각 작업은 특정 URL에 대한 요청을 나타냅니다.
Request
- 서버로 요청을 보낼때 어떤 (HTTP) 메서드를 사용할 것인지, 캐싱 정책은 어떻게 할 것인지 등의 설정을 할 수 있다.
Response
- URL 요청의 응답을 나타내는 객체
세션의 유형
URLSession 객체가 소유한 configuration 프로퍼티 객체에 의해 결정됩니다.
URLSession 은 네가지 Session 타입을 가집니다.
Shared
: 싱글톤, configuration object를 가지지 않는다. 기본 설정을 기반으로 단순한 네트워크 요청을 수행할 수 있습니다. 대신, 커스텀할 수 없습니다. 하지만 단순하게 사용할때는 적합기본세션 (Default)
: 세션을 직접 구성할 수 있습니다. Degation을 제공하기 때문에 세부적인 제어도 가능합니다. 해당 세션을 통해 전송된 응답은 Disk 및 Memory에 캐싱됩니다.임시세션 (Ephemeral)
: Default와 유사하지만 캐싱처리가 Memory에만 수행됩니다. 주로 private한 처리를 하려할 때 사용됩니다. 디스크에 어떠한 데이터도 저장하지 않고, 메모리에 올려 세션과 연결한다. 따라서 애플리케이션이 세션을 만료시키면 세션과 관련된 데이터가 사라진다.백그라운드세션 (Background)
: 백그라운드 전송을 구현할 때 사용합니다. 별도의 프로세스가 모든 데이터 전송을 처리하여 앱 실행상태과 관련없이 데이터를 다운로드하고 업로드할 수 있습니다
Shared Session 을 제외한 모든 세션은 Session Configuration 객체를 통해 생성한다.
Session Configuration : URLSessionConfiguration
- Session Configuration 을 사용하면, 네트워크 연결과 관련된 속성을 설정할 수 있습니다.
- 셀룰러 연결 금지, 캐시 저장위치 설정, 쿠기 설정 변경, 타임아웃 값 설정 등을 수행할 수 있습니다.
- URLSession 을 생성하기 전에 미리 구성을 해두고 URLSession 생성자로 전달해 사용할 수 있습니다.
- URLSession 이 생성된 후에는 Session Configuration 을 수정할 수 없습니다.
Session Configuration 의 종류는 위에서 언급한 4가지입니다.
Shared
,기본세션 (Default)
,임시세션 (Ephemeral)
,백그라운드세션 (Background)
Task : URLSessionTask
https://developer.apple.com/documentation/foundation/urlsessiontask
URL Session 에 전달하는 개별 요청
- URLSessionTask 는 세션 작업 하나를 나타내는 추상클래스이다.
- 하나의 세션내에서 URLSession 클래스는 세가지 작업유형을 지원한다.
URLSessionTask는 URL session 의 task 를 위한 base class 입니다!
Task 는 언제나 session 의 한 부분인데요
URLSession 인스턴스의 task 생성 메서드 중 하나를 호출하여 task 를 생성할 수 있습니다.
다음은 생성가능한 task 의 종류와 타입을 결정지어 호출하는 method의 종류입니다.
- URLSessionDataTask: dataTask(with:)
- HTTP의 각종 메서드를 이용해 서버로부터 응답 데이터를 받아서 Data 객체를 가져오는 작업을 수행 (메모리에 NSData 객체로 응답을 받아옴)
- API 서버와 통신하기 적합. 가장 많이 사용되는 Task
- background session 에서 사용할 수 없다.
- URLsessionUploadTask:
uploadTask(with:from:)
- 파일 전송에 적합
- 애플리케이션에서 웹 서버로 Data 객체 또는 파일 데이터를 업로드하는 작업을 수행합니다.
- 주로 HTTP의 POST 혹은 PUT 메서드를 이용합니다.
- background session을 지원합니다.
- URLSessionDownloadTask:
downloadTask(with:)
- 파일 전송에 적합
- 서버로부터 데이터를 다운로드 받아서 파일의 형태로 저장하는 작업을 수행
- 애플리케이션의 상태가 대기 중이거나 실행 중이 아니라면 백그라운드 상태에서도 다운로드가 가능
- background session을 지원합니다.
- URLSessionStreamTask:
streamTask(withHostName:port:)
orstreamTask(with:)
- 채팅과 같은 TCP 프로그램을 구현할 때 사용하는 Task
- host name 과 포트 혹은 net service object로 TCP/IP connection 지원
요약
- DataTask
- 서버로부터 어떤 응답이라도 Data 객체의 형태로 전달받을 때
- 단순한 데이터의 전송 (JSON, XML, HTML 데이터)
- Upload/Download Task
- 단순한 바이너리 파일의 전달
- 용량이 큰 파일: (백그라운드에서도 전달되도록)
task를 다 생성하고 나면 resume()
메소드를 호출해서 task 를 시작할 수 있습니다.
session 은 그러면 task 가 이것의 request를 끝내거나 실패할때 까지 강한 참조를 유지한다.
따라서 만들고 있는 앱이 내부 bookkeeping 이 필요한 경우가 아니라면 따로 task 에 reference 를 유지하지 않아도 된다
근데 왜 재시작이라는 이름의 resume()
메소드를 실행해야 시작될까요?
왜냐하면 suspended 상태로 생성이 되기 때문입니다.
URLSession 의 State
위의 내용을 보다가 갑자기 URLSesisonTask의 State 가 뭐가 있는지 궁금해졌습니다
- running : (활성화된 상태)
- suspended (연기된)
- cenceling (삭제중) -> cancel 메세지를 받았을떄
- completed (완료) -> 취소없이 잘 completed된 상태, task 의 delegate 가 더이상의 콜백을 받지 않습니다.
가 있습니다.!
업로드중..
요 메소드들로 state를 바꿀 수 있네요
그리고 priority 라는 프로퍼티로 작업의 우선순위를 설정해줄수 도 있습니다.
- 0.0부터 1.0 사이로 우선순위를 나타낼 수 있습니다.
var priority: Float { get set }
- 혹은 몇가지 constants로 우선순위를 설정할 수도 있어요
URL Session Delegate
서버에서 전달된 데이터는 Completion Handler 나 Session Delegate 를 기반으로 처리합니다
- ✅ 일반적으로 Completion Handler를 사용하지만 Session Task 처리 중 내부에서 발생하는 다양한 이벤트를 세부적으로 확인하고 싶다면 Session Delegate 를 사용해야합니다.
- ✅ Session Delegate를 사용하면 Completion Handler를 통한 처리는 동작하지 않는다
Completion Handler로 처리할때
Session Delegate로 처리할때
Session Delegate Protocol 은
URLSessionDelegate 가 가장 최상위에 존재하고
그 아래에 이를 상속받는 URLSessionTaskDelegate
그 아래에 이를 상속받는 URLSessionDataDelegate 와 URLSessionDownloadDelegate가 존재합니다.
Ref
https://inuplace.tistory.com/1226
https://www.boostcourse.org/mo326/lecture/16863?isDesc=false
https://kka7.tistory.com/95
https://developer.apple.com/documentation/foundation/url_loading_system/fetching_website_data_into_memory
'이전 블로그 > iOS Dev' 카테고리의 다른 글
🚀 iOS 네트워킹 정복하기 (4) CodingKeys / Custom 인코딩과 디코딩 (0) | 2022.11.02 |
---|---|
🚀 iOS 네트워킹 정복하기 (3) Codable Protocol ( JSON Encoding / Decoding) (1) | 2022.11.02 |
🚀 iOS 네트워킹 정복하기 (1) Kick Off (0) | 2022.11.02 |
[Swift] Struct와 Class (feat. 값타입과 참조타입) (0) | 2022.11.02 |
[SwiftUI] SwiftUI의 Data Flow (0) | 2022.11.02 |