기존에 배웠던 클로저 기반 네트워킹에서 async/await 방식으로 리팩토링 아닌 리팩토링을 해보았다
✅ 기존 방식 (클로저 기반)
private func fetchData() {
session.dataTask(with: request) { (data, response, error) in
guard let data, error == nil else { return }
if let response = response as? HTTPURLResponse {
if (200..<300).contains(response.statusCode) {
guard let result = try? JSONDecoder().decode(ResponseData.self, from: data) else { return }
print(result)
} else {
print("요청 실패")
}
}
}.resume()
}
✅ async/await
func fetchData<T: Decodable>(url: URL) async -> Result<T, NetworkError> {
do {
let (data, response) = try await URLSession.shared.data(for: request)
guard let statusCode = (response as? HTTPURLResponse)?.statusCode else {
return .failure(.httpResponseError)
}
guard (200..<300).contains(statusCode) else {
return .failure(.serverError(statusCode: statusCode))
}
let decodedData = try JSONDecoder().decode(T.self, from: data)
return .success(decodedData)
} catch {
return .failure(.urlError(error as? URLError ?? URLError(.unknown)))
}
}
✅ 주요 차이점
async/await | 클로저 | |
코드 가독성 | 동기 코드처럼 위에서 아래로 순차적 실행 | 중첩된 콜백으로 들여쓰기 증가 → 콜백 지옥 가능성 |
에러 처리 | do-catch + Result 타입으로 명확한 에러 핸들링 | guard let, 옵셔널 체크의 연속 |
dataTask를 한번 더 감싼 syntactic sugar였음........
슈가인지 몰랐어,,, 어쩐지,, 내일 다시 벗겨야겠다
'iOS' 카테고리의 다른 글
[트러블슈팅] UICollectionViewCell 그림자가 초기 렌더링 시 안 보이는 문제 (0) | 2025.07.18 |
---|---|
[iOS] Coordinator 패턴으로 화면 전환 로직 분리하기 (0) | 2025.07.10 |
[iOS] 성능 최적화: @inlinable과 lazy (1) | 2025.06.25 |
[iOS] Unit Test 기본 개념과 적용 (0) | 2025.06.23 |
[iOS] MVVM 패턴에서 데이터 로딩 책임 분리 (0) | 2025.06.18 |