URL Loding System과 URLSession

고라니·2023년 9월 27일
0

TIL

목록 보기
36/67

iOS에서 네트워킹 작업을 하기 위해 URLSession을 사용한다.

애플 문서에서 URLSession 참조 문서만 보면 API를 사용하기엔 명확하지 않을 수 있기 때문에 URL Loding System 개요를 먼저 읽어보라고 한다.

URL Loding System

애플의 URL Loding System은 URL을 통해 자원 접근, 표준 인터넷 프로토콜 사용하여 서버와 통신을 제공한다. (비동기)

  • URLSession은 이 시스템의 핵심 클래스로, 데이터 접근 및 네트워크 통신의 기본적인 작업을 처리하기 위한 객체이다.

  • URLSeesion인스턴스를 통해 URLSessionTask를 생성하여 데이터를 가져오거나, 파일을 다운로드/업로드하는 실질적입 작업을 수행한다.

  • URLSessionConfigureation 객체를 사용하여 캐시와 쿠키의 사용 방법, 셀룰러 네트워크 연결 허용 여부와 같은 동작 제어를 통해 세션을 구성할 수 있다.

  • URLSeesion 인스턴스는 재사용이 가능하다.

  • 델리케이트를 통해 작업 중 발생하는 업데이트나 오류 등의 상황을 핸들링 할 수 있다.

  • 위의 모든 작업들은 모두 백그라운드에서 실행될 수 있다.

대략적인 URL Loding System에 대해서 알아보았다
내용에서 나온 주요 객체들에 대해서도 알아보도록 하자.


URLSession

URLSession은 URL을 통해 데이터를 다운로드/업로드할 수 있게 해주는 URL Loading System의 핵심 클래스다.

특징

  1. 세션 생성 및 활용
    앱에서 필요한 만큼 여러 개의 URLSession 인스턴스 즉, 여러 세션을 생성할 수 있다.생성된 각 인스턴스는 여러 데이터 전송 작업을 관리한다.

  2. URL 세션 종류

    • Default: 일반적으로 사용, 기본 설정이지만 필요에 따라 커스텀 가능
    • Ephermeral: 캐시나 쿠키 같은 데이터를 저장하지 않음
    • Background: 앱이 꺼져 있거나 백그라운드 상태에서도 작동하는 세션으로 파일 다운로드나 업로그 같은 긴 작업에 적합
  3. 델리게이트
    Task들은 델리게이트로 이벤트를 처리(에러, 완료 등) 세션을 해제하지 않으면 메모리가 누수될 수 있음(명시적으로 해제해주어야 함)

  4. URLSession은 비동기적으로 동작, 스레드세이프티하게 설계되어 있어서 안전하게 비동기적으로 작업 가능

  • (+) 다양한 인터넷 프로토콜과 URL 형식을 지원, 사용자 정의 프로토콜 추가 가능

세션생성하기

 init(configuration: URLSessionConfiguration)

간단한 요청이나 델리게이트가 필요 없거나 자주 사용하지 않는 경우에 'shared'싱글톤 세션 인스턴스를 사용한다.

 class var shared: URLSession { get }

URLSessionTask

URLSessionTask 클래스는 URLSession을 통해 생성하여 실제 작업을 수행하는 클래스이다. URLSession 인스턴스의 Task생성 메서드 중 하나를 호출하여 Task를 생성한다. 호출하는 메서드에 따라 테스크 유형이 결정된다.

테스크와 관련된 모든 속성은 키-값 관찰 기능을 지원하여 해당 속성의 변경을 감지하고 앱 내에서 처리가 가능하다.

Task 생성 유형

  • dataTask(with:): 서버의 응답을 메모리 내의 하나 이상의 NSData 객체로 변환하여 리소스를 요청한다. (백그라운드 세션에서는 지원되지 않는다.)

  • uploadTask(with:from:): dataTask와 유사하지만, 데이터나 파일을 서버에 업로드하는 데 특화되어 있다. 이는 서버에 데이터를 전송하고, 그 후에 서버의 응답을 받는 구조이다. (백그라운드 세션에서 지원된다.)

  • downloadTask(with:): 디스크의 파일로 리소스를 직접 다운로드 한다. (모든 유형의 세션에서 지원된다.)

  • streamTask(withHostName:port:): 호스트 이름 및 포트 또는 넷 서비스 객체에서 TCP/IP 연결을 설정한다.

이해가 안되는 부분이 있어서 좀더 알아보았다.

좀더 이해하기

  • uploadTask가 dataTask와 유사하다?: 공식문서에서는 dataTask가 요청을 통해 데이터를 받아오는 것에 중점을 둔 설명을 하고 있지만 간단한 데이터를 서버에 데이터를 전송하는 것도 가능하다. 그렇기 때문에 이 둘이 유사하다고 할 수 있다.

  • uploadTask와 dataTask가 데이터를 전송할 수 있기 때문에 유사하다면 데이터를 받아온다는 점에서 downloadTask와 dataTask가 유사하다고 볼 수 있지 않을까? : dataTask는 비교적 작은 데이터를 NSData객체로 받아오고 이 데이터는 메모리에 로드된다, 하지만 downloadTask는 비교적 큰 데이터를 디스크에 저장하기 때문에 이 둘은 유사하다고 보기 어렵다.

주요 메서드

  • resume(): 작업을 시작한다. URLSession을 통해 작업(Task)를 생성하면 기본적으로 정지상태이다. 그렇기 때문에 이 메서드를 호출하여 작업을 시작해야 한다.

  • suspend(): 진행 중인 작업을 일시 중지. 이후에 resume()을 호출하여 작업을 다시 시작할 수 있다.

  • cancel(): 작업을 취소한다. 작업과 관련된 모든 리소스는 정리된다. 작업이 시작되거나 완료되었다면 아무런 작업도 수행하지 않음

  • priority: 작업의 우선 순위를 설정하거나 검색. 작업이 세션 내에서 어떻게 스케줄링될지를 결정한다.


마치면서

URLSession은 네트워킹 작업을 수행하기 위한 핵심 클래스다. 이번에 주요 구성 요소와 작동 방식에 대해 알아보았다. 특히 URLSessionTask의 유형에 대해서 이해할 수 있었다.

iOS 개발에서 네트워킹은 매우 중요한 부분이다 다음에는 URLSession을 활용하여 간단하게 네트워킹 하는 싨급을 진행하도록 하겠다.

URLSession 외에도 다양한 네트워킹 라이브러리와 프레임워크가 있다. Alamofire와 같은 라이브러리를 활용하면 더욱 직관적이고 간결하게 네트워킹 작업을 수행할 수 있다. 하지만 URLSession을 먼저 활용해보고 숙달된 후에 사용해보는것이 좋을듯 하다.

profile
🍎 무럭무럭

0개의 댓글