본문 바로가기

iOS

URLSession 번역

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

 

URLSession | Apple Developer Documentation

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

developer.apple.com

 

 

URLSession

네트워크 데이터 통신 작업과 관련된 그룹을 조정하는 객체

 

해당 클래스는 URL로 표시된 엔드포인트에서 데이터를 다운로드하거나 업로드 하기 위한 API를 제공한다.

또한 앱이 실행되지 않거나 일시정지된 시점에서도 백그라운드에서 다운로드할 수 있는 기능을 제공

URLSessionDelegate와 URLSessionTaskDelegate를 사용하여 인증, 리디렉션과 같은 이벤트도 처리 가능

URL Loading System을 읽어보면 좋다.

 

앱은 하나 이상의 URLSession 인스턴스를 생성할 수 있고, 각 인스턴스는 데이터 전송 작업과 관련된 일을 수행할 수 있다.

예시로 앱이 탭이나 여러 창이 띄워져도 하나당 하나의 세션을 생성할 수 있고, 각자 독립적으로 네트워킹 작업을 수행할 수 있습니다.

각 세션과 함께 앱은 일련의 작업을 추가하고, 작업들은 특정 URL에 대한 요청을 나타냅니다.

 

 

URL session 형식

특정 URL session 내의 작업은 공통된 configuration 객체를 공유합니다.

Configuration 객체에는 단일 호스트에 대한 최대 동시 연결 수, 셀룰러 네트워크 사용 가능 여부 등의 동작을 정의합니다.

URLSession은 기본적으로 싱글톤인 shared 세션을 갖고 있습니다.

shared는 configuration 객체를 갖고 있지 않습니다.

싱글톤 shared는 커스터마이징할 수 없지만, 제한적이고 간단한 네트워크 요구사항을 갖는경우 사용하기 적합합니다.

shared는 shared 클래스 메서드를 호출하여 접근합니다.

 

다른 종류의 세션의 경우 세가지 구성중 하나로 URLSession을 생성할 수 있습니다.

  • 기본 세션은 shared 세션처럼 동작하지만 configuration을 통해 세션을 구성해야합니다. 기본 세션에 델리게이트를 할당하여 점진적으로 데이터를 얻을 수 있습니다.
  • 임시 세션은 shared 세션과 비슷합니다. 그러나 캐시나 쿠키 그리고 자격 증명을 디스크에 쓰지 않습니다.
  • 백그라운드 세션은 앱이 실행하지 않는 동안 백그라운드에서 컨텐츠의 다운로드 및 업로드를 수행하도록 합니다.

 

각 configuration 형식 생성에 대한 자세한 내용은 URLSessionConfiguration 클래스를 참조하세요.

 

 

URLSession 작업 형식

세션 내에서 선택적으로 데이터를 서버에 업로드한 다음 디스크의 파일 또는 메모리의 하나 이상의 NSData 객체로 서버에서 데이터를 검색하는 작업을 생성합니다.

 

URLSession API는 4가지 작업 유형을 제공함

  • 데이터 작업은 NSData 객체를 사용하여 수신 및 발신합니다. 데이터 작업은 짧은 시간동안 수행되고 요청들은 보통 쌍방향입니다.
  • 업로드 작업은 데이터 작업과 비슷하지만 파일형식의 데이터도 보낼 수 있습니다.(종종 파일 형태로) 그리고 앱이 실행되지 않아도 백그라운드 업로드를 지원합니다.
  • 다운로드 작업은 파일 형식으로 데이터를 검색하고 앱이 실행되지 않는 동안 백그라운드 다운로드 및 업로드를 지원합니다.
  • WebSocket 작업은 RFC 6455에 정의된 WebSocket 프로토콜을 사용하여 TCP 및 TLS를 통해 메세지를 교환합니다.

 

 

Session Delegate 사용하기

세션안의 작업들은 공통의 Delegate 객체를 공유합니다.

다양한 이벤트가 발생했을 때 정보를 얻거나 제공하기 위해 델리게이트를 지정해주어야 합니다.(아래와같은 이벤트)

  • 인증 실패
  • 서버로부터 데이터 도착
  • 캐싱이 가능해진 데이터

위와 같은 이벤트가 필요하지 않다면, session을 생성할 때 nil을 전달하여 API를 사용할 수 있습니다.

 

중요

세션 객체는 세션이 명시적으로 메모리해제 되거나 앱이 종료되기 전까지 델리게이트와 강한 참조를 유지합니다. 메모리 해제하지 않는다면 앱이 종료될때 까지 메모리 누수가 발생합니다.

 

세션으로 생성한 작업은 URLSessionTaskDelegate에 정의된 메서드를 사용하여 세션의 델리게이트를 다시 호출합니다.

작업의 특정한 별도 델리게이트를 사용하여 세션 델리게이트에 도달하기 전에 콜백을 가로챌 수 있습니다.

 

 

비동기성 그리고 URLSession

대부분 API네트워킹과 마찬가지로 URLSession API는 비동기입니다.

 

호출한 메서드에 따라 세가지 방식중 하나로 데이터를 반환합니다.

  • Swift를 사용한다면, 작업을 수행하기 위해 async 키워드를 표시한 메서드를 사용할 수 있습니다. 예를들어, 데이터를 가져오는 메서드인 data(from: delegate:)나 파일을 다운로드하는 download(from: delegate:)메서드가 있습니다. 호출지점에서 await 키워드를 사용하여 전송이 완료되기 전까지 일시정지합니다(suspend). 또한 bytes(from: delegate:)메서드를 사용하여 데이터를 AsyncSequence로 수신할 수 있습니다. 이 접근 방식은 for-await-in 구문을 사용하여 반복적으로 데이터를 수신하게 됩니다. URL 형식은 공유된 URL session에서 바이트나 라인을 가져오는 편리한 메서드도 제공합니다.
  • Swift나 Objective-C에서는 전송완료시 실행되는 완료 핸들러 블럭을 제공합니다.
  • Swift나 Objective-C에서는 전송이 진행되는 동안이나 전송이 완료된 직후에 델리게이트 메서드에 대한 콜백을 받을 수 있습니다.

 

델리게이트로 정보를 전달하는 것 외에도 URLSession은 상태와 진행 프로퍼티를 제공합니다.

작업의 현재상태를 기반으로 프로그래밍 방식으로 결정하는 경우 이러한 속성을 쿼리로 사용합니다.(상태는 언제든지 바뀔 수 있다는 경고와 함께)

 

 

프로토콜 지원

URLSession 클래스는 사용자의 시스템 기본 설정에 구성된대로 프록시 서버 및 SOCKS 게이트웨이를 투명하게 지원하여 데이터, 파일, ftp, http 그리고 https URL schemes를 기본적으로 지원합니다. (여기서 투명하게 지원하는 의미는 존재를 인식할 수 없는 의미로 사용된것 같다.프록시 서버 및 SOCKS 게이트웨이의 세부사항을 접근할 수 없다? 존재를 인식할 수 없다? 인 의미같다.)

URLSession은 HTTP/1.1, HTTP/2, HTTP/3 프로토콜을 지원합니다.

HTTP/2는 RFC7540에 설명된대로 ALPN을 지원하는 서버가 필요합니다.

또한 하나의 커스텀 네트워킹 프로토콜이나 URL schemes를 추가로 지원합니다.

이는 URLProtocol을 서브클래싱하여 지원합니다.

 

 

ATS 앱 전송 보안

iOS 9.0, macOS 10.11 이후의 최신버전까지는 URLSession으로 생성된 모든 HTTP연결은 ATS를 사용합니다.

ATS는 HTTP연결에서 HTTPS를 사용하도록 요구합니다.

추가적인 정보는 NSAppTransportSecurity에서 볼 수 있습니다.

 

 

기본적인 복사 동작

세션과 작업 객체는 아래와 같이 NSCopying 프로토콜을 따릅니다.

  • 세션이나 작업 객체를 복사할 때, 동일한 객체를 가져옵니다.
  • Configuration 객체를 복사할 때, 독립적으로 수정할 수 있는 새로운 복사본을 얻게 됩니다.

 

 

스레드 안정

URLSession API는 스레드안정적입니다.

모든 스레드 컨텍스트에서 세션과 작업을 자유롭게 생성할 수 있습니다.

델리게이트 메서드가 제공된 완료 핸들러를 호출할 , 작업은 자동으로 올바른 델리게이트 대기열에 예약됩니다.

'iOS' 카테고리의 다른 글

NotificationCenter  (0) 2025.02.20
iOS Combine  (0) 2025.02.19
Fetching website data into memory  (0) 2024.12.10
URL Loading System 번역  (2) 2024.12.10
SwiftGen 사용  (0) 2024.11.26