URLSession은 swift에서 서버와 통신하기 제공되는 클래스이다.
URLSession을 사용하기 위해서는 2가지 개념을 알아야한다.
URLSessionConfiguration
Configuration은 환경설정을 의미한다.
URLSession객체를 사용해서 데이터를 업로드 및 다운로드 하기 위해서는 가장 먼저 URLSessionConfiguration객체를 설정해야 한다고 한다.
URLSessionConfiguration을 통해 네트워크 타임아웃 시간 설정, 통신 캐시 정책 설정 등을 세팅할 수 있다.
설정이 완료되고 세션 객체가 생성되면 이후 변경사항은 반영되지 않는다고 하니 초기화 전에 적절히 구성하는 것이 중요하겠다.
URLSessionTask
URLSessionTask는 네트워크 통신을 할 때 어떤 작업을 할지 결정하는 역할을 한다.
URLSession 메소드로 생성되며, 작업의 종류에 따라 다르게 동작한다.
URLSessionDataTask : 서버로부터 데이터를 가져오거나 전송할때 사용. 작업은 생성 후 resume() 호출로 시작한다.
세션이 작업을 관리하므로, 별도의 참조를 유지하지 않아도 된다고 한다.
ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
fetchData()
}
// 서버에서 data를 불러오는 메소드
private func fetchData() {
//연결할 URL 선언
guard let url: URL = URL(string: "https://reqres.in/api/users/1") else {
print("잘못 된 URL입니다.")
return
}
// URLRequest 설정
var request: URLRequest = URLRequest(url: url)
request.httpMethod = "GET" //GET 방식으로 요청
// JSON 데이터 형식임을 나타냄
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let session = URLSession(configuration: .default)
// URL의 응답으로 data, response, error를 받는 클로저
session.dataTask(with: request) { (data, response, error) in
// http 통신 response 안에 포함된 statusCode의 범위(Range) : 200번대가 성공을 의미
let successRange: Range = (200..<300)
// data, error가 없을
guard let data, error == nil else { return }
if let response = response as? HTTPURLResponse {
print("status code \(response.statusCode)")
// response로 받은 statusCode가 성공범위(200번대)인지 체크
if successRange.contains(response.statusCode) {
guard let userInfo: ResponseData = try? JSONDecoder().decode(ResponseData.self, from: data) else { return }
print("userInfo : \(userInfo)")
} else {
print("요청 실패")
}
}
}.resume()//dataTask를 실행
}
}
// JSON형식의 데이터를 받기위해 구조체 정의
struct UserData: Codable {
let id: Int
let email: String
let firstName: String
let lastName: String
let avatar: URL
//서버에서 받아오는 '스네이크 케이스'형태의 데이터를 '카멜 케이스'로 치환
enum CodingKeys: String, CodingKey {
case id
case email
case firstName = "first_name"
case lastName = "last_name"
case avatar
}
}
struct SupportData: Codable {
let url : URL
let text: String
}
struct ResponseData: Codable {
let data: UserData
let support: SupportData
}
↓ URL에서 JSON형식의 데이터를 받기 위해 정의한 구조체

GET과 POST
GET과 POST는 모두 서버에 요청을 하기 위해 사용하는 HTTP 메소드이다. 주로 요청 방식에 따라 구별해서 사용한다.
정보를 요청할때 사용한다. (DB로 따지면 SELECT)쿼리 스트링에 담는다 (쿼리 스트링은 URL에서 ?뒤에 오는 문자열을 뜻한다. )name1=harry & name2=sonny생성/변경할 때 사용된다. (DB로 따지면 UPDATA, CREATE)