1. URLSession을 사용한 통신 방법
- URL 객체를 생성한다.
- Request 객체를 생성한다.
- URLSession을 이용하여 데이터를 전달한다.
- URLSessionTask로 작업을 나타낸다.
🔎 URLSession
- 앱과 서버 간 데이터를 주고 받는 API를 제공하는 클래스
- HTTP를 포함한 몇 가지 프로토콜을 지원하고 인증, 쿠키 관리, 캐시 관리 등을 지원
2. URLSession의 Request와 Response
- Request
- URL 인스턴스를 통해 직접 통신하는 형태
- URLRequest 인스턴스를 만들어 옵션을 설정하여 통신하는 형태
- Response
- 설정된 Task의 Completion Handler 형태
- URLSessionDelegate를 통해 지정된 메서드를 호출하는 형태
3. URLComponents를 이용한 URL 생성
🔎 URLComponents란
- URL을 구성하는 구조
- 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"
}
🖍️ URLComponents를 사용하는 이유
- scheme, host, path, queryItems로 나뉘어져 있는데 path와 queryItems가 바뀔 때 마다 전체 주소를 변경하면 번거롭다.
- URLComponents를 사용하여 따로 관리하면 변경되는 부분만 수정하면 된다!
4. URLRequest 객체 생성
🔎 구성요소
- url: 요청의 대상 URL
- httpMethod: 요청에 사용되는 HTTP 메서드 (예: "GET", "POST", "PUT", "DELETE" 등)
- allHTTPHeaderFields: 요청의 모든 HTTP 헤더 필드를 포함하는 딕셔너리
- httpBody: 요청의 HTTP 본문
- cachePolicy: 요청에 사용되는 캐시 정책
- timeoutInterval: 요청의 타임아웃 시간 (초)
// 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")
}
5. URLSession을 이용하여 요청과 응답 처리
- URLSession에서 URL에 요청을 한 후 dataTask에서 응답이 오면 코드를 수행한다.
// 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() // 작업 시작
🔎 URLSessionTask
- URLSession 작업 하나를 나타내는 추상 클래스
- 작업 유형
- URLSessionDataTask (HTTP GET)
- 서버에서 메모리로 데이터를 받아오는 작업 수행
- 백그라운드에서는 지원되지 않는다.
- URLSessionUploadTask (HTTP POST/PUT)
- 서버에서 메모리로 데이터를 받아오는 작업 수행
- DataTask 보다 Upload에 특화되어 있으며, file 형태 업로드할 때 사용
- 백그라운드에서 업로드 지원
- URLSessionDownloadTask
- file 형태의 데이터를 다운 받을 때 사용
- 백그라운드에서 업로드 지원
- URLSessionStreamTask
- 양방향의 TCP/IP 연결을 통해 메세지를 교환할 때 사용
- URLSessionDataTask (HTTP GET)
📌 네트워크 통신 과정 흐름
- URL생성 → URL에 요청할 정보 입력 → 해당 URL에 작업 요청 → 작업이 완료된 후 응답 처리
<출처 : 주코의 iOS 개발일기>