[iOS] URLSession - Fetching Website Data into Memory

Inwoo Hwang·2021년 8월 26일
0

iOS

목록 보기
6/13
post-thumbnail

URL Session


URLSession은 주어진 URL이 가리키는 endpoint로부터 자료를 다운로드 받거나 업로드할 수 있는 API를 제공하는 클래스입니다.

  • HTTP/ HTTPS 요청의 송신과 수신을 담당하는 핵심 객체입니다.

  • URLSessionConfiguration을 통해 아래와 같은 유형의 Session을 생성합니다.

Session의 유형:

.shared : 기본설정, 싱글톤이다. 바로바로 사용할 수 있게 configuration 값이 들어가있다. 커스텀이 불가능하다. 네트워크 정책을 바꿀 수 없다.

(configuration: .default) : shared session과 비슷하지만 목적과 설계에 맞게 수정이 가능하다. delegate를 위임하여 점진적으로 쌓이는 데이터를 관리합니다. .shared의 역할은 비슷하나 네트워크 정책을 바꿀 수 있습니다. 디스크 지속 전역 캐시, 자격 증명,과 쿠키 저장 객체를 사용하는 기본 구성 객체를 생성합니다.

.ephemeral: 디스크에 데이터를 저장하지 않고 , 메모리에 올려 session과 연결합니다. session을 만료시키면 관련된 데이터가 사라집니다. 그 외 기본 session과 비슷합니다.

(configuration: .background): 별도의 프로세스가 모든 데이터 전송을 처리하는 부분 제외 default 세션과 비슷합니다.

또한 URLSessionConfiguration은 시간초과 값, 개시 정책, HTTP헤더와 같은 session attribute와 같은 session의 속성을 구성할 수 있습니다.

URL vs URLRequest

URLRequest는 open restful api를 쓰려면 토큰이 필요할 때 있다. 어떤 인증된 사람만 쓸수 있게 토큰을 발급해 주면 해당 토큰을 헤더에 넣기도 하는데 이럴 경우 URLRequest가 필요하다.

Class URLSessionTask

Resource download와 같이 URLSession에서 수행되는 task

URLSessionTask는 세션 작업 하나를 나타내는 추상 클래스입니다.

해당 클래스의 인스턴스를 만들려면

URLSession.shared.dataTask()와 같이 shared session으로 인스턴스를 만들 수 있고

let defaultSession = URLSession(configuration: .default)

defaultSession.uploadTask()

이와 같이 configuration을 세팅하고 만들 수 있습니다.

  • URLSessionDataTask: 서버에서 메모리로 데이터를 검색하는 HTTP GET요청에 해당 task를 사용합니다.

  • URLSessionUploadTask: 전형적으로 HTTP POST, PUT 매소드를 통해서 디스크에서 웹서버로 파일을 전송할때 이 테스크를 사용하세요.

  • URLSessionDownloadTask: 임시의 파일 위치로 원격 서버에서 파일을 다운로드할때 이 테스크를 사용하세요.

shared

The shared singleton session object

class var shared: URLSession {get }

다른 세션과 다르게 shared session을 만들지 않고 바로 프로퍼티로 접근하여 사용할 수 있다. 이와 같은 이유 때문에 delegate 또는 configuration object를 제공하지 않아도 된다는 이점이 있습니다.

Shared Session의 한계

shared session은 delegate와 커스텀할 수 있는 configuration object를 가지고 있지 않기 때문에 아래와 같은 한계점이 존재합니다.

  • 데이터를 점진적으로 서버로부터 받을 수 없습니다.
  • 기본 연결 작업을 커스텀하는데 한계가 있습니다.
  • 인증 작업에서 한계가 존재합니다.
  • 백그라운드에서 다운로드 또는 업로드 작업이 불가능 합니다.

이 때문에 shared session을 가지고 작업을 할 때는 캐시, 쿠키저장소, 또는 인증서 저장소를 커스텀화 하는 것을 지양해야 합니다.(NSURLConnection을 사용하지 않는 이상)

다른말로 하면, 캐시, 쿠키, 인증작업, 또는 커스텀 네트워크 프로토콜을 사용하려면, shared session을 사용하는 것 보다 default session을 사용해야 합니다.

Fetching Website Data into Memory

URLSessionDataTask 클래스를 활용하여 API로 받은 데이터를 메모리저장할 수 있습니다. 이런 작업을 하기 위해서는 먼저 URL session 인스턴스를 생성해야합니다. 해당 인스턴스는 URLSession 클래스의 shared instance 여야 하고 만약 delegate 콜백을 활용하여 데이터를 전송받거나 전송하려면 공유인스턴스 대신 session을 만들어서 사용해야 합니다.

세션을 만들기 위해서는 URLSessionConfiguration instance를 활용해야 합니다. 세션은 여러 개의 task를 만들 때 재사용될 수 있기 때문에 task 필요로하는 환경설정(configuration) 마다 세션을 만들어서 프로퍼티로 저장하면 됩니다.

세션을 만들게 되면 dataTask() 메서드 중 하나를 사용하여 data task를 만들 수 있습니다. task는 일시중지된 상태로 생성되고 resume() 메서드를 호출하여 시작할 수 있습니다.

Receive Results with a Completion Handler

데이터를 전송받기 위해 가장 쉬운 방법은 completion handler를 사용하는 것 입니다. 위와 같은 구조를 사용하면, task는 서버의 응답, 데이터 및 오류를 전달합니다.

completion handler를 사용하는 data task를 생성하기 위해서는 URLSession의 dataTask 메서드를 호출해야 하고 completion handler는 다음 3가지 조건이 충족되어야 합니다.

  1. error parameter가 nil인지를 확인해야 합니다. 그렇지 않으면 전송오류가 발생한 것이기 때문에 에러처리 후 종료시켜야 합니다.
  2. status 코드가 전송 성공을 나타내고 있는지 확인해야 하고 MIME 타입 또한 예상한 값인지 확인해야 합니다. 그렇지 않으면 서버 에러를 처리하고 종료해야 합니다.
  3. data instance를 필요에 따라 사용하여야 합니다.

URLSession | Apple Developer Document

URLSession Tutorial: Getting Stareted - 까칠코더

Swift, URLSession가 무엇인지, 어떻게 사용하는지 알아봅니다.

URLSession, URLSessionDataTask 톺아보기 - 국산 앨런

profile
james, the enthusiastic developer

0개의 댓글