신입 개발자의 Swift 동시성 이야기: async/await 편
·2022.08.17 09:00
Swift 5.5에서 도입된 async/await의 동작 원리와 기존 방식의 한계를 분석한다.
Swift 5.5 이전에는 GCD와 completion handler를 통해 비동기 프로그래밍을 수행했다. 그러나 이 방식은 코드 중첩으로 인한 가독성 저하, 복잡한 에러 핸들링, retain cycle(참조 사이클) 발생 가능성 등 개발자의 실수로 인한 오류를 컴파일러가 사전에 감지하기 어렵다는 한계가 있었다.
새로운 async/await 문법은 비동기 함수를 간결하게 작성할 수 있게 하며, 컴파일러가 에러 핸들링을 지원하여 안정성을 높인다.
이 모델은 **구조화된 동시성(Structured Concurrency)**을 기반으로 하며, 내부적으로는 코루틴(Coroutine) 매커니즘을 활용한다.
- async: 함수가 비동기적으로 동작함을 명시한다.
- await: 비동기 함수의 결과를 기다리는 **suspension point(일시정지 지점)**를 나타낸다.
작업이 await를 만나 **suspend(일시정지)**되면, 해당 task는 사용 중이던 스레드의 제어권을 시스템에 반환한다. 시스템은 이 스레드를 다른 작업에 할당하여 효율적으로 사용하다가, 작업이 재개될 시점에 제어권을 다시 부여하여 **resume(재개)**시킨다. 이 과정에서 continuation이 일시정지된 지점으로의 복귀를 돕는다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.