📌 정의
URLSession은 네트워크 데이터를 가져오거나 보내는 작업을 수행한다.
configuration을 보고 세션을 생성한다.
📌 특징
1. 비동기적 네트워킹 (Asynchronous Networking)
URLSession은 비동기적으로 네트워크 요청을 처리하므로, 네트워크 작업이 백그라운드에서 수행될 수 있다.
이는 앱의 성능을 향상시키고 응답성을 유지하는 데 도움이 된다.
즉, 네트워크가 요청되는 동안 다른 작업이 가능하다.
2. 다양한 데이터 전송 방식 지원
URLSession을 사용하여 데이터를 업로드하거나 다운로드할 수 있으며,
JSON, 이미지, 파일 등 다양한 데이터 형식을 처리할 수 있다.
3. 캐시와 쿠키 관리
URLSession은 네트워크 응답을 캐싱하고 쿠키를 관리할 수 있는 기능을 제공한다
📌 구성
a) URLSessionConfiguration
URLSessionConfiguration(환경설정) 3가지!
1. .default
- 디스크를 이용한 정보 저장을 하는 configuration
- 그냥 브라우저를 띄울 때
2. .ephemeral
- default랑 비슷한데, 몇 가지 정보들을 저장하지 않음(쿠키, 인증서 등)
- 브라우저 시크릿 모드와 유사
3. .background
- 네트워크를 통해 파일 다운로드 받을 때
- 앱이 백그라운드에서 돌때도 다운로드 시켜줄 수 있음
b) URLSession
configuration을 보고 세션을 생성한다.
c) URLSessionTask
1. dataTask
2. uploadTask
3. downloadTask
📌 URLSession 생성 코드
<방법 1> : configuration 설정
import Foundation
// configuration -> urlsession -> urlsessionTask
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration) // 주요 객체
let url = URL(string: "https://api.github.com/users/yurim830")!
let task = session.dataTask(with: url) { data, response, error in
guard let httpResponse = response as? HTTPURLResponse,
(200..<300).contains(httpResponse.statusCode) else {
print("--> response \(response)")
return
}
guard let data = data else { return }
let result = String(data: data, encoding: .utf8)
print(result)
}
// 네트워크 요청 시작
task.resume()
<방법 2> : shared session
import Foundation
// URLSession 인스턴스 생성
let session = URLSession.shared
// URL 생성
if let url = URL(string: "https://api.github.com/users/yurim830") {
let task = session.dataTask(with: url) { (data, response, error) in
// 통신 실패 시 nil이 아닌 데이터가 돌아옴 -> 에러 핸들링
if let error = error {
print("error: \(error)")
} else if let data = data {
// 데이터를 받아온 후 처리하는 로직
let result = String(data: data, encoding: .utf8)
print("result: \(result)")
}
}
// 네트워크 요청 시작
task.resume()
}
shared session이란?
다른 session과 다르게, shared session은 직접 생성하는 대신, 프로퍼티를 다이렉트로 사용함으로써 접근할 수 있다.
그러나, shared session은 delegate도 아닐 뿐더러 커스터마이징 가능한 configuration 객체도 아니기 때문에 분명히 한계를 지닌다.
<한계>
1. 서버에서 데이터가 도착하는대로 점진적으로 얻을 수 없다.
2. default connection behavior를 커스터마이징할 수 없다.
3. 인증서(authentication)가 제한된다.
4. 앱이 실행되지 않을 때 백그라운드 다운로드 또는 업로드를 수행할 수 없다.
<정리>
cache, cookies, authentication, custom networking protocols 관련하여 작업할 때는
shared session에서 진행할 수 없으므로, default session을 사용해야 한다.
🔗 링크: https://developer.apple.com/documentation/foundation/urlsession/1409000-share
'Swift > TIL(TodayILearned)' 카테고리의 다른 글
[Swift|TIL] 240417 - 스레드(Thread), 직렬/동시(Serial/Concurrent), 동기/비동기(sync/async) (0) | 2024.04.17 |
---|---|
[Swift|TIL] 240415 - REST API란? / REST API 호출 실습 (0) | 2024.04.16 |
[Swift|TIL] 240414 - (AppStore) 코드로 셀 커스터마이징하기 / cell이 재사용되기 전, 초기에 1번 호출하자 - awakeFromNib() (0) | 2024.04.14 |
[Swift|WIL] 5주차 - 앱 만들기 학습내용 정리 (0) | 2024.03.29 |
[Swift|TIL] 240322 - TableView 구현하기(1) (0) | 2024.03.23 |