티스토리 뷰

안녕하세요?
너구리입니다.
URLSession에 대해 알아보도록 하겠습니다.
처음 접하시는 분이라면 URL Loading System 을 먼저 읽고 와주세요!
모든 내용은 공식문서를 기반으로 합니다.
URLSession은 무엇인가
URLSession은 네트워크 통신을 할 수 있도록 애플에서 제공하는 기본 API입니다.
자주 들어보셨던 라이브러리, Alamofire나 Moya또한 URLSession을 기반으로 합니다.
URLSession을 통해 data를 업로드 하거나
파일을 다운로드 받을 수 있어요!
URLSession을 간단히 사용할 때는 기본적으로 싱글톤 객체(shared)를 사용합니다.
하지만 shared객체는 configuration가 없어서 세부적인 값을 설정할 수 없습니다.
configuration을 설정하기 위해서는 다른 URLSession 객체를 만들어야 하고
3가지의 객체 종류가 있습니다.
- default : shared 객체와 매우 비슷하게 작동하지만 configuration을 설정할 수 있고, delegate설정해서 data를 점진적으로 받을 수 있습니다.
- ephemeral : shared 객체와 비슷하지만 캐시나 쿠키등을 디스크에 저장하지 않습니다.
- background : 앱이 꺼져있을 때 background 상태에서 컨텐츠를 업로드 하거나 다운로드 합니다.
객체를 생성하고 나면 Task를 만들어 data를 업로드 하거나 파일을 받을 수 있습니다.
task 메서드는 멈춘 상태에서 생성되고 resume() 메서드를 통해 실행됩니다.
task의 종류는 총 4개입니다.
- dataTask : NSData 객체를 사용한 데이터를 서버로 주고 받습니다. 서버와 짧고 자주 통신할 때 사용합니다.
- uploadTask : dataTask와 비슷하지만 파일형태의 data도 올릴 수 있고, 앱이 죽은 상태에서도 backgroud upload 기능을 제공합니다.
- downloadTask : 파일 형태의 data를 다운로드 받고 앱이 죽은 상태에서도 backgroud upload 기능을 제공합니다.
- websocketTask : RFC6455로 정의된 websocket protocol을 사용해서 TLS, TCP통신을 통해 message를 주고받습니다.
Delegate를 통해 위임자를 설정해 인증 실패, 서버 정보 도착, 데이터 캐시 사용기능을 사용할 수 있습니다.
이때 주의해야할 점은 delegate와 session object는 강한 참조를 한 상태기때문에
memory leak이 발생할 수 있습니다. 사용하지 않을 경우 nil을 할당하면 됩니다.
URL 살펴보자
URLSession을 직접 사용해보기전에 URL에 대해 살펴보고
swift에서 어떻게 사용하고 있는지 살펴보겠습니다.
먼저 URL 구조을 살펴볼겠습니다.

protocol(scheme), host(domain), port, path, query string으로 구조를 나눌 수 있습니다.
실제 코드를 살펴볼게요
// 1. string으로 바로 구성하기
let url = URL(string: "https://neogurios.tistory.com/46")!
print(url) // https://neogurios.tistory.com/46?neoguri=yummy
// 2. urlComponents를 사용해서 구성하기
var urlComponent = URLComponents()
urlComponent.scheme = "https"
urlComponent.host = "neogurios.tistory.com"
urlComponent.path = "/46"
urlComponent.queryItems = [URLQueryItem(name: "neoguri", value: "yummy")]
print(urlComponent.url!) // https://neogurios.tistory.com/46?neoguri=yummy
첫번째로 사용한 방법은 호출할 url을 String타입으로 바로 url을 구성했습니다.
두번째 방법은 URLComponents를 사용해서 위의 사진처럼 구성요소를 하나씩 채워나가는 방식으로 구현했습니다.
첫번째 방법은 바로 호출할 수 있어 좋아보이긴 하지만 두번째 방법은 각 구성요소를 조합할 수 있어 확장성이 좋습니다.
URLSession을 직접 사용해 보자.
이제 실제로 URLSession을 사용해보겠습니다.
간단하게 shared 객체를 사용해서 구현해 볼게요.
URLSession을 사용하는 흐름은 아래 사진과 같습니다.

이 흐름에 따라 코드를 작성해볼게요!
먼저 session을 생성해 보겠습니다.
let urlSession = URLSession.shared
// default urlsession 생성
let defaultURLSession = URLSession(configuration: .default)
추가로 default urlsession도 생성해 봤습니다.
다음은 dataTask입니다.

dataTask메서드는 이렇게 생겼고 @escaping closure를 통해 completionHandler를 구성합니다.
let url = URL(string: "https://neogurios.tistory.com/46?neoguri=yummy")!
let request = URLRequest(url: url)
urlSession.dataTask(with: request) { data, response, error in
}.resume()
// resume 까먹지 말자!!!!!
이제 completionHandler를 구성해보겠습니다.
urlSession.dataTask(with: request) { data, response, error in
// 에러 있는지 확인
guard error == nil else {
print(error?.localizedDescription)
return
}
// resopnse 성공 확인
guard let data = data,
let response = response as? HTTPURLResponse else { return }
// status code에 따른 처리
switch response.statusCode {
case 200..<300:
guard let jsonData = try? JSONSerialization.jsonObject(with: data) else {
// decoding error
return
}
default:
return
// 에러 코드
}
}
.resume()
completionHandler에서 각 데이터 처리와
error처리를 간단히 해봤습니다.
주석을 참고해주세요!
주석에도 써놓았지만 urlSession을 사용할때는 resume()메서드 까먹지 마세요!!
위에도 설명했지만 task메서드는 resume()메서드를 호출하여 실행됩니다!!!!
글 읽어주셔서 감사합니다.
출처 : https://developer.apple.com/documentation/foundation/urlsession
'iOS > Swift' 카테고리의 다른 글
| [iOS/Swift] Test Code를 작성해보자 - TDD란? (2) | 2023.10.11 |
|---|---|
| [iOS/Swift] Alamofire 알아보기 (0) | 2023.07.23 |
| [iOS/Swift] URL Loading System 알아보기 (0) | 2023.05.29 |
| [iOS/Swift] 동시성 프로그래밍 - DispatchGroup의 여러 사용법 (0) | 2023.01.29 |
| [iOS/Swift] 동시성 프로그래밍 - Dispatch Group (0) | 2023.01.11 |
- Total
- Today
- Yesterday
- XCTest
- URLSession
- 스위프트 프로토콜
- swift 프로토콜
- Clean
- Swift Network
- 프로토콜
- 공부
- observable
- swift urlsession
- Unit Test
- xcode
- swift
- 스위프트
- Protocol
- 스위프트 map
- RxSwift
- Property
- RX
- func
- 테스트
- 프로퍼티
- ios
- test
- 스위프트 공부
- swift 공부
- 오토레이아웃
- network
- set
- autolayout
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |