본문 바로가기
🍎 Swift/iOS 학습 노트

[강의노트👩🏻‍💻] URLSession

by 솔비님 2024. 7. 30.

 

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.  예제 코드 작성

아래 사이트는 테스트를 위한 데이터를 내려주는 사이트다

https://reqres.in/api/users/1

 

→ 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
}