SC #6: async/await를 이용한 웹 요청
발행: (2026년 1월 18일 오전 12:05 GMT+9)
2 min read
원문: Dev.to
Source: Dev.to
예제 코드
func performPOSTURLRequest() async throws(NetworkingError) -> PostData {
do {
let request = try buildURLRequest()
let (data, response) = try await URLSession.shared.data(for: request)
guard let statusCode = (response as? HTTPURLResponse)?.statusCode else {
throw NetworkingError.invalidStatusCode(statusCode: -1)
}
guard (200..<300).contains(statusCode) else {
throw NetworkingError.invalidStatusCode(statusCode: statusCode)
}
let decodedResponse = try JSONDecoder().decode(PostResponse.self, from: data)
print("The JSON response contains a name: \(decodedResponse.json.name) and an age: \(decodedResponse.json.age)")
return decodedResponse.json
} catch let error as EncodingError {
throw .encodingFailed(innerError: error)
} catch let error as DecodingError {
throw .decodingFailed(innerError: error)
} catch let error as URLError {
throw .requestFailed(innerError: error)
} catch let error as NetworkingError {
throw error
} catch {
throw .otherError(innerError: error)
}
}
관찰 사항
- 컴파일러는 반환값이 없을 경우 경고를 표시합니다. 이는 클로저 기반 구현에서는 불가능했던 일입니다.
- 코드의 일부가
NetworkingError유형의 오류를 발생시키더라도, 이를 명시적으로 잡아야 합니다; 그렇지 않으면 일반catch에 의해 포착됩니다. URLSession.shared.data(for:)는 요청이 성공하면 옵션이 아닌 값을 반환합니다; 오류가 발생하면 예외를 발생시킵니다.