URLSession - Swift의 네트워킹 핵심 클래스

jeongmuyamette·2025년 1월 2일

TIL

목록 보기
18/72
post-thumbnail

📌 개요

URLSession은 iOS에서 HTTP/HTTPS를 통한 데이터 송수신을 담당하는 핵심 클래스입니다. API 통신, 파일 다운로드, 데이터 업로드 등 네트워크 작업에 사용됩니다.

🔍 주요 특징

  1. Session 종류

    • shared: 기본 세션, 간단한 요청에 사용
    • default: 커스텀 설정 가능한 기본 세션
    • ephemeral: 캐시/쿠키를 저장하지 않는 임시 세션
    • background: 앱이 백그라운드일 때도 작동하는 세션
  2. Task 종류

    • dataTask: 데이터를 받아오는 작업 (JSON, 텍스트 등)
    • downloadTask: 파일 다운로드 작업
    • uploadTask: 파일 업로드 작업
    • webSocketTask: 웹소켓 통신 작업

💻 기본 사용 예시

// 1. 기본적인 GET 요청
let url = URL(string: "https://api.example.com/data")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    guard let data = data else { return }
    // 데이터 처리
}
task.resume()

// 2. POST 요청 예시
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONEncoder().encode(someData)

let task = URLSession.shared.dataTask(with: request) { ... }
task.resume()

⚡️ 주요 컴포넌트

  1. URLSessionConfiguration

    • 세션의 동작 방식 설정
    • 타임아웃, 캐싱 정책, 쿠키 정책 등 구성
  2. URLSessionTask

    • 실제 네트워크 작업을 수행하는 객체
    • 일시정지, 재개, 취소 등의 제어 가능
  3. URLSessionDelegate

    • 세션의 이벤트를 처리하는 델리게이트
    • 인증, 리다이렉션 등의 처리 가능

🎯 사용 시 주의사항

  1. task.resume()를 호출해야 실제 작업이 시작됨
  2. 비동기로 동작하므로 적절한 completion handler 사용 필요
  3. 메인 스레드에서 UI 업데이트 필요 시 DispatchQueue.main.async 사용

📝 활용 예시

class NetworkManager {
    static let shared = NetworkManager()
    private let session = URLSession.shared
    
    func fetchData<T: Decodable>(from url: URL, completion: @escaping (Result<T, Error>) -> Void) {
        let task = session.dataTask(with: url) { (data, response, error) in
            if let error = error {
                completion(.failure(error))
                return
            }
            
            guard let data = data else {
                completion(.failure(NSError(domain: "", code: -1)))
                return
            }
            
            do {
                let decoder = JSONDecoder()
                let result = try decoder.decode(T.self, from: data)
                completion(.success(result))
            } catch {
                completion(.failure(error))
            }
        }
        task.resume()
    }
}

🔑 장점

  • Apple이 제공하는 표준 네트워킹 솔루션
  • 메모리 관리가 효율적
  • 다양한 네트워킹 작업 지원
  • 백그라운드 전송 지원

📚 참고할만한 대체제

  • Alamofire: URLSession을 래핑한 인기있는 네트워킹 라이브러리
  • Moya: 네트워크 추상화 레이어를 제공하는 라이브러리

0개의 댓글