[iOS/Swift]API _ URLSession Task

JJOOEE__·2024년 7월 18일
0

iOS

목록 보기
4/4

🍎 Swift 네트워크 통신 [ feat. URLSession , URLSessionTask ]

🍏 URLSession

  • iOS 와 서버 간의 http 프로토콜을 지원하며 Request와 Response 구조를 가진다.

  • URLSession은 여러 개의 URLSessionTask를 생성하여 이를 통해 서버와 통신을 하고, Delegate로 네트워크의 과정을 확인하는 형태이다.

  • URLSession은 네트워크 관련 클래스로 URL구조에서 데이터를 다운로드하고 업로드 하는 API를 제공한다

  • 앱이 실행되지 않거나 중단된 동안 백그라운드에서 다운로드를 수행
    인증을 지원하고 리디렉션 및 작업 완료와 같은 이벤트를 수신

🍀 URLSession 의 속성

  • URLSession은 configuration이라는 속성 3가지를 가진다.
    • .default : 기본 통신으로 디스크 기반 캐싱을 지원합니다.
  let defaultSession = URLSession(configuration: .defualt)
  • .ephemeral : 쿠키나 캐시를 저장하지 않는 정책을 가져갈 때 사용합니다. (ex. Safari의 개인정보보호 모드)
   let ephemeralSession = URLSession(configuration: .ephemeral)
  • .background : 앱이 백그라운드에 있는 상황에서 콘텐츠 다운로드, 업로드를 할 때 사용합니다.
  let backgroundSession = URLSession(configuration: .background)

🍀 URLSession을 구성하는 요소들

🍀 URLSession 통신 순서

🌈1. URL 객체를 생성한다.

  • Chap1. URLComponents를 이용한 URL 생성

    • 🔎 URLComponents 이란?
      : URLComponents는 URL을 구성하는 구조이며 URL을 더 쉽게 생성하게 도와준다
      🔎 URLRequest 구성 요소
      scheme/host/path/queryItems
  • 직접 URL을 작성하여도 되지만 path와 queryItem 가 바뀔 때마다 전체 주소를 변경한다면 번거롭겠죠? 하지만 URLComponents를 사용하여 따로 관리한다면? 변경되는 부분만 수정하면 된다!

import Foundation

// URLComponents를 사용하여 URL 구성
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "www.example.com"
urlComponents.path = "/api/v1/users"
urlComponents.queryItems = [
    URLQueryItem(name: "page", value: "1"),
    URLQueryItem(name: "per_page", value: "10")
]

// URL 구성 요소를 사용하여 URL 생성
if let url = urlComponents.url {
    print("URL: \(url)") // 출력: "URL: https://www.example.com/api/v1/users?page=1&per_page=10"
}

🌈 2. Request 객체를 생성한다.

  • Chap2. URLRequest 객체를 생성
    URLRequest는 URL에 대한 요청을 나타내는 인스턴스이다!

URLRequest는 URL요청에 필요한 정보를 포함시키며, 아래와 같은 구성요소가 있다

🔎 URLRequest 구성 요소

  • url: 요청의 대상 URL
  • : 요청에 사용되는 HTTP 메서드 (예: "GET", "POST", "PUT", "DELETE" 등)
  • allHTTPHeaderFields: 요청의 모든 HTTP 헤더 필드를 포함하는 딕셔너리
  • httpBody: 요청의 HTTP 본문
  • cachePolicy: 요청에 사용되는 캐시 정책
  • timeoutInterval: 요청의 타임아웃 시간 (초)

위에서 만든 URL에 method/header/body를 추가해보자!

위에서 만든 URL 코드에 이어 URLRequset 코드를 작성

// URLRequest 인스턴스 생성
var request = URLRequest(url: url)
request.httpMethod = "POST" // 요청에 사용할 HTTP 메서드 설정

// HTTP 헤더 설정
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")

// HTTP 바디 설정
let body = [
    "title": "My first post",
    "body": "This is the content of my first post",
    "userId": 1
] as [String: Any]

do {
    request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
} catch {
    print("Error creating JSON data")
}

🌈 3. URLSession을 이용하여 데이터 전달

  • Chap3. URLSession을 이용하여 요청과 응답 처리
    위에서 URL 생성과, 필요한 정보를 담았다면 이제 요청을 할 차례!
    Swift에서는 URLSession을 사용하여 요청한다
    URLSession에서 URL에 요청을 한 후 dataTask에서 응답이 오면 코드를 수행한다
    위에서 생성한 URL을 요청한 후 응답을 처리해보자!
import Foundation

// URLComponents를 사용하여 URL 구성
var urlComponents = URLComponents()
urlComponents.scheme = "https"
urlComponents.host = "www.example.com"
urlComponents.path = "/api/v1/users"
urlComponents.queryItems = [
    URLQueryItem(name: "page", value: "1"),
    URLQueryItem(name: "per_page", value: "10")
]

// URL 구성 요소를 사용하여 URL 생성
if let url = urlComponents.url {
    print("URL: \(url)") // 출력: "URL: https://www.example.com/api/v1/users?page=1&per_page=10"
}

// URLRequest 인스턴스 생성
var request = URLRequest(url: url)
request.httpMethod = "POST" // 요청에 사용할 HTTP 메서드 설정

// HTTP 헤더 설정
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")

// HTTP 바디 설정
let body = [
    "title": "My first post",
    "body": "This is the content of my first post",
    "userId": 1
] as [String: Any]

do {
    request.httpBody = try JSONSerialization.data(withJSONObject: body, options: [])
} catch {
    print("Error creating JSON data")
}

// URLSession을 사용하여 요청 수행
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
    } else if let data = data, let response = response as? HTTPURLResponse, response.statusCode == 201 {
        do {
            if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                print("JSON Response: \(json)")
            }
        } catch {
            print("Error parsing JSON response")
        }
    } else {
        print("Unexpected error")
    }
}

task.resume() // 작업 시작

🌈 4. URLSessionTask로 작업을 나타낸다.

🍏 URLSessionTask

  • URLSession 작업 하나를 나타내는 추상 클래스이다.

🍀 URLSessionTask 의 작업 유형

  • URLSessionTask는 4가지 작업유형을 제공한다
    • URLSessionDataTask
      • 서버에서 메모리로 데이터를 받아오는 작업 수행한다
      • 백그라운드에서는 지원되지 않는다
    • URLSessionUploadTask
      • 서버에서 메모리로 데이터를 받아오는 작업 수행한다
      • DataTask 보다 Upload 에 특화되어 있으며, file 형태 업로드할 때 사용한다
      • 백그라운드에서 업로드를 지원한다
    • URLSessionUploadTask
      • file형태의 데이터를 다운받을 때 사용한다
      • 백그라운드에서 업로드를 지원한다
    • URLSessionStreamTask
      • 양방향의 TCP/IP 연결을 통해 메시지를 교환할 때 사용한다
profile
개발이 어려운 나를 위한... 개발노트

0개의 댓글