본문 바로가기

TIL

URL Session

URLSession

  • 네트워크 데이터 전송 작업을 조정하는 객체
  • HTTP 프로토콜을 사용하여 앱 - 서버간 데이터를 통신을 위해 애플이 제공하는 API
  • 앱은 하나 이상의 URLSession 인스턴스를 생성하여 각자 데이터 전송 작업 그룹을 담당
  • HTTP 포함한 프로토콜 몇가지 지원
  • 인증, 쿠키 관리, 캐시 관리 등을 지원
  • request, response 구조를 갖음
  • Configuration 결정 → Session 생성 → Request용 URL 설정 → Task 결정 및 작성

URLSessionConfiguration

  • shared session : 기본 요청에 대한 공통 session 구성 객체
    • customizable session과 달리 사용자 정의 불가능
    • 간단하게 사용 가능하지만 delegate, configuration을 제공하지 않기 때문에 제약이 있음
    • 점진적 데이터 수신 불가능, 인증이 있는 경우 사용 불가능, background 사용 불가능
    → Util처럼 사용할 수 있도록 싱글톤 구조의 shared session을 기본 제공해준다.
  • customizable session : Default, Ephemeral, Background 세가지 형태로 URLSession을 생성(configure)
    • Default : 기본 통신. 캐싱을 지원. shared Session과 유사하지만 사용자가 구성 가능.
    • → 캐싱이란, 파일 복사본을 캐시나 임시 저장 위치에 저장하여 빠르게 액세스하도록 하는 프로세스
    • Ephemeral : 쿠키나 캐시를 저장하지 않는 정책을 가져올 때 사용 ex. Safari 개인정보보호 모드
    • Background : 앱이 백그라운드에 있는 상황에서 컨텐츠 다운로드, 업로드에 사용. 앱 종료되도 통신을 지원하는 세션

Delegate

  • URLSession은 Delegate가 필수적이지 않음 → Delegate를 지정하지 않으면 시스템 제공 Delegate를 사용
  • 특정 Task에 별도의 delegate를 지정하여 SessionDelegate에 도달하기 전에 콜백을 가로챌 수 있음
    • 아래 경우를 포함한 다양한 이벤트 발생 시 정보를 제공하고 얻을 때 사용
      • 인증 실패
      • 서버로부터 데이터 수신
      • 데이터를 캐싱이 가능하게 함
    • 위 기능이 필요하지 않으면 Session을 생성할 때 Delegate를 nil
    • Session은 앱이 종료되거나 Session을 무효화할 때까지 Delegate를 강한 참조
    • → Session을 무효화하지 않으면 메모리 leak 발생
    • 인증을 지원, 리디렉션(304: 내가 누른 주소가 아닌 다른 주소로 옮겨짐), 작업 완료와 같은 이벤트를 수신
    URLSessionTaskDelegate
    • URLSessionDelegate가 task 수준의 이벤트를 처리하기 위해 사용하는 프로토콜
    • 콜백을 제공하거나 async-await 메소드를 사용하여 데이터를 가져옴
    • 데이터 테스크, 다운로드 테스크는 받아오는 사이즈에 따라 URLSessionDownloadDelegate사용
  • URLSessionDelegate

URL Query

예제) https://search.naver.com/search.naver?where=nexearch&sm=top_hty&fbm=0&ie=utf8&query=바나나

  • https://search.naver.com/search.naver : URL 주소
  • where=nexearch : URLQueryItem 형태 - key(name)=value
  • search.naver : 엔드포인트 - 쿼리가 발생하기 전까지가 엔드 포인트
  • & : 여러 query를 구분

URLSession Task

  • DataTask
    • Response Data를 받아서 메모리 상에 처리
    • Background Session 지원 X
    • Task 실행 (→ URL 요청을 실시하고 완료) → 핸들러 실행 : 핸들러는 escaping Closure 형태로 받아져야함
  • UploadTask
    • 파일 업로드 시 사용
    • background 업로드도 지원한다
  • DownloadTask
    • 파일 다운로드하여 디스크에 쓸 때 사용
    • background 다운로드도 지원한다
  • WebSocket Task
    • RFC 6455에 정의된 WebSocket 프로토콜을 사용하여 TCP 및 TLS를 통해 메시지를 교환

MDN - HTTP response status codes

  • Successful responses (200 – 299) → 이것을 베이스로 successRange를 설정

Asynchronicity and URL Sessions

  • 앱에 데이터를 비동기적으로 반환하는 방법
    • 데이터 전송이 완료될 때 completion handler를 실행시킬 수 있음
    • 데이터 전송 중 혹은 완료 직후에는 Delegate 메소드를 사용하여 콜백을 받을 수 있음
  • 또한 URLSession은 상태와 진행 프로퍼티를 제공하여, 이 프로퍼티에 따라 프로그래밍 방식을 결정해야하는 경우에 사용함. 단, 해당 상태가 가변될 수 있다는 경고를 포함
  • → 데이터 송신의 상태에 따른 프로그래밍이 가능

Completion Handler

func a() {
	getFetchData { banana in print ("a: \\ (banana)")
    }
}
//네트워크를 통해 네이버에서 바나나 정보를 가져옴

func getFetchData (handler: (Banana) -> Void) {
	dataTask({ banana in handler (banana)
	})
}

func dataTask(handler: (Banana) -> Void) {
	URLSession.shared. () ... {
	// 성공
	handler ( )
	}
}

 

 

참고 링크

[Swift] URLSession과 사용법

URLSession | Apple Developer Documentation

 

728x90

'TIL' 카테고리의 다른 글

MarkDown 접기  (0) 2023.12.11
SOLID  (0) 2023.12.01
estimatedItemSize / itemSize  (0) 2023.11.30
UIApplicationDelegate / UISceneDelegate  (0) 2023.11.24
View 갈아끼우기  (0) 2023.11.23