본문 바로가기

iOS

iOS에서 42API 써보기 ! (2) URLSession

URLSession

URLSession는 iOS에서 HTTP 통신을 위한 접속 및 정보를 가져오는 애플의 API입니다.

Alamofire, SDWebImage 등의 기반이 되는 API이며 서버와의 데이터 교류를 위해 꼭 알아야 하는 API입니다.

URLSessiondms HTTP, HTTPS를 포함한 몇 가지 프로토콜을 지원하고, 인증, 쿠키 관리, 캐시 관리 등을 지원합니다.

 

URLSession의 Request와 Response

URLSession은 다른 HTTP 통신과 마찬가지로 Request와 Response를 기본 구조로 가지고 있습니다.  먼저 Request는 URL객체를 통해 직접 통신하는 형태와, URLRequest 객체를 만들어서 옵션을 설정하여  통신하는 형태가 있습니다. 다음으로 Response는 설정된 Task의 Completion Handler 형태로 response를 받거나, URLSessionDelegate를 통해 지정된 메소드를 호출하는 형태로 response를 받는 형태가 있습니다. 간단한 response는 Completion Handler를 사용하지만 background상태에도 파일 다운로드를 지원하거나 인증과 캐싱을 default 옵션으로 사용하지 않는 경우는 Delegate 패턴을 사용해야 합니다.

 

URLSession의 기본 컨셉

URLSession은 기본적으로 다음과 같은 Life Cycle로 진행됩니다.

1. Session comfiguration을 결정하고, Session을 생성한다.

2. 통신할 URL과 Request객체를 설정한다.

3. 사용할 Task를 결정하고, 그에 맞는 Completion Handler나 Delegate메소드를 작성한다.

4. 해당 Task를 실행한다.

5. Task 완료 후 Completion Handler가 실행된다.

 

 

- Session (URLSessionConfiguration)

URLSession은 URL 객체를 사용해 URL에 연결할 때 사용할 행동과 정책으로 크게 3가지 종류가 있다.

 

- Default session configuration : 기본 구성으로 업로드 및 다운로드 작업 디스크 기반 캐싱을 지원 및 관리한다.

- Ephemeral session configuration : 어떠한 데이터도 저장하지 않는 형태, 디스크에 아무것도 캐싱하지 않는다는 점 을 제외하고는 기본 세션 구성과 유사하게 작동한다. 쉽게 말하면 디스크에 데이터를 저장하지 않고 메모리에 저장해서 세션 만료 되면 데이터가 사라짐

- Background session configuration : 이 세션을 통해 업로드 및 다운로드를 수핼할 수 있는데, 심지어 백그라운드에서 실행 중인 경우에도 가능하다. 

 

URLSession.shard    shard는 주로 싱글톤객체로 사용 urlsession 생성 없이 urlsession을 사용할 수있음.

configuration을 활용하는 것보다 상대적으로 가볍게 작업 처리가 가능 속도가 더 빠름

단 delegate와 configuration을 사용할 수 없음

 

- Request (URLRequest)

URLRequest를 통해서는 서로 요청을 보낼 때 어떻게 데이터를 캐싱할 것인지, 어떤 HTTP 메소드를 사용할 것인지(GET, POST) 어떤 내용을 전송할 것인지 등의 속성들을 캡슐화한다. URLRequest 클래스는 요청을 위해 필요한 정보를 캡슐화하는 데 사용되지만 실제로 요청하는 것은 아니라는 점을 이해하는 것이 중요하다. 요청을 하기 위해서는 URLSession 및 URLSessionTask 클래스 인스턴스를 사용한다.

 

URL

URL 객체는 연결하고자 하는 URL을 대표한다. URL 클래스는 원격 서버를 나타내는데 국한되지 않고 디스크상의 파일을 가리킬 수 도 있다.

 

추가) HTTPURLResponse

 

HTTPURLResponse 클래스는 URLResponse 클래스의 서브 클래스인데, URL request의 응답과 연계된 메타 데이터를 캡슐화한다. 이 클래스를 사용해서 HTTP 헤더 필드와 응답 상태 코드에 접근 할 수 있다.

 

- Task (URLSessionTask)

Task 객체는 일반적으로 Session 객체가 서버로 요청을 보낸 후, 응답을 받을 때 URL기반의 내용들을 받는(retrieve)역할을 합니다. 3가지 종료의 Task가 지원됩니다.

 

URLSession 클래스는 URLSessionTask 클래스의 인스턴스를 사용해 연결 중인 서비스를 호출한다.

URLSession는 세 가지 서브 클래스를 제공한다.

 

- URLSessionDataTask : 메모리에 있는 응답을 하나 이상의 Data 객체로 애플리케이션으로 직접 반환한다. Data 객체를 통해 데이터를 주고받는 일반적은 사용.

쉽게 말하면 서버에서 데이터를 받는 역할

 

- URLSessionDownloadTask : data를 파일의 형태로 전환 후 다운 받는 Task입니다. 백그라운드 다운로드 지원. (응답을 임시 파일에 직접 쓴다.)

쉽게 말하면 웹서버로 파일을 전송하는 역할

 

- URLSessionUploadTask : POST 또는 PUT 요청과 같은 body를 요청하는 request 만들 때 사용한다.(data를 파일의 형태로 전환 후 업로드 하는 Task)

쉽게 말하면 서버로부터 데이터를 다운로드 받아서 파일의 형태로 저장하는 역할

 

Task에서 알아야 돼 !

task 객체에  resume() 메서드를 호출하는 이유는 모든 task는 일시정지로 시작하기 때문에 resume해줘야함.

resume의 친구들은  suspend(일시정지), 취소(cancel)등이 있다.

 

다시 돌아보자 급하게 가져다 쓴 코드를..

session객체를 안만들었군.

request엔 여러 설정값들을 넣고 datatsak에서 변수로 쓰지! 

아.. Session객체를 만들지 않고 바로 URLSession.shared 싱글톤으로 dataTask로 빼왔구나.. 

그리고 파싱할땐 JSONSerialization을 사용했군!

 

만약 shared를 안썻다면 어떻게 해줬어야할까!

let defaultSession = URLSession(configuration: .default)

이렇게 디폴틀 기본 세션 객체를 만들고!

let task = defaultSession.datatask ---이후는 같음

싱글톤말고 내가 만든 객체에서 datatask를 불러오면 된다!

 

궁금증 .

swift4 부터는 JSON Serialize 작업이 Codable로 가능...  차이는 뭘까.(대충알지만..ㅎ)

httpBody와 httpMetho, addValue, setValue는 어떻게 생겨먹은 것일까..

datatask의 클로저 매개 변수받아올때 어떻게 받아오는것일까.