1. URLSession 이란?
URLSessin은 Swift 에서 서버와 통신하기 위해 제공되는 클래스다
2. URLSession 개념
URLSession 을 다루기 위해서는 아래 2가지 개념을 알아야 한다
2-1. URLSessionConfiguration
URLSession으로 커스텀 설정을 한 네트워크 통신을 한다
*Configuration이란 환경설정을 의미한다
예) 네트워크 통신의 타임아웃 시간 설정, 네트워크 통신 캐시 정책 설정 등 세팅
URLSession 객체 생성 시 URLSessionConfiguration을 넣어주어야 한다
다음과 같이 Default configuration을 활용해 생성 가능
let defaultUrlSession = URLSession(configuration .default)
2-2. URLSessionTask
네트워크 통신할 때 어떤 테스크를 수행할 것인지 결정
- URLSessionDataTask: GET 요청. 서버로부터 데이터를 가져오거나 서버에 데이터를 전송할 때 사용
- URLSessionDownloadTask 파일 다운로드를 처리할 때 사용. 백그라운드 다운로드 지원
- URLSessionUploadTask: 파일 업로드를 처리할 때 사용. 백그라운드 업로드 지원
3. 예제 코드 작성
아래 사이트는 테스트를 위한 데이터를 내려주는 사이트다
→ data와 support 로 나뉘고 각각 Key와 Value가 들어있는 것을 확인할 수 있음
전체를 모두 표현하는 구조체를 생성한다
데이터를 가져오기 위해 Codable을 채택한다
struct ResponseData: Codable {
}
내부 데이터를 각각의 구조체로 정의해준다
Struct UserData: Codable {
}
Struct SupportData: Codable {
}
struct ResponseData: Codable {
let data: UserData
let suppor: SupportData
}
UserData 내부에 있는 데이터를 구조체에 담아준다
firstName과 lastName은 가져오는 데이터 내부에 스네이크 케이스를 사용하기 때문에 카멜케이스로 치환시켜준다
*스네이크 케이스: 단어와 단어 사이를 언더바로 표현
*카멜케이스: 단어 시작 지점 대문자로 표현
Struct UserData: Codable {
let id: Int
let email: Stirng
let firstName: String
let lastName: String
let avatar: URL
enum CodingKeys: String, CodingKey {
case id
case email
case fisrtName = "first_name"
case lastName = "last_name"
}
Struct SupportData: Codable {
let url: URL
let text: String
}
struct ResponseData: Codable {
let data: UserData
let suppor: SupportData
}
서버에서 불러오는 메서드 fetchData 를 선언한다
Private func fetchData() {
let dafaultUrlSession = URLSession(configuration: .default)
guard let url: URL = URL(string: "https://reqres.in/api/users/1") else {
print("URL 오류")
return
}
}
Struct UserData: Codable {
let id: Int
let email: Stirng
let firstName: String
let lastName: String
let avatar: URL
enum CodingKeys: String, CodingKey {
case id
case email
case fisrtName = "first_name"
case lastName = "last_name"
}
Struct SupportData: Codable {
let url: URL
let text: String
}
struct ResponseData: Codable {
let data: UserData
let suppor: SupportData
}
자원을 조회하기 위한 httpMethod 를 Get 해준다
addValue 로 json 타입으로 데이터를 주고 받을 것을 명시해 준다
Private func fetchData() {
let dafaultUrlSession = URLSession(configuration: .default)
guard let url: URL = URL(string: "https://reqres.in/api/users/1") else {
print("URL 오류")
return
}
var request: URLRequset = URLRequset(url: url)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let session: URLSession = URLSession(configuration: .default)
}
Struct UserData: Codable {
let id: Int
let email: Stirng
let firstName: String
let lastName: String
let avatar: URL
enum CodingKeys: String, CodingKey {
case id
case email
case fisrtName = "first_name"
case lastName = "last_name"
}
Struct SupportData: Codable {
let url: URL
let text: String
}
struct ResponseData: Codable {
let data: UserData
let suppor: SupportData
}
아 진짜 무슨소링니지 하나도 모르겠다
쓰라니까 쓰는데 이걸 왜 쓰는지도 모르겠다
정리하는데 의미가 하나도 없네
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
fetchData()
}
// 서버 데이터를 불러오는 메서드 선언
private func fetchData() {
let defaultUrlSession = URLSession(configuration: .default)
guard let url: URL = URL(string: "https://reqres.in/api/users/1") else {
print("URL is not correct")
return
}
// URLRequest 설정
var request: URLRequest = URLRequest(url: url)
// GET 메소드 사용
request.httpMethod = "GET"
// json 데이터 형식임을 나타냄
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
// URLSession 생성 (기본 default 세션)
let session: URLSession = URLSession(configuration: .default)
// dataTask
session.dataTask(with: request) { (data, response, error) in
// http 통신 response 에는 status code 가 함께오는데, 200번대가 성공을 의미.
let successRange: Range = (200..<300)
// 통신 성공
guard let data, error == nil else { return }
if let response: HTTPURLResponse = response as? HTTPURLResponse{
print("status code: \(response.statusCode)")
// 요청 성공 (StatusCode가 200번대)
if successRange.contains(response.statusCode){
// decode
guard let userInfo: ResponseData = try? JSONDecoder().decode(ResponseData.self, from: data) else { return }
print(userInfo)
} else { // 요청 실패 (Status code가 200대 아님)
print("요청 실패")
}
}
}.resume()
}
}
// 데이터 구조체 정의
struct UserData: Codable {
let id: Int
let email: String
let firstName: String
let lastName: String
let avatar: URL
// JSON 키와 구조체 프로퍼티 간의 매핑을 위해 CodingKeys 열거형 정의
enum CodingKeys: String, CodingKey {
case id
case email
case firstName = "first_name"
case lastName = "last_name"
case avatar
}
}
// Support 구조체 정의
struct SupportData: Codable {
let url: URL
let text: String
}
// 최상위 구조체 정의
struct ResponseData: Codable {
let data: UserData
let support: SupportData
}
'🍎 Swift > iOS 학습 노트' 카테고리의 다른 글
[강의노트👩🏻💻] 프로세스와 스레드 / 동기 비동기 / Dispatch Queue (0) | 2024.08.01 |
---|---|
[강의노트👩🏻💻] Xcode Instruments로 메모리릭 잡아내기 (0) | 2024.07.30 |
[강의노트👩🏻💻] URL의 구조 (0) | 2024.07.30 |
[강의노트👩🏻💻] API(Application Programming Interface) (0) | 2024.07.30 |
[강의노트👩🏻💻] JSON(JavaScript Object Notation)와 Codable (0) | 2024.07.30 |