안녕하세요!
애플 디벨로퍼 아카데미 @POSTECH 4기로 활동중인 Ethan입니다.
요즘 Swift Concurrency를 공부하면서, Day3 주제로 Task와 TaskGroup에 대해 알아보았습니다.
지난 글에서는 async/await와 GCD를 비교하면서 기본적인 비동기 개념을 다뤘는데요, 오늘은 실제로 동시성 작업을 어떻게 실행하고 관리하는지를 알아보려고 합니다.
Task {
let data = await fetchData()
print(data)
}
Task란?
Task는 비동기 작업의 실행 단위입니다.
말 그대로, 우리가 async 함수나 비동기 로직을 실행할 때 Task 블록을 만들어서 그 안에서 실행하게 됩니다.
여기서 Task { }는 새로운 비동기 작업을 실행하는 컨테이너 역할을 합니다.
Task는 실행되는 환경에 따라 priority(우선순위)와 취소 가능성(cancellation)을 고려해서 동작합니다.
즉, Task는 “하나의 독립적인 비동기 실행 흐름” 이라고 이해하면 됩니다.
Task의 특징
- 독립 실행: Task는 독립적으로 실행되며, 기존 코드 흐름과는 분리됩니다.
- 우선순위 지정 가능: .high, .medium, .low 와 같은 priority를 부여할 수 있습니다.
- 취소 가능: Task.isCancelled 상태를 확인하거나 try Task.checkCancellation()을 통해 중간에 안전하게 종료할 수 있습니다.
TaskGroup이란?
그렇다면 여러 개의 비동기 작업을 동시에 실행해야 할 땐 어떻게 할까요?
이때 등장하는 것이 바로 TaskGroup입니다.
TaskGroup은 말 그대로 여러 개의 Task를 묶어서 동시에 실행할 수 있게 도와주는 도구입니다.
예를 들어, 여러 개의 네트워크 요청을 병렬적으로 처리할 때 유용합니다.
await withTaskGroup(of: Int.self) { group in
for i in 1...5 {
group.addTask {
return await heavyWork(id: i)
}
}
for await result in group {
print("결과: \(result)")
}
}
위 예시에서는 heavyWork라는 작업을 동시에 실행하고, 그 결과를 하나씩 받아옵니다.
즉, TaskGroup을 사용하면 작업을 병렬로 실행하고, 그 결과를 순차적으로 모아 처리할 수 있습니다.
구분TaskTaskGroup
| 실행 단위 | 단일 비동기 작업 | 여러 비동기 작업의 묶음 |
| 목적 | 독립적 실행 | 병렬 실행 & 결과 수집 |
| 사용 예시 | 단일 네트워크 요청 | 여러 개의 네트워크 요청 동시 처리 |
| 특징 | 우선순위, 취소 지원 | 동시성 제어, 결과 모음 |
오늘은 Swift Concurrency의 Task와 TaskGroup에 대해 알아보았습니다.
- Task는 하나의 독립적인 비동기 작업 단위
- TaskGroup은 여러 작업을 병렬로 실행하고 결과를 모을 때 사용
결국, Task = 실행 단위 / TaskGroup = 작업의 묶음 으로 이해하면 쉽습니다.
동시성 프로그래밍은 어렵지만, Swift Concurrency의 등장으로 훨씬 직관적이고 안전하게 다룰 수 있다는 점이 정말 매력적이었습니다.
모두 즐거운 코딩 하세요!
참고 자료
'Swift' 카테고리의 다른 글
| Swift Concurrency - Sendable 프로토콜과 컴파일러 검사 (2) | 2025.08.20 |
|---|---|
| Swift Concurrency - 값 타입 vs 참조 타입의 차이와 안정성 (0) | 2025.08.20 |
| Swift - async / await 알아보기 (6) | 2025.08.14 |
| Swift Concurrency / 동시성과 병렬성의 차이 (6) | 2025.08.12 |