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:)는 요청이 성공하면 옵션이 아닌 값을 반환합니다; 오류가 발생하면 예외를 발생시킵니다.
Back to Blog

관련 글

더 보기 »

SC #4: async/await 구문

async/await 함수 선언 비동기 함수는 async 키워드로 표시해야 합니다. 함수가 오류를 발생시킬 수 있는 경우, catch 키워드를 추가합니다.

SC #3: Swift 6와의 관계

Swift Concurrency 3 Part Series https://dev.to/david_goyes_a488f58a17a53/series/35092 'Swift Concurrency'는 Swift 6의 기초였지만, Swift 6은 …