본문 바로가기
Swift랑 친해지기/Swift문법정리

async/await 로 비동기 처리 하기 (Swift)

by 데브킹덕 2023. 6. 1.

비동기(Asynchronous)란 한 작업이 다른 작업의 완료를 기다리지 않고 독립적으로 실행되는 것을 의미합니다. 동기(Synchronous) 방식에서는 한 작업이 완료될 때까지 다음 작업이 실행되지 않지만, 비동기 방식에서는 한 작업이 시작되면 완료 여부와 관계없이 다음 작업을 실행할 수 있습니다.

비동기 작업은 대개 네트워크 요청, 파일 입출력, 데이터베이스 쿼리 등과 같이 시간이 오래 걸리는 작업에 사용됩니다. 이러한 작업은 완료까지 시간이 오래 걸릴 수 있으므로, 동기적으로 처리하면 전체 프로그램이 작업의 완료를 기다리는 동안 멈추게 됩니다. 하지만 비동기 방식을 사용하면 한 작업이 실행되는 동안 다른 작업을 수행할 수 있어 전체적인 성능과 응답성이 향상됩니다.

비동기 작업을 처리하는 방법은 여러 가지가 있습니다. 일반적으로는 콜백(Callback) 함수, Delegate, completion 클로저,비동기/대기(Async/await) 패턴 등을 사용합니다.

1. 콜백(Callback) 함수: 비동기 작업이 완료되면 호출되는 함수를 지정하여 사용합니다. 이 함수는 주로 작업의 결과를 처리하거나 다음 작업을 수행하는데 사용됩니다. 콜백 함수는 비동기 작업의 인자로 전달되어 작업이 완료되면 호출됩니다.

3. 비동기/대기(Async/await) 패턴: 비동기 작업을 동기적으로 처리하는 것처럼 보이게 하는 문법적인 구조입니다. `async` 키워드를 함수 앞에 붙이고, 비동기 작업을 수행하는 부분에 `await` 키워드를 사용합니다. `await`는 비동기 작업이 완료될 때까지 해당 함수의 실행을 일시 중지하고, 작업이 완료되면 결과를 반환합니다.

func fetchData() async throws -> Data {
    let url = URL(string: "https://api.example.com/data")!
    
    let (data, _) = try await URLSession.shared.data(from: url)
    
    return data
}

func processData() async {
    do {
        let data = try await fetchData()
        
        // 데이터 처리 로직
        // ...
    } catch {
        // 오류 처리
        // ...
    }
}

Task {
    await processData()
}



위의 코드는 `fetchData()` 함수에서 비동기적으로 데이터를 가져오고, `processData()` 함수에서 해당 데이터를 처리하는 예시입니다. 

`fetchData()` 함수는 `async` 키워드를 사용하여 비동기 함수임을 표시하고, `await` 키워드를 사용하여 데이터를 가져오는 동안 해당 함수의 실행을 일시 중지합니다. `URLSession.shared.data(from:completionHandler:)` 메서드는 비동기 작업을 수행하며, 작업이 완료되면 `await` 키워드 다음의 코드가 실행됩니다.

`processData()` 함수도 `async` 키워드를 사용하여 비동기 함수임을 나타냅니다. `await fetchData()`를 호출하여 데이터를 비동기적으로 가져온 후 데이터를 처리하는 로직을 수행합니다.

마지막으로, `Task`를 사용하여 `processData()` 함수를 비동기적으로 실행합니다. `Task`는 비동기 작업의 실행을 관리하는 데 사용되며, `await` 키워드가 있는 함수를 실행할 때 필요합니다.

위의 예시 코드에서는 URL 세션을 사용하여 데이터를 가져오지만, 비동기/대기 패턴은 다른 비동기 작업에도 적용될 수 있습니다.