iOS랑 친해지기

[iOS] HTTP/ URLSession / URLSessionConfiguration/ URLSessionTask

데브킹덕 2022. 10. 25. 12:23

 

 

우리는 웹 통신을 할때 엄격한 규약(프로토콜)을 준수해야한다. 

HTTP(Hyper Text Transfer Protocol)

- HyperText를 전송하기 위한 프로토콜

- Html 문서를 주고받는데 사용하는 통신 프로토콜 

- 요청request , 응답response로 이루어져 있음

 

 

 

- 서버는 클라이언트가 요청하는 정보를 전송하고 곧바로 연결을 종료시킴

- 서버에 요청을 보내고  서버로부터 필요한 파일을 받으면  연결이 종료됨

- 계속 연결되지 않는다는게 HTTP의 특징 

 

 

 

 

 

- HTTP통신은 요청을 보내고 응답을 받을때 패킷에 넣어보냄

- 패킷은 크게 해더와 바디로 나뉘는데 헤더에서는 보내고 받는 사람의 주소, 패킷의 생명시간 

- 바디에는 우리가 전하고자하는 실제 내용들이 들어가있음  

 

HTTP 메서드

클라이언트가 서버에 요청을 하려면 URL주소와 HTTP메서드를 정해줘야함

서버에서는 메서드에 따라 어떤 요청인지 파악이 가능함 

 

GET: 클라이언트가 서버에 리소스를 요청할때 사용 (정보를 받아올때 )

 

POST: 클라이언트가 서버에 리소스를 새로만들때 사용 (로그인, 게시급 업로드등)

 

PUT: 클라이언트가 서버의 리소스를 전체 수정할때 사용 (회원정보를 전체 수정할때)

 

PATCH:클라이언트가 서버의 리소스를 일부 수정할때 사용(회원정보를 일부 수정할때)

 

DELETE:클라이언트가 서버의 리소스를 삭제할때 사용

 

HEAD: 클라이언트가 서버의 정상 작동 여부를 확인할때 사용

 

OPTIONS:클라이언트가 서버에서 해당하는 URL이 어떤 메서드를 지원하는지 확인할때 사용

 

CONNECT:클라이언트가 프록시를 통하여 서버와 SSL통신을 하고자할 때사용

 

TRACE:클라이언트와 서버간 통신 관리 및 디버깅할때 사용

 

 

 

서버는 클라이언트의 요청에 응답하면서 요청이 성공적으로 완료되었는지를 알려주는 선택 코드를 보냄

100번대 

- Informational(요청 정보를 처리중)

- 서버가 요청을 클라이언트에서 성공적으로  수신했으면 서버끝에서 처리중 이라는 정보를 나타냄 

 

200번대

- Success 

- 서버요청을 받고 성공적으로 처리되었음을 나타냄 

 

300번대

- 요청을 완료하기 위해 추가 동작이 필요함을 나타냄 

- 브라우저 자동으로 Redirection됨 

- 브라우저창에서는 표시되지 않지만 이미지 파일처럼 캐싱된 파일을 새로고침 후 확인하면 확인할 수 있음

 

400번대

- 서버가 해결할 수없는 클라이언트 측에러 Client Error

 

500번대

- 서버가 클라이언트요청처리 실패함 Server Error

 

 

 

애플에서 HTTP 통신을 하기 위해 URLSession API를 만듦

URL(Uniform Resource Locator)?

- 네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약임 

- 흔히 우리가 자주 접하는 웹사이트 주소뿐만 아니라 컴퓨터 네트워크 상의 자원을 모두 나타낼 수 있음

 

Session?

- 사전적인 의미 -> 기간,시간

- 반영구적이고 상호적인 정보 교환을 전제하는 둘 이상의 통신 장치나 컴퓨터와 사용자 간의 대화나 송수신 연결상태를 의미하는 보안적인 다이얼로그 및 시간대를 말함 

 

URLSession이란?

- 특정한 url을 이용하여 데이터를 다운로드하고 업로드하기 위한 API

- 서버와 통신하기 위해 제공하는 API

- 하나이상의 URLSession 인스턴스를 생성하며 각 인스턴스는 관련 데이터 전송작업 그룹을 조정함 

 

ex) 웹브라우저를 만드는 경우 앱은 탭 또는 창당 하나의 세션을 만들 수 있음 

각 세션내에서 앱은 특정 URL에 대한 요청을 나타내는 일련의 작업을 추가함 

 

- URLSession은 기본적으로 request와 response를  기본 구조로 가지고 있음 

- request는 서버로 요청을 보낼때 어떤 HTTP메서드를 사용할 것인지 캐싱장치를 어떻게 할 것인지등의 설정을 할 수 있음 

- response는 URL요청에 응답을 나타내는 객체 

 

 

URLSession Life Cycle

1. Session Configuration 을 결정하고 Session을 생성 

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

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

4. 해당 Task를 실행

5. Task완료 후 Completion Handler 클로저가 호출이 됨

 

 

     URLSessionConfiguration을 통해 URLSession을 생성할 수 있음

-> 이렇게 생성된 URLSession을 통해 한개 이상의 URLSessionTask를 생성할 수 있으며

-> 이URLSessionTask를 통해 실제 서버와 통신할 수 있음

 

URLSession은 여러가지 유형의 Session을 제공함

이타입은 URLSession 객체가 소유한 configuration프로퍼티 객체에 의해  결정됨

 

 

URLSession의 종류

1. 공유 세션(Shared Session) -URLSession.shared()

- 싱글톤으로 사용할 수 있음, 기본 요청을 하기 위한 session

- 직접 만든 세션만큼 맞춤설정을 할 수는 없지만 쉽게 만들어 사용할 수 있음

 

2.기본세션(Default Session) - URLSession(configuration:.default)

- 직접원하는 설정을 할  수 있고 캐시와 쿠키 인증등을 디스크에 저장함 

- 순차적으로 데이터를 처리하기 위해 Delegate를 지정할 수 있음

 

3.임시세션(Ephemeral Session) - URLSession(configuration:.ephemeral)

- 캐시 쿠키 사용자 인증 정보를 디스크에 저장하지 않음 

- 메모리에 올려서 세션을 연결하고 

- 세션만료시 데이터가 사라짐 

 

4. 백그라운드 세션 (Background Session) - URLSession(configuration:.background)

- 앱이 실행되지 않는 동안 백그라운드에서 컨텐츠 업로드 및 다운로드를 수행할 수있음 

 

 

URLSession구성되었으면 URLSessionTask를 이용해서 각 세션내에 작업을 추가할 수 있음

1.URLSessionDataTask

- 데이터 객체를  사용하여 데이터를 요청하고 응답 받음 

- 주로 짧고 빈번하게 요청할때 사용

2. URLSessionUploadTask

- 데이터 객체 또는 파일형태의 데이터를 업로드하는 작업을 수행함

- 앱이 실행되지 않았을때 백그라운드 다운로드를 지원함 

3. URLSessionDownloadTask

- 데이터를 다운로드 받아서 파일형태로 저장하는 작업을 수행함

- 앱이 실행중이지 않을때는 백그라운드다운로드를 지원함

4. URLSessionStreamTask

- TCP/IP를 연결을 생성할때 사용되는 TASK

5. URLSessionWebSocketTask

- WebSocket 프로토콜 표준을 통해 통신하는 Task