TIL: Swift 네트워크 통신의 기본 - Generic fetchData 메서드 이해하기

jeongmuyamette·2025년 1월 9일

TIL

목록 보기
23/72
post-thumbnail

📝 학습 내용

오늘은 Swift에서 서버와 통신하기 위한 기본적인 네트워크 메서드에 대해 학습했습니다.

1. 메서드 기본 구조

private func fetchData<T: Decodable>(url: URL, completion: @escaping (T?) -> Void)
  • Generic 타입 T를 사용하여 다양한 모델 타입에 대응 가능
  • Decodable 프로토콜을 채택한 타입만 사용 가능
  • 비동기 처리를 위한 completion 클로저 사용 (@escaping)

2. URLSession 설정

let session = URLSession(configuration: .default)
  • 기본 설정으로 URLSession 인스턴스 생성
  • 네트워크 요청을 위한 기본 세션 구성

3. 데이터 요청 및 에러 처리

session.dataTask(with: URLRequest(url: url)) { data, response, error in
    guard let data = data, error == nil else {
        print("데이터 로드 실패")
        completion(nil)
        return
    }
    // ...
}
  • dataTask를 통해 실제 네트워크 요청 수행
  • guard let을 사용한 안전한 옵셔널 바인딩
  • 에러 발생 시 early return 패턴 사용

4. HTTP 상태 코드 확인

let successRange = 200..<300
if let response = response as? HTTPURLResponse, 
   successRange.contains(response.statusCode) {
    // ...
}
  • 200~299 범위의 상태 코드를 성공으로 간주
  • as?를 통한 타입 캐스팅으로 HTTP 응답 확인

5. JSON 디코딩

guard let decodedData = try? JSONDecoder().decode(T.self, from: data) else {
    print("JSON 디코딩 실패")
    completion(nil)
    return
}
completion(decodedData)
  • JSONDecoder를 사용하여 받은 데이터를 모델 객체로 변환
  • 디코딩 실패 시 nil 반환
  • 성공 시 디코딩된 데이터를 completion handler를 통해 전달

💡 주요 포인트

  1. Generic을 활용하여 재사용 가능한 네트워크 메서드 구현
  2. 에러 처리와 옵셔널 바인딩을 통한 안전한 코드 작성
  3. HTTP 상태 코드 확인을 통한 응답 유효성 검증
  4. JSON 디코딩을 통한 서버 데이터 모델 변환

🔍 실제 사용 예시

// 사용 예시
struct User: Decodable {
    let id: Int
    let name: String
}

let url = URL(string: "https://api.example.com/user/1")!
fetchData(url: url) { (user: User?) in
    if let user = user {
        print("사용자 정보: \(user.name)")
    }
}

0개의 댓글