URLSession

JG Ahn·2024년 12월 5일

iOS

목록 보기
13/32
post-thumbnail

URLSession은 swift에서 서버와 통신하기 제공되는 클래스이다.

URLSession을 사용하기 위해서는 2가지 개념을 알아야한다.

  • URLSessionConfiguration
  • URLSessionTask

URLSessionConfiguration

  • Configuration은 환경설정을 의미한다.

  • URLSession객체를 사용해서 데이터를 업로드 및 다운로드 하기 위해서는 가장 먼저 URLSessionConfiguration객체를 설정해야 한다고 한다.

  • URLSessionConfiguration을 통해 네트워크 타임아웃 시간 설정, 통신 캐시 정책 설정 등을 세팅할 수 있다.

설정이 완료되고 세션 객체가 생성되면 이후 변경사항은 반영되지 않는다고 하니 초기화 전에 적절히 구성하는 것이 중요하겠다.

URLSessionTask

URLSessionTask는 네트워크 통신을 할 때 어떤 작업을 할지 결정하는 역할을 한다.
URLSession 메소드로 생성되며, 작업의 종류에 따라 다르게 동작한다.

task 종류

  • URLSessionDataTask : 서버로부터 데이터를 가져오거나 전송할때 사용.
  • URLSessionUploadTask : 파일 업로드 처리. 백그라운드 다운로드 지원
  • URLSessionDownloadTask : 파일 다운로드 처리. 백그라운드 다운로드 지원
  • URLSessionStreamTask : TCP/IP 연결을 설정해 스트리밍 처리

작업은 생성 후 resume() 호출로 시작한다.
세션이 작업을 관리하므로, 별도의 참조를 유지하지 않아도 된다고 한다.

URLSession으로 서버 데이터를 받아오는 코드 실습

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 메소드이다. 주로 요청 방식에 따라 구별해서 사용한다.

GET

  • 리소스의 정보를 요청할때 사용한다. (DB로 따지면 SELECT)
  • 데이터를 body가 아닌 쿼리 스트링에 담는다 (쿼리 스트링은 URL에서 ?뒤에 오는 문자열을 뜻한다. )
    • URL 예시) www.example-url.com/resources?name1=harry & name2=sonny
  • GET 요청은 브라우저에 히스토리가 남는다. 정적인 데이터(이미지, css)의 경우 캐시에 저장된다.
  • 길이 제한이 있다.

POST

  • 리소스를 생성/변경할 때 사용된다. (DB로 따지면 UPDATA, CREATE)
  • 데이터를 HTTP의 body에 담아 전송하기 때문에 길이 제한이 없다.
  • 브라우저에 히스토리가 남지 않는다.

0개의 댓글