-
[Swift] Actor 이해하기Swift 2025. 2. 11. 18:35반응형
Actor란 Data race 문제를 방지하기 위해 도입된 Reference Type 입니다.
내부 상태를 보호해서 data race를 방지하고,
내부적으로 직렬 실행을 보장해서 동시에 여러 작업이 실행되지 않도록 합니다.
class와 마찬가지로 참조 타입이지만 상속은 지원하지 않습니다.Actor가 유용한 대표적인 예시를 하나 살펴보겠습니다.
바로 은행 시스템입니다. 은행 계좌에서 안정성이 왜 중요한지는 굳이 설명하지 않아도 되겠죠 ?actor BankAccount { let accountNumber: Int var balance: Double init(accountNumber: Int, initialDeposit: Double) { self.accountNumber = accountNumber self.balance = initialDeposit } func deposit(amount: Double) { balance += amount } func withdraw(amount: Double) throws { if amount > balance { throw BankError.insufficientFunds } balance -= amount } } enum BankError: Error { case insufficientFunds }
1. 내부 상태 보호를 위해 비동기로 접근
엑터는 내부 상태를 보호한다고 하였는데요. Actor에 접근하거나 메서드를 호출할 때는 비동기(async)로 처리해야 합니다.
예를 들어, 한 계좌에서 다른 계좌로 이체할 땐 다음과 같이 사용해야 합니다.extension BankAccount { func transfer(amount: Double, to other: BankAccount) async throws { if amount > balance { throw BankError.insufficientFunds } balance -= amount await other.deposit(amount: amount) } }
2. 내부적으로 직렬화
그리고 Actor는 내부적으로 직렬화를 보장합니다. 즉, 여러 개의 Task에서 동시에 데이터를 수정할 경우, actor가 직렬로 처리되어 data race를 방지합니다.
이러한 이유 때문에 안전하게 쓸 수 있지만 이게 항상 좋은 건 아닙니다.
단일 사용자나 직렬 실행이 중요한 경우, 특정 Shared 상태 관리 처럼 Data race를 반드시 피해야 하는 상황에선 좋지만,
파일 기반 저장소를 사용하는 Database 같은 처리에선 오히려 성능 저하를 일으킬 수 있습니다.예를 들어, Core Data의 경우 NSPersistentContainer와 NSManagedObjectContext 같은 걸 사용해 동기화를 관리하기 때문에 actor를 사용할 경우 불필요한 오버헤드를 일으킬 수 있겠죠.
그리고 직렬로 처리할 때 다수의 쿼리를 실행할 경우 성능 저하를 일으킬 수도 있습니다.
특히 읽기의 경우 병렬적으로 실행되도록 하면 효율적인 경우가 많은데,
actor는 모든 접근을 직렬화 하므로 비효율적일 수 있습니다.# Ref
https://docs.swift.org/swift-book/documentation/the-swift-programming-language/concurrency/#Actors
Documentation
docs.swift.org
https://developer.apple.com/documentation/swift/actor
Actor | Apple Developer Documentation
Common protocol to which all actors conform.
developer.apple.com
반응형'Swift' 카테고리의 다른 글
[Swift] TaskPriority, Task 우선순위 동작 이해하기 (0) 2025.03.21 [Swift] Sendable 이해하기 (0) 2025.02.11 [RxSwift] RxRelay 그리고 Combine (0) 2024.06.25 Identifiable 프로토콜 기본개념 (0) 2023.07.31 Swift Package 란 (0) 2023.01.17