iOS에서 네트워크 통신하기

iOS에서 네트워크 통신을 어떻게 할까?

서버에 데이터를 업로드/다운로드 하기 위해 애플은 URLSession을 제공한다. URLSession은 여러 프로토콜을 지원하지만 그 중에서 많이 쓰이는 HTTP 통신을 어떻게 구현하는지 알아보자.

0. HTTP 통신

HTTP는 Hyper Text Transfer Protocol의 약자로 철자 그대로 해석하면 하이퍼텍스트 전송 프로토콜이다. 하이퍼링크를 통해 텍스트가 비 선형적으로 연결된 환경이 하이퍼텍스트이며, 인터넷의 모든 페이지는 하이퍼텍스트의 형태를 가지고 있다. 즉 HTTP는 웹 서버에 존재하는 리소스를 클라이언트가 요청 메시지를 통해 요구하고 서버가 응답 메시지를 통해 전달하기 위한 통신 규약이다.

요청 메시지와 응답 메시지에는 시작줄, 헤더, 바디가 있다. 요청 메시지의 시작줄에는 메서드, URL, HTTP 버전이 있고, 응답 메시지의 시작줄에는 HTTP 버전, 상태 코드, 사유 구절 이 있다. 헤더에는 content-length, content-type과 같은 부가 정보가 들어가 있다. 바디는 선택 사항인데, 보통 응답 메시지의 바디에 요청 받은 데이터가 들어있다.

1. TCP/IP

서버/클라이언트 사이의 HTTP 메시지 전송은 전송계층인 TCP와 네트워크 계층인 IP를 통해 이루어진다. TCP는 프로세스 간의 통신이라면 IP는 호스트 대 호스트 통신을 가능하게 한다. IP는 목적지 호스트에 메시지를 전달할 뿐 적절한 프로세스에게 메세지를 전송하려면 TCP가 필요하다.

TCP는 프로그램으로 부터 데이터 블록을 받으면 이를 여러 개의 세그먼트로 분리한다. 세그먼트에는 sequence number가 존재하는데 이 시퀀스 넘버 덕분에 순서가 바뀌지 않고 안전하게 전달할 수 있다. 또한 TCP는 신뢰성을 실현하기 위해 재 전송 체계를 사용한다. 종료 시간 안에 ACK 세그먼트가 수신되지 않으면 데이터가 재전송 된다.

2. Mac OS/ iOS에서 HTTP 통신하기

애플이 제공하는 URL loading 시스템은 생성한 https 또는 사용자 정의 프로토콜과 같은 표준 프로토콜을 사용하여 URL로 식별되는 자원에 대한 액세스를 제공한다. 로딩은 비동기 적으로 수행된다.

URLSession 인스턴스를 사용해 통신하는 방법은 다음과 같다.

  1. Session을 생성한다.
  2. URL, Request 객체를 만든다.
  3. Task를 생성한다.
  4. Task의 resume() 메소드를 호출하여 요청을 실행한다.
  5. 응답은 completionHandler 혹은 delegate를 통해 받는다.

2-1. Session 생성하기

URLSession을 생성하는 방법은 세 가지가 있다.

init(configuration: URLSessionConfiguration)
init(configuration:delegate:delegateQueue:)
class var shared: URLSession

2-2. URL, Request 객체 만들기

모든 요청은 URL을 필요로 한다. Request 객체는 요청 메시지에 해당하는 객체로 앞서 얘기한 HTTP 메소드, url, 바디를 포함하여 캐시 정책 정보를 가지고 있다. HTTP 메소드는 디폴트로 “GET” 값을 가진다.

2-3. Task 생성

Task는 url 세션에서 수행된다.

3. 캐시 데이터 접근하기

세션을 생성하여 클라이언트와 서버간에 통신을 하면 응답 데이터를 캐시한다고 했다. 그렇다면 이 캐시 데이터의 접근/삭제와 같은 관리는 어떻게 해야할까?


참고

애플 공식문서: URL loading system

https://www.raywenderlich.com/567-urlsession-tutorial-getting-started