iOS

[iOS] 클로저에서 async/await로 리팩토링하기

양밀루 2025. 7. 8. 20:54

기존에 배웠던 클로저 기반 네트워킹에서 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였음........

슈가인지 몰랐어,,, 어쩐지,, 내일 다시 벗겨야겠다