URLSession이란?
- An object that coordinates a group of related, network data transfer tasks.
- API 통신을 하기 위한 클래스.
- 데이터를 업로드 / 다운로드하는 데에 사용
- 앱이 실행중이지 않을 때, 백그라운드에서도 통신이 가능.
하나의 URLSession에서 여러 개의 URLSessionTask 인스턴스를 만들 수 있으며, URLSessionTask 각각은 데이터를 fetch하거나, 업로드하거나, 파일을 다운로드하는 역할을 할 수 있다.
URLSession의 Request와 Response
URLSession
은 다른 HTTP 통신과 마찬가지로Request
와Response
를 기본 구조로 가진다.Request
URL
객체를 통해 직접 통신하는 형태URLRequest
객체를 만들어서 옵션을 설정하여 통신하는 형태
Response
- 설정된
Task
의Completion Handler
형태로response
를 받는 형태 - (+) async/await 으로도 비동기 처리 가능 !
URLSessionDelgate
를 통해 지정된 메소드를 호출하여response
를 받는 형태
간단한 response →
Completion Handler
백그라운드에서도 지원하거나, 인증, 캐싱을 default 옵션으로 사용하지 않을 때 →
Delegate
패턴- 설정된
URLSession’s Life Cycle
Session
configuration을 결정,Session
을 생성 (shared
제외)- 통신할 URL과 Request 객체를 설정 (Request 작성)
- 사용할
Task
를 결정, 그에 맞는Completion Handler
나Delegate
메소드 작성 - 해당
Task
를 실행 (.resume()
) - Task 완료 후
Completion Handler
가 실행.
URLSession Configuration
.default Session
.default Session은 추가로 사용자 지정하지 않은 한 shared Session과 비슷하게 동작
shared와는 다르게 delegate를 할당, 데이터 fetching 가능.
→ 기본적인 방법.
.ephemeral Session
.ephemeral Session은 .default Session과 비슷하지만 cache, cookies, credential를 디스크에 쓰지 않음.
→ 쿠키, 캐시, 인증(credential)을 저장할 일이 없을 때 사용 (ex. 크롬 시크릿 창 등)
.background Session
.background Session은 앱이 실행되지 않는 동안 Background에서 콘텐츠 업로드, 다운로드를 수행.
→ 백그라운드 실행이 필요할 때 사용
// configuration이 default인 URLSession 객체 생성
let defaultSession = URLSession(configuration: .default)
// URLSessionConfiguration 객체를 생성 후, URLSession 객체 생성 시 사용
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
URLSession Task
Data Task
Get 통신으로 데이터를 fetching할 때 사용.
Upload Task
POST, PUT 통신으로 데이터를 upload할 때 사용.
background upload를 지원.
Download Task
특정 URL로부터 파일 등을 download할 때 사용. (ex. 음악 파일, 사진 파일 등)
background download를 지원.
Stream Task
양방향의 TCP/IP 통신을 구현할 때 사용.
예시: dataTask(with: completionHandler:)
func dataTask(
with request: URLRequest,
completionHandler: @escaping @Sendable (Data?, URLResponse?, Error?) -> Void
) -> URLSessionDataTask
- request parameter에는
URLRequest
객체를 생성하여 넣어주기.
URLRequest | Apple Developer Documentation
- Completion Handler 넣어주기. Completion Handler에는
data
,response
,error
parameter가 존재해야 함. (각각 NSData, NSResponse, NSError) - *Completion Handler는
nil
일 수 있으며,nil
값일 경우, dataTask(with:) 과 동일. - *Completion Handler가 존재할 경우, data 전달과 response를 받기 위한 Delegate 함수들은 실행되지 않음.
func getAnimalData(completion: @escaping (String) -> ()) {
guard let url = URL(string: "<https://Jeckmutest/app/urlsession/dataTask>") else {
return
}
let request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print(error.localizedDescription)
return
}
guard let httpResponse = response as? HTTPURLResponse,
(200..<300).contains(httpResponse.statusCode) else {
print("error")
return
}
if let data = data {
do {
let receivedData = try JSONDecoder().decode(~~~, from: data)
completion("성공!")
} catch {
print(error.localizedDescription)
}
}
}
}
task.resume()
Reference
URLSession | Apple Developer Documentation
[Swift] URLSession(1) - 개념 모아보기(URLSession, URLSessionConfiguration, URLSessionTask)