URL Loading System
URLSession
- URLSession은 네트워크 연결을 설정하고 요청과 응답을 처리한다.
- 4가지 세션 타입을 가지고 있다.
- Shared Session
- 단순한 네트워크 요청 처리
- 커스터마이징 없이 기본설정을 사용하고 completion handler를 통해 최종 결과를 전달받는다.
- 구현이 단순하지만 Background 전송은 지원하지 않는다.
- Default Session
- 세션을 직접 구성할 때 사용한다.
- Delegate 구현를 통해 세부적인 제어가 가능하다.
- 서버로부터 전달된 응답은 기본적으로 Disk Cache와 Memory Cache에 저장된다.
- Ephemeral Session
- Default Session과 비슷하다.
- 캐시 쿠키 인증정보를 Disk에 저장하지 않는다.
- private 브라우징과 같은 기능을 구현할 때 사용한다.
- Background Session
- background 전송을 구현할 때 사용한다.
- 앱 실행 상태와 관계없이 파일을 다운로드하고 업로드하는데 필요한 인프라를 제공한다.
- Shared Session을 제외한 나머지 세션들은 SharedConfiguration 객체를 통해 생성한다.
Task
- 세션을 생성한 다음에는 Task를 생성한다.
- Task는 URLSession을 통해 전달하는 개별 요청이다.
- URLSession은 데이터 전달방식과 구현 목적에 따라 4가지 Task타입을 제공한다.
- Data Task
- API 서버와 통신할 때 적합하다.
- URLSession에서 대부분 DataTask를 사용한다.
- Upload / Download Task
- 파일을 업로드/다운로드 할 때 사용한다.
- Background 전송을 지원한다.
- Stream Task
- 채팅과 같은 TCP 프로그램을 개발하기에 적합하다.
구현 메소드
URLSession.shared.xxxTask()
- Task는 suspended 상태로 호출되기 때문에 resume() 메소드를 호출해야 실행된다.
- 서버의 응답을 처리하는 두 가지 방법
- Completion Handler 사용
- Session Delegate 구현
- task가 실행된 이후에 발생되는 다양한 이벤트를 세부적으로 처리해야할 때 적합하다.
- 위의 두가지 방법은 동시에 사용할 수 없다. task 생성할 때 적합한 방식 한가지만 사용해야한다.
URL Session Configuration
- 네트워크 연결과 관련된 속성을 설정한다.
- URL Session을 생성하기 전에 구현을 완료해야한다.
- URL Session을 생성할 때 생성자로 전달한다.
- URL Session을 생성한 이후에는 Session Configuration은 read-only 상태가 된다.
- 프레임워크에는 4가지 기본 Configuration이 구현되어 있다.
- Shared Session Configuration
- Shared URLSession에서 사용된다.
- 모든 설정값이 시스템 기본값으로 설정되어 있다.
- 실제로 이 configuration을 직접 사용하는 경우는 없다.
- Default Session Configuration
- 기본 설정 값이 필요하다면 사용한다.
- Delegate를 통해 이벤트 처리
- Disk 캐시를 통해 서버에서 받은 데이터를 캐시로 저장한다.
- 인증정보를 키체인에 저장
- 쿠키를 쿠키저장소에 저장
- Ephemeral Session Configuration
- Default Configuration과 비슷하다.
- Disk에는 어떤 정보도 저장하지 않는다.
- 서버에서 전달받은 데이터와 쿠키는 임시로 Memory에 저장한다.
- 인증정보 역시 키체인 대신 메모리에 저장한다.
- 메모리에 저장된 정보들은 URLSession이 invalid되는 순간 모두 사라진다.
- 데이터 유출 가능성이 상당히 낮다.
- 따라서 private browsing 같은 기능을 구현할 때 사용한다.
- Background Session Configuration
- Download/Upload Task에서 사용한다.
- 앱 실행상태에 관계없이 데이터를 전송할 수 있도록 설정되어 있다.
- Custom Configuration (Configuration의 속성들)
- timeoutIntervalForRequest: 기본은 60초. 설정된 시간동안 응답이 없을 경우 요청을 취소하고 에러를 발생시킨다.
- httpAdditionalHeaders: 모든 속성에 공통적으로 추가할 헤더를 설정할 때 사용한다.
- 만약 task에서 같은 헤더를 또 추가했다면 여기에서 설정한 헤더는 무시된다.
- networkServiceType: 이 속성은 URLSession이 처리하는 작업의 종류를 선택한다. 여기서 선택한 방식을 통해 네트워크 처리 방식을 최적화한다.
- 등등..