URL Loading System
URLSession 문서에서는 URL Loading System을 선행하는 것을 권장하고 있습니다.
아래 포스팅을 보고 오시는 것을 추천 드립니다.
URLSession이란?
HTTP/HTTPS 통신
URLSession에 대해 공부하기 전 HTTP/HTTPS 통신이 무엇인지 알아야 합니다.
HTTP 통신은 웹서버 통신 중 하나로 URL 기반으로 클라이언트에서 요청을 보내고, 서버로부터 응답을 받는 형태의 통신입니다.
자주 보이는 http://~~~~ 로 요청하는 통신이 바로 HTTP 통신인 것입니다. (http면 HTTP, https면 HTTPS)
URLSession
URLSession은 앱과 서버 간 데이터를 주고 받는 API를 제공하는 클래스입니다.
HTTP를 포함한 몇 가지 프로토콜을 지원하고 인증, 쿠키 관리, 캐시 관리 등도 지원합니다.
URL Loading System에서 알아봤듯이 URLSession은 자체적으로 비동기적으로 동작하기 때문에 따로 비동기 처리할 필요가 없습니다.
iOS의 대표적인 third-party 라이브러리인 Alamofire와 Moya도 URLSession으로 구현되어 있습니다.
(조만간 Alamofire에 대해서도 알아볼 예정 ㅎ)
URLSession의 Request와 Response
URLSession은 HTTP 통신과 마찬가지로 Request와 Response 구조를 가지고 있습니다.
Request는 두 가지 형태로 나뉩니다.
- URL 인스턴스를 통해 직접 통신하는 형태
- URLRequest 인스턴스를 만들어 옵션을 설정하여 통신하는 형태
Response도 두 가지 형태로 나뉩니다.
- 설정된 Task의 Completion Handler 형태
- URLSessionDelegate를 통해 지정된 메서드를 호출하는 형태
URLSession 동작 순서
URLSession은 보통 다음과 같은 순서로 진행됩니다.
- URLSessionConfiguration 결정
- Session 생성
- 사용할 Task 결정하고, 적절한 Response 메서드 작성
- Task 실행
- Task 완료 후 Response 메서드 실행
URLSessionConfiguration
URLSession은 configuration이라는 인스턴스 property를 가지고 있습니다.
configuration은 Session의 타임아웃 값, 쿠키나 캐시 설정 등을 할 수 있습니다.
configuration의 총 세 가지입니다.
- .default : 기본 통신을 할 때 사용 (쿠키와 같은 저장 객체 사용)
- .ephemeral : 쿠키나 캐시를 저장하지 않을 때 사용
- .background : 앱이 백그라운드 상태에 있을 때 데이터를 다운로드/업로드할 때 사용
이때 주의할 점은 configuration 프로퍼티는 "copy of the configuration object" 라는 것입니다.
configuration의 복사본으로 session에 세팅하므로
session이 생성되고 난 후에 configuration 인스턴스가 변동되어도 session은 변하지 않습니다.
그래서 Session 생성 전에 configuration 결정을 하는 것입니다.
만약 configuration 규칙을 수정하고 싶으면, 새로운 configuration으로 새로운 session을 만들어야 합니다.
URLSession 유형
URLSession의 유형은 URLSession 인스턴스가 소유한 configuration property에 의해 결정됩니다.
공유 세션(싱글톤)
let sharedSession = URLSession.shared()
기본 요청을 위한 세션이고 configuration 객체가 없습니다.
사용자 정의가 불가능합니다.
Default Session
let defaultSession = URLSession(configuration: .defualt)
기본적인 Session으로 디스크 기반 캐싱을 지원합니다.
Ephemeral Session
let ephemeralSession = URLSession(configuration: .ephemeral)
default session과 유사하나, 디스크에 어떤 데이터도 저장하지 않고 메모리에 올려 세션과 연결합니다.
따라서 앱이 세션을 만료시키면 세선과 관련된 데이터가 사라집니다.
쿠키나 캐시를 저장하지 않는 비공개 세션으로 사용됩니다. (ex. Safari의 개인 정보 보호 모드)
Background Session
let backgroundSession = URLSession(configuration: .background)
Suspended나 terminated 상태에서도 백그라운드에서 업로드, 다운로드가 가능합니다.
시스템에 의해 앱이 정상적으로 종료되고 다시 시작하면 앱은 동일한 identifier를 사용하여
새로운 configuration object와 session을 생성하고 진행 중이던 전송 상태를 검색할 수 있습니다.
URLSessionTask
URLSessionTask는 세션 작업 하나를 나타내는 추상 클래스입니다.
Task는 항상 세션의 일부로 존재합니다.
하나의 세션 내에서 URLSession 클래스는 세 가지 작업 유형을 지원합니다.
URLSessionDataTask
다운로드한 데이터를 앱의 메모리에 직접 전달하는 URLSession입니다.
Data 객체를 통해 데이터를 주고받으며 백그라운드 세션을 지원하지 않습니다.
URLSessionUploadTask
업로드할 데이터를 request body에 넣어 전달할 때 사용합니다.
POST나 PUT 통신을 할 때 사용되고 Data 객체 또는 파일 형태의 데이터를 서버로 업로드하는 작업을 합니다.
백그라운드 세션을 지원합니다.
URLSessionDownloadTask
DownloadTask는 서버의 response 데이터를 임시 파일에 직접 작성하여 데이터가 도착할 때 앱에 진행률 업데이트를 제공합니다.
백그라운드 세션을 지원합니다.
백그라운드 세션에서 다운로드 작업을 사용하면 앱이 suspended 상태처럼 실행 중인 상태가 아니더라도 다운로드가 계속됩니다.
다운로드 작업을 일시 중지한 후 나중에 다시 시작할 수도 있습니다. (단, 서버에서도 지원해야 함)
네트워크 연결 문제로 실패했을 때도 다운로드를 재시작할 수 있습니다.
참고
https://developer.apple.com/documentation/foundation/urlsession
https://developer.apple.com/documentation/foundation/urlsessiontask
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
swift, iOS, iOS 개발, 아이폰, 앱 개발, 개발, 코딩