본문 바로가기

Swift

[Swift] URLSession

안녕하세요, Wody입니다.

오늘은 URLSession에 대해서 공부했습니다. (사실 지난 주말에 공부했는데 공부하고 나면 진이 빠져서 블로그에 업데이트를 안하네요...)

이 글은 노션에서 작성된 글을 그대로 가져온 것입니다. 이쁘게 보고 싶은신 분은 아래 노션 링크를 참고해주세요
https://wodylikeios.notion.site/URLSession-d219933cf73640ed882475b0f614ba5f

 

URLSession

Apple Developer - URLSession

wodylikeios.notion.site

Apple Developer - URLSession

 

Apple Developer Documentation

 

developer.apple.com

URLSession

네트워크 데이터 전송 작업 그룹을 조정하는 클래스입니다

class URLSession: NSObject

개요

URLSession 클래스 및 관련 클래스는 URL로 표시된 엔트포인트에서 데이터를 다운로드하고 엔드포인트에 데이터를 업로드하기 위한 API를 제공합니다. 당신이 만든 앱은 이 API를 사용하여 앱이 실행되고 있지 않거나, iOS에서 앱이 일시 중단된 동안 백그라운드 상태에서도 다운로드를 수행할 수 있습니다. URLSessionDelegateURLSessionTaskDelegate를 사용하여 인증을 지원하고 리디렉션 및 작업 완료와 같은 이벤트를 수신할 수 있습니다.

Note
URLSession API에는 참조 문서 자체를 읽는 경우 명확하지 않을 수 있는 상당히 복잡한 방식으로 함께 작동하는 다양한 클래스가 포함됩니다. API를 사용하기 전에 URL 로딩 시스템 문서를 읽어주세요. Essentials, Uploading, Downloading 섹션의 문서는 URLsession을 사용하여 일반적인 작업을 수행하는 예를 제공합니다.

당신이 만든 앱은 관련 데이터 전송 작업 그룹을 조정하는 각각의 URLSession 인스턴스를 하나 이상 만듭니다. 예를 들어 웹 브라우저를 생성하는 경우 앱은 탭 또는 창 하나의 세션을 생성하거나 대화형 사용을 위한 세션과 백그라운드 다운로드를 위한 세션을 생성할 수 있습니다. 각 세션 내에서 앱은 일련의 작업을 추가하며, 각 작업은 특정 URL에 대한 요청을 나타냅니다 (필요할 경우 HTTP 리디렉션을 따릅니다)

URLSession의 유형

주어진 URLSession 내의 작업은 연결 동작을 정의하는 공통 세션 구성 개체를 공유합니다. 단일 호스트에 대한 최대 동시 연결 수, 연결이 셀룰러 네트워크를 사용할 수 있는지 여부 등이 있습니다.

URLSession에는 기본 요청에 대한 shared(구성 개체가 없음)이 있습니다. 생성한 세션만큼 사용자 정의를 할 수 없지만 요구 사항이 매우 제한적인 경우에는 좋은 방법이 됩니다. shared 클래스 메소드를 호출하여 세션에 엑세스합니다. 다른 종류의 세션의 경우 다음 세 가지 구성 중 하나로 URLSession을 만듭니다.

(shared를 사용할 경우 delegate, 커스텀 구성을 사용할 수 없습니다. 또한 데이터가 도착한 이후 추가 데이터를 얻을 수 없습니다. 기본 연결 동작을 커스텀할 수 없습니다. 인증을 수행하는데 제한이 있습니다. 백그라운드 다운로드 또는 업로드를 수행할 수 없습니다)

결론은 최소한의 네트워크 연결이 필요하다면 URLSession.shared를 사용, 그 외의 것은 URLSession을 생성할 때 init(cofiguration:)을 사용하여 아래의 세션을 선택할 것

  • default 세션은 Shard 세션과 매우 유사하지만 데이터를 점진적으로 가져오기 위해 기본 세션에 대리자를 할당할 수 있습니다.
  • Ephermeral(임시) 세션은 Shared 세션과 유사하지만 캐시, 쿠키 또는 자격 증명을 디스크에 쓸 수 없습니다.
  • 백그라운드 세션을 사용하면 앱이 실행되지 않는 동안 백그라운드에서 콘텐츠 업로드 및 다운로드를 수행할 수 있습니다.

URLSession 작업 유형

세션 내에서 선택적으로 데이터를 서버에 업로드한 다음 디스크의 파일 또는 메모리의 하나 이상의 NSData 개체로 서버에서 데이터를 검색하는 작업을 만들 경우 URLSesseion API는 네 가지 유형의 작업을 제공합니다.

  • Data Task는 NSData 개체를 사용하여 데이터를 보내고 받습니다. 데이터 작업은 서버에 대한 짧고 자주 있는 요청을 위해 사용됩니다.
  • Upload Task는 Data Task와 유사하지만 파일 형식의 데이터 전송을 지원하고 앱이 실행되지 않는 동안 백그라운드 업로드를 지원합니다.
  • Download Task는 파일 형식으로 데이터를 검색하고 앱이 실행되지 않는 동안 백그라운드 다운로드 및 업로드를 지원합니다.
  • WebSoket Task는 TCP 및 TLS와 같은 소켓 통신 프로토콜을 지원합니다.

Session Delegate 사용법

Task는 Session의 대리자를 공유합니다. 다음과 같은 이벤트가 발생할 때 정보를 제공하고 받기 위해 대리자를 구현합니다.

  • 인증 실패
  • 서버에서 데이터 도착했을 때
  • 데이터를 캐싱해야 할 때

대리인이 제공하는 기능이 필요하지 않는 경우 세션을 생성할 때 nil을 전달하여 대리인을 사용하지 않고 API를 사용할 수 있습니다.

중요 포인트!
세션 개체는 앱이 종료되거나 세션을 명시적으로 무효화할 때까지 대리자에 대한 강력한 참조를 유지합니다. 세션을 무효화하지 않으면 앱이 종료될 때까지 앱에서 메모리를 점유하니 세션을 더 이상 사용하지 않을 땐 세션을 종료하십시오.

세션으로 생성한 각 작업은 URLSessionTaskDelegate에 정의된 메소드를 사용하여 세션의 대리자를 다시 호출합니다. 작업에 특정한 별도의 대리자를 채워 세션 대리자에 도달하기 전에 이러한 콜백을 가로챌 수 있습니다.

비동기와 URLSession

대부분의 네트워킹 API와 마찬가지로 URLSession API는 비동기적으로 동작합니다. 호출하는 메서드에 따라 세 가지 방법 중 하나로 앱에 데이터를 반환합니다.

  • Swift를 사용하는 경우 async 키워드로 표시된 메소드를 사용하여 일반적인 Task를 수행할 수 있습니다. 예를 들어 data(from:delegate:)는 파일을 가져오는 반면 download(from:delegate:)는 파일을 다운로드합니다. 콜 포인트는 await 키워드를 사용하여 전송이 완료될 때까지 실행을 일시 중단합니다. 또한 bytes(from:delegate:) 메소드를 사용하여 AsyncSequence로 데이터를 받을 수 있습니다. 이 접근 방식에서는 for-wait-in 구문을 사용하여 앱이 데이터를 수신할 때 데이터를 반복합니다. URL 유형은 Shared URL Session에서 바이트 또는 lines를 가져오는 편리한 방법도 제공합니다.
  • Swift or Objective-C에서는 전송이 완료될 때 실행되는 Completion handler block을 제공할 수 있습니다.
  • Swift or Objective-C에서는 전송이 진행되고 완료된 직후 대리자 메서드에 대한 콜백을 받을 수 있습니다.

이 정보를 대리인에게 전달하는 것 외에도 URLSession은 상태 및 진행률 속성을 제공합니다. 작업의 현재 상태를 기반으로 프로그래밍 방식의 결정을 내려야 하는 경우 이러한 속성을 쿼리합니다. (해당 상태는 언제든지 변경될 수 있음을 유의하십시오)

프로토콜 지원

URLSession 클래스는 기본적으로 사용자의 시스템 기본 설정에 구성된 대로 프록시 서버 및 SOCKS 게이트웨이, data, file, ftp, http, https와 같은 URL 스키마를 지원합니다 이 외에도 여러 프로토콜을 지원합니다.

앱 전송 보완 (ATS)

iOS 9.0과 macOS 10.11 이상부터 URLSession으로 이루어진 모든 HTTP연결에 ATS를 사용합니다.

URLSession은 Thread Safety를 준수합니다.

URLSession API는 thread-safe합니다. 모든 스레드 컨텍스트에서 세션과 Task를 자유롭게 생성할 수 있으며, delegate 메서드가 호출하는 provided, completion handlers 작업은 올바른 delegate 대기열에 자동으로 예약됩니다.

URLSession을 이용해 데이터 받기

데이터를 가져오는 가장 간단한 방법은 completion handler를 사용하는 dataTask를 만드는 것입니다.

작업의 순서는 다음과 같습니다.

  1. error 매개변수를 통해 error가 발생했는지 확인합니다. nil일 경우 데이터 수신에 문제가 없으나, 그렇지 않은 경우 error를 리턴하여 오류를 처리하고 작업을 종료합니다.
  2. response 매개변수를 통해 Response State Code를 확인합니다. 이는 대체로 HTTP 상태 코드를 준수합니다. 예를 들어 200번대의 코드(200...299)의 경우 정상적인 서버 응답으로 확인할 수 있습니다. 그렇지 않은 경우에는 response 코드를 통해 서버 에러를 처리하고 작업을 종료합니다.
  3. data를 필요에 따라 처리합니다.

 

URLSession 예제는 다음 공식문서 및 링크를 참고하면 좋습니다!

https://developer.apple.com/documentation/foundation/url_loading_system/fetching_website_data_into_memory

 

Apple Developer Documentation

 

developer.apple.com

 

'Swift' 카테고리의 다른 글

[Swift] 옵셔널 Optional  (0) 2021.09.13
[Swift] 네트워크와 무관한 URLSession Unit Test  (0) 2021.09.08
[Swift] ARC와 순환 참조  (0) 2021.09.02
[Swift] Codable, JSONEncoder, JSONDecoder  (0) 2021.08.31
[Swift] Unit Test, TDD  (0) 2021.08.30