URLSession
URLSession은 애플에서 HTTP 통신을 위해 만든 것으로 특정 URL을 이용해서 데이터를 다운로드하고 업로드하기 위해 사용하는 API이다.
URLSession의 종료
- 기본 세션 : URLSession(configuration: .default)
- 기본 세션은 일반적인 네트워크 요청을 수행하는 데 사용된다.
- 기본적으로 디스크 기반의 캐시 및 쿠키를 지원한다.
- 쿠키, 인증 정보 등을 자동으로 관리하고 유지한다.
- 앱의 메모리에 캐시된 데이터는 자동으로 디스크에 기록된다.
- 기본적으로 세션이 지속되지 않는데, 세션을 종료하면 쿠키와 캐시가 삭제된다.
- 임시 세션 : URLSession(configuration: .ephemeral)
- 임시 세션은 일회성 네트워크 요청에 사용된다.
- 캐시, 쿠키, 자격 증명 등을 유지하지 않는다.
- 모든 데이터는 메모리에만 캐시되며, 세션 종료 시에 자동으로 삭제된다.
- 개인 정보 보호를 위해 쿠키와 기타 사용자 정보를 보존하지 않아야 할 떄 유용하다.
- 백그라운드 세션 : URLSession(configuration: .background)
- 백그라운드 세션은 앱이 백그라운드에서 실행 중일 때 네트워크 작업을 수행하는 데 사용된다.
- 백그라운드에서 실행 중인 작업이 있을 때도 네트워크 요청을 지속할 수 있다.
- 앱이 종료된 후에도 네트워크 요청을 계속할 수 있다.
- 다운로드 및 업로드 작업을 지원하며, 파일 다운로드가 완료되면 알림을 받을 수 있다.
URLSessionTask의 종류
- URLSessionDataTask
- HTTP GET 요청을 수행하는 데 사용된다.
- 서버에서 데이터를 가져오는 데 사용되며, 다운로드된 데이터는 메모리에 저장된다.
- 주로 JSON, 이미지 등의 작은 데이터를 가져오는 데 사용된다.
- completionHandler를 사용하여 작업이 완료될 때 데이터를 처리한다.
- URLSessionUploadTask
- HTTP POST 요청을 수행하여 데이터를 서버로 업로드하는 데 사용된다.
- 파일 업로드나 멀티파트 폼 데이터를 보낼 때 주로 사용된다.
- 데이터를 서버로 보낸 후에는 서버의 응답을 받는다.
- URLSessionDownloadTask
- 파일 또는 리소스를 다운로드하는 데 사용된다.
- 다운로드된 파일은 디스크에 저장된다.
- 주로 큰 파일을 다운로드하거나 백그라운에서 파일을 다운로드하는 데 사용된다.
- completionHandler를 사용하여 다운로드가 완료된 후 파일의 위치를 처리한다.
- URLSessionStreamTask
- 스트림 기반의 데이터를 주고 받을 때 사용된다.
- TCP/IP 기반의 네트워크 연결을 설정하고 데이터를 스트림으로 전송하는 데 사용된다.
- 주로 서버와 실시간으로 데이터를 주고 받아야 하는 경우나 스트리밍 미디어를 다루는 경우에 사용된다.
- URLSessionWebSocketTask
- WebSocket을 사용하여 양방향 통신을 위한 연결을 설정한다.
- 실시간 채팅 앱이나 실시간 데이터 전송 앱에서 사용될 수 있다.
- WebSocket 프로토콜을 통해 데이터를 보내고 받을 수 있다.
URLSession Life Cycle
- 생성 (Creation)
- URLSession 객체는 URLSessionConfiguration을 사용하여 생성한다.
- URLSessionConfiguration은 세션의 동작을 구성하는 데 사용되며, 캐시, 타임아웃, 쿠키 등의 설정을 지정할 수 있다.
- URLSession을 생성할 때는 URLSession.shared를 사용하여 기본 세션을 공유하거나, 직접 URLSession 객체를 생성할 수 있다.
- 구성 (Configuration)
- URLSession은 생성된 후에도 구성을 변경할 수 있다.
- URLSessionConfiguration을 통해 구성된 세션을 만들 때 지정된 설정을 유지한다.
- 세션을 구성하는 것은 필요에 따라 캐시 정책, 타임아웃 값 등을 조정하는 데 사용된다.
- 작업 생성 (Task Creation)
- URLSession을 사용하여 네트워크 작업을 생성한다.
- URLSessionDataTask, URLSessionUploadTask, URLSessionDownloadTask 등 다양한 종류의 장버을 생성할 수 있다.
- 작업을 생성할 때는 요청 정보를 포함하여 작업의 동작을 구성한다.
- 작업 수행 (Task Execution)
- 생성된 작업은 URLSession 객체를 통해 실행된다.
- 실행된 작업은 비동기적으로 백그라운드에서 실행되며, 네트워크 작업이 완료될 때까지 기다린다.
- 작업의 실행 도중에는 네트워크 요청 및 응답을 처리하고, 데이터를 주고 받는다.
- 작업 완료 및 처리 (Task Completion and Handling)
- 네트워크 작업이 완료되면 URLSession 객체는 작업 완료 핸들러를 호출하여 결과를 처리한다.
- 완료 핸들러를 사용하여 데이터를 처리하거나 오류를 처리한다.
- 작업이 완료된 후에는 필요한 정리 작업을 수행하고, 세션에서 제거할 수 있다.
- 세션 해제 (Deallocation)
- URLSession 객체는 더 이상 필요하지 않을 때 해제된다.
- 세션은 사용이 완료되면 invalidate() 메서드를 사용하여 해제할 수 있다.
- 세션이 해제되면 해당 세션과 관련된 리소스가 해제되고 메모리에서 제거된다.
URLSession 사용 예제
import Foundation
let url = URL(string: "https://api.github.com/users/Gwan-Son")
let session = URLSession.shared
let task = session.dataTask(with: url!) { data, response, error in
// 에러 처리
if let error = error {
print("Error: \(error)")
return
}
// HTTP 응답 처리
guard let httpResponse = response as? HTTPURLResponse, (200..<300).contains(httpResponse.statusCode) else {
print("Invalid response")
return
}
if let data = data {
if let dataString = String(data: data, encoding: .utf8) {
print("Received data: \(dataString)")
}
}
}
task.resume()