본문 바로가기
iOS/Swift

[Swift] Concurrency [1]

by 최지철 2023. 10. 23.
728x90
반응형

Concurrency

  • Swift Concurrency는 비동기 프로그래밍을 지원하기 위한 도구로, 코드를 간결하고 효율적으로 작성할 수 있게 도와준다. 이 기능은 async와 await 키워드를 사용하여 비동기 작업을 선언하고 처리할 수 있습니다.
  • Swift 5.5에서 새로 나온  동시성 모델이며, 그전에는 GCD와 completion handler를 사용해 비동기 프로그래밍을 해야 했다.

 

GCD 와 Concurrency의 차이는 뭘까?

  • GCD는 Swift가 나오기 전인 Objective-C부터 존재하던 개념으로, 동시성 프로그래밍에 대한 높은 수준의 추상화를 제공한다
  • Serial DispatchQueue는 한 번에 하나의 태스크를 순차적으로 실행하고, concurrent DispatchQueue는 많은 작업을 동시에 실행하며, 두 경우 모두 작업이 실행되는 순서는 FIFO이다.
  • GCD를 사용하면 async로 작업을 수행하고 나서 보통 탈출 클로저를 이용한 completion handler를 통해 해당 작업이 끝났을 때의 처리를 해주게된다.

차이

  • 가독성 :  탈출 클로저와 completion handler를 이용한 코드 작성 방식은 가독성을 저하시킬 수 있다.
    • completionHandler 호출하는거 잊을 수도 있고
    • 오류 처리를 어렵고 장황하게 만들고
    • 비동기 호출간의 제어 흐름이 복잡할 때도 문제가 되고
    • 심지어 매개변수 구문 @escaping (String) -> Void은 읽기 어려움!
  • 동기화 처리 
    • GCD에서 동기화를 안전하게 처리하는 방법은 DispatchQueue.sync를 통해 순서대로 접근하는 것을 보장하거나 뮤텍스(mutex)나 세마포어(semaphore)를 이용하는 방법 등이 있다. 
    • 하지만 동기화를 올바르게 처리했는지를 컴파일러가 확인해 주지는 않기 때문에 동기화 관련 버그가 발생할 수 있고, 이러한 버그들은 개발자가 코드를 작성할 때 유의해서 작성하거나 테스팅 및 디버깅을 통해 확인해야한다.
    • Swift Concurrency에서는 이를 컴파일 단계에서 확인해 동기화를 제대로 처리하지 않은 코드가 있다면 컴파일 에러를 발생시킨다. 개발자의 실수를 미연에 방지해 주는 안전장치 역할을 한다.
    •  Swift Concurrency를 사용하면 비 독립적(non-isolated) 구문이 변할 수 있는 프로퍼티에 접근하는 것을 금지한다는 메시지와 함께 컴파일 에러가 발생한다. 이를 통해 개발자의 실수로 데이터 레이스 문제가 발생하는 것을 방지할 수 있다.
  • 작업영역
    • Swift Concurrency는 스레드와 CPU를 직접 다루지 않는다. 대신, 비동기 작업을 실행하고 관리하기 위해 구조적 동시성(Structured Concurrency)과 Actors를 활용
    • GCD는 CPU 코어와 스레드를 활용하여 작업을 처리한다. CPU 코어는 실제 작업을 실행하는 처리 장치이고, 스레드는 작업의 실행을 담당하는 실행 컨텍스트

Swift Concurrency는 CPU와 스레드를 직접 다루지 않고 구조적 동시성과 Actors를 활용하여 비동기 작업을 다룹니다.
GCD는 CPU와 스레드를 사용하여 다중 스레딩과 비동기 작업을 처리합니다.

 

Swift Concurrency와 GCD는 상호 배타적이지 않다.
Swift Concurrency를 사용하면서 GCD도 여전히 필요한 경우도 있을 수 있다.
예를 들어, Swift Concurrency 내에서 GCD를 사용하여 특정 작업을 처리하거나, Swift Concurrency로 작성된 코드를 기존 GCD 기반의 프로젝트에 통합하는 등의 상황이 있을 수 있다.

728x90
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] Generics 제네릭  (0) 2023.12.13
[Swift] Concurrency [2]  (0) 2023.10.25
[Swift] Optional  (1) 2023.10.17
[Swift] Protocol 프로토콜 [2]  (0) 2023.10.16
[Swift] Protocol 프로토콜 [1]  (0) 2023.09.01