Notice
Recent Posts
Recent Comments
Link
«   2024/03   »
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
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[iOS/Swift] HTTP/HTTPS 통신의 기본, URLSession 본문

iOS_Swift

[iOS/Swift] HTTP/HTTPS 통신의 기본, URLSession

_슈프림 2020. 12. 29. 20:06
728x90

앱을 만들다보면 로컬 작업만으로도 충분한 경우도 있지만, 웹서버와 통신이 필요한 경우가 대부분이다.

웹서버 통신은 크게 2종류로 나눌 수 있다.

  • HTTP 통신 : URL 기반으로 클라이언트에서 요청을 보내고, 서버로부터 응답을 받는 형태의 통신
  • 웹소켓 통신 : 클라이언트와 서버가 특정 Port를 통해 연결되어있는 양방향 형태의 통신. 실시간 통신에 주로 사용된다.

오늘은 iOS 앱에서 HTTP/HTTPS 통신 하는 법을 살펴볼 예정이다.


developer.apple.com/documentation/foundation/urlsession

 

Apple Developer Documentation

 

developer.apple.com


URLSession

URLSession은 HTTP / HTTPS 기반의 URL로부터 데이터를 다운로드하거나 업로드하는 API 제공하는 클래스다.

 

앱에서 통신을 하기 위해서는 하나 이상의 URLSession 인스턴스를 생성해야 하며,

각 인스턴스는 데이터 전송 관련 그룹을 컨트롤하게 된다.

 

URLSession은 자체적으로 비동기적으로 작동하게 구현되어있으므로, 따로 비동기 처리할 필요가 없다.

대신 completionHandler를 작성할 때, UI 관련 작업을 수행한다면 반드시 Main 스레드에서 작업해주어야 한다.

 

예를 들어,

하나의 탭 또는 창마다 하나의 세션을 만들어 볼 수 있고,

세션은 상호작용하는 데에, 다른 하나는 백그라운드에서 다운로드하는 데에 사용할 수 있는 것이다.

다운로드가 완료된 후, UI를 업데이트 하고 싶다면 Main 스레드에서 작업한다.


URLSessionConfiguration

URLSession은 configuration이라는 객체를 가지고 있다.

업로드할 지 다운로드할 지 등의 행동과 규칙을 정의하는 객체이다.

 

URLSession 객체를 초기화 하기 전에 가장 먼저 작업해야할 첫 단계이며,

타임아웃 값, 캐싱 정책, HTTP 헤더와 같은 값들로 구성된다.

 

🔥종류는 .default, .ephemeral, .background 총 3종류다.

 

여기서 주의해야 할 점은 configuration의 복사본으로 session을 셋팅하게 된다.

따라서, session이 생성되고 난 이후에 configuration 객체가 변동되어도 session은 변하지 않는다.

🔥configuration 규칙을 수정하고 싶으면, 새로운 configuration으로 새로운 session을 만들어야 한다!


URLSession 종류

URLSession의 종류는 configuraion 객체에 의해 결정된다.

 

  • 공유 세션 (싱글톤) : URLSession.shared()
    • 기본 요청을 위한 세션
    • configuration 객체 없음
    • 사용자 정의 불가
  • 기본 세션 : URLSession(configuration: .default)
    • 디스크에 기록함 (캐시, 쿠키, 자격 증명)
    • delegate 지정 가능 (순차적으로 데이터 처리)
  • 임시 세션 : URLSession(configuration: .ephemeral)
    • 디스크에 데이터를 쓰지 않음(캐시, 쿠키, 인증 등)
    • 메모리에 올려서 세션을 연결하고, 세션 만료 시 데이터 사라짐 -> 비공개 세션이라고 생각하면 됨
  • 백그라운드 세션 : URLSession(configuration: .background)
    • 백그라운드에서 업로드, 다운로드가 가능함
    • 별도의 프로세스가 모든 데이터 전송을 처리 (앱이 중지되거나 종료되어도 계속함)

Session 생성

let sharedSession = URLSession.shared()
let defaultSession = URLSession(configuration: .defualt)
let ephemeralSession = URLSession(configuration: .ephemeral)
let backgroundSession = URLSession(configuration: .background)

URLSessionTask

각 세션 내에서는 작업(Task)을 추가할 수 있다.

 작업은 특정 URL 대한 요청을 의미하며, HTTP 리디렉션이 될 수도 있다.

 

url 주소만으로 요청할때는 URL 객체를 이용하고,

주소와 HTTP 메소드, Body까지 설정해야 할 때는 URLRequest 객체를 이용하면 된다.

 

URL 객체

string값으로 되어있는 주소를 URL 객체로 생성

let url = URL(string: "https://test.url.com")

URLRequest 객체

URLRequest는 캐싱 정책, HTTP 메소드, HTTP Body 등을 설정할 수 있다.

let request: URLRequest = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Accept")

URLSessionTask 종류

  • URLSessionDataTask (HTTP GET)
    • 응답 데이터를 받아서 Data 형태의 객체를 받아오는 작업
    • JSON, XML, HTML
  • URLSessionUploadTask (HTTP POST/PUT)
    • Data 객체 또는 파일 형태의 데이터를 서버로 업로드하는 작업 (백그라운드 O)
  • URLSessionDownloadTask
    • 파일 형태의 데이터를 다운로드하는 작업 (백그라운드 O)
    • 일시정지, 재개, 취소 가능
  • 웹소켓 작업은 URLSession이 아니라 WebSocket 프로토콜을 사용

Task 추가

session.dataTaks(with:)와 같은 형태로, 위에서 생성한 세션의 함수 호출을 통해 작업을 추가할 수 있다.

 

DataTask 추가하기

URL 또는 URLRequest 객체 기반으로 데이터 요청

func dataTask(with url: URL) -> URLSessionDataTask
func dataTask(with request: URLRequest) -> URLSessionDataTask

요청에 대한 응답을 처리할 completionHandler가 필요한 경우 구현

func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask
func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask

 

DownloadTask 추가하기

URL 또는 URLRequest 객체 기반으로 다운로드 데이터 요청

func downloadTask(with url: URL) -> URLSessionDownloadTask
func downloadTask(with request: URLRequest) -> URLSessionDownloadTask

다운로드 완료 후 실행될 구문인 completionHandler가 필요한 경우 구현

func downloadTask(with url: URL, completionHandler: @escaping (URL?, URLResponse?, Error?) -> Void) -> URLSessionDownloadTask
func downloadTask(with request: URLRequest, completionHandler: @escaping (URL?, URLResponse?, Error?) -> Void) -> URLSessionDownloadTask

 

UploadTask 추가하기

업로드할 데이터를 Data 또는 파일 URL 형태로, URLRequest 기반으로 업로드 요청

func uploadTask(with request: URLRequest, from bodyData: Data) -> URLSessionUploadTask
func uploadTask(with request: URLRequest, fromFile fileURL: URL) -> URLSessionUploadTask

업로드 완료 후 실행될 구문인 completionHandler가 필요한 경우 구현

func uploadTask(with request: URLRequest, from bodyData: Data?, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionUploadTask
func uploadTask(with request: URLRequest, fromFile fileURL: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionUploadTask

Task 상태 제어

  • cancel() : 작업을 취소한다.
  • resume(): 일시중단된 작업을 다시 시작한다.
  • suspend() : 작업을 일시중단한다.
  • state (get-only) : 작업의 상태
  • priority (get-only) : 작업의 우선순위 (0.0 ~ 1.0)

Task 객체를 만들고 난 뒤 함수를 실행해도 되고,

Task 객체를 만드는 동시에 바로 실행해도 된다.

let task: URLSessionDataTask = session.dataTask(with: url)
task.resume()
session.dataTask(with: url).resume()

😊 총 정리 😆

  1. 싱글톤 세션을 만들거나, configuration(default/ephemeral/background)을 정의하여 세션을 만든다.
  2. 세션에 작업을 추가한다.
    1. URL 또는 URLRequest 객체를 만든다.
    2. 작업의 종류 (DataTask/UploadTask/DownloadTask)를 선택한다.
    3. UploadTask일 경우, 업로드할 데이터(Data 또는 파일 URL)를 준비한다.
    4. completion handler가 필요할 경우 구현해준다.
  3. 작업을 실행(또는 취소) 한다.
반응형
Comments