내일배움캠프 26일차

임클·2025년 4월 7일

내일배움캠프

목록 보기
27/44
post-thumbnail

하루하나 알고리즘

https://github.com/Yimkeul/AlgorithmSolution/tree/6b5922065903012e8fd68be3c840ba4e20e794af/프로그래머스/3/42579. 베스트앨범


TIL: iOS 앱에서 네트워크 통신 구현하기

1. iOS에서 네트워크 통신을 구현하는 방법

iOS 앱에서 서버와 데이터를 주고받기 위해서는 네트워크 통신이 필수입니다. 대표적으로 다음과 같은 방법들이 있습니다.

🍎 1.1. URLSession (Apple 공식 제공)

  • Foundation 프레임워크에서 제공하는 기본 네트워크 API.
  • HTTP/HTTPS 요청을 보내고, 서버로부터 응답을 비동기적으로 받아올 수 있음.
  • URLSessionDataTask, URLSessionDownloadTask, URLSessionUploadTask 등 다양한 작업 지원.
  • 커스터마이징이 가능하며, delegate 방식과 closure 방식 모두 제공.

📦 1.2. 서드파티 라이브러리 (예: Alamofire, Moya)

  • URLSession의 복잡한 설정, 반복적인 코드, 에러 처리 등을 추상화하여 더 쉽게 구현 가능.
  • 코드가 간결해지고 유지보수가 쉬움.
  • Alamofire는 HTTP 통신에 특화, Moya는 네트워크 계층을 추상화한 아키텍처 기반.

2. URLSession 기본 사용 방법

✅ 2.1. 기본적인 GET 요청 예시

import Foundation

guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1") else { return }

let task = URLSession.shared.dataTask(with: url) { data, response, error in
    // 에러 처리
    if let error = error {
        print("❌ 에러 발생: \(error.localizedDescription)")
        return
    }

    // HTTP 응답 상태 코드 확인
    if let httpResponse = response as? HTTPURLResponse {
        print("📡 상태 코드: \(httpResponse.statusCode)")
    }

    // 데이터 처리
    if let data = data {
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: [])
            print("📥 받은 데이터: \(json)")
        } catch {
            print("⚠️ JSON 파싱 오류: \(error.localizedDescription)")
        }
    }
}

task.resume() // 작업 시작

🧩 2.2. POST 요청 예시

var request = URLRequest(url: URL(string: "https://example.com/api")!)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

let parameters = ["title": "foo", "body": "bar"]
request.httpBody = try? JSONSerialization.data(withJSONObject: parameters)

let task = URLSession.shared.dataTask(with: request) { data, response, error in
    // ...
}
task.resume()

3. 네트워크 요청 시 에러 처리 방법

네트워크 요청에서는 다음과 같은 종류의 에러를 고려해야 합니다.

⚠️ 3.1. 에러의 종류

  • URL 오류: 잘못된 URL 형식
  • 네트워크 연결 오류: 인터넷 연결 문제, 서버 다운 등
  • HTTP 응답 오류: 404, 500 등의 상태 코드
  • 데이터 파싱 오류: JSONDecoder나 JSONSerialization에서 파싱 실패

🛡️ 3.2. 에러 처리 전략

if let error = error {
    print("❌ 네트워크 오류: \(error.localizedDescription)")
    return
}

guard let httpResponse = response as? HTTPURLResponse else { return }

guard (200...299).contains(httpResponse.statusCode) else {
    print("🚨 서버 오류: \(httpResponse.statusCode)")
    return
}

guard let data = data else {
    print("📭 데이터 없음")
    return
}

4. 서드파티 라이브러리(예: Alamofire)를 사용하는 이유

🎯 4.1. URLSession의 단점

  • 반복되는 코드가 많음 (header 설정, 에러 처리, 파싱 등)
  • 테스트 코드 작성이 번거로움
  • 응답 데이터 처리 로직이 분산되기 쉬움

🚀 4.2. Alamofire의 장점

  • 간결한 문법으로 요청 가능
  • ResponseHandler, Interceptor 등을 통해 응답 및 에러 일괄 처리
  • 코드 가독성 및 유지보수성 향상
  • 백그라운드 전송, 인증 처리 등 고급 기능 지원
import Alamofire

AF.request("https://jsonplaceholder.typicode.com/posts/1")
  .validate()
  .responseJSON { response in
    switch response.result {
    case .success(let value):
        print("🎉 성공: \(value)")
    case .failure(let error):
        print("❌ 실패: \(error.localizedDescription)")
    }
  }

🧠 오늘의 정리

  • URLSession은 iOS의 기본 네트워크 API이며, 실무에서도 자주 사용됨
  • GET, POST 요청 기본 패턴을 익히고, 에러 처리 로직은 반드시 포함시켜야 함
  • 코드 간결성과 생산성을 위해 Alamofire 같은 서드파티 라이브러리도 적극 고려할 수 있음

0개의 댓글