Thread란
Thread란
Swift에서의 스레드(Thread): GCD와 함께 알아보는 동시성 기초
1. 스레드란?
**스레드(Thread)**는 하나의 프로세스 내부에서 실행되는 작업 단위다. Swift에서는 동시에 여러 작업을 수행하거나, 무거운 연산을 백그라운드로 넘기기 위해 주로 사용된다.
예:
- 네트워크 요청
- 이미지 다운로드
- 파일 읽기/쓰기
- UI 업데이트는 반드시 메인 스레드에서 실행
2. Swift에서 스레드를 직접 다루는 일은 드물다
Swift에서는 스레드를 직접 생성하지 않고, 대신 GCD(Grand Central Dispatch) 또는 OperationQueue를 사용한다. 이들은 내부적으로 스레드를 효율적으로 관리해준다.
3. GCD(Grand Central Dispatch)
GCD는 애플이 만든 스레드 추상화 도구로, 큐(Queue) 단위로 작업을 보낸다.
주요 개념
- DispatchQueue: 작업을 실행하는 대기열
- main queue: 메인 스레드(UI 작업 전용)
- global queue: 백그라운드 처리용
4. 코드 예제로 보는 스레드 처리
1) 메인 큐 vs 글로벌 큐
1
2
3
4
5
6
7
8
9
10
11
12
// UI 업데이트는 메인 큐에서
DispatchQueue.main.async {
self.label.text = "업데이트 완료"
}
// 무거운 작업은 백그라운드에서
DispatchQueue.global().async {
let data = heavyWork()
DispatchQueue.main.async {
self.label.text = data
}
}
2) 동기(sync) vs 비동기(async)
1
2
3
4
5
6
7
8
9
// 동기 실행: 현재 스레드를 블로킹함
DispatchQueue.global().sync {
print("blocking 작업")
}
// 비동기 실행: 바로 다음 줄로 넘어감
DispatchQueue.global().async {
print("백그라운드 작업")
}
5. QoS(Quality of Service): 작업 우선순위
GCD 글로벌 큐는 작업 우선순위를 설정할 수 있다.
1
2
3
4
5
6
7
DispatchQueue.global(qos: .userInitiated).async {
// 빠르게 필요한 작업
}
DispatchQueue.global(qos: .background).async {
// 중요도 낮은 작업
}
QoS | 설명 |
---|---|
.userInteractive | 즉시 반응 필요 (예: 드래그 UI) |
.userInitiated | 사용자의 즉각적인 피드백 필요 |
.utility | 다운로드, 계산 등 |
.background | 중요도 낮음, 오래 걸려도 되는 작업 |
6. 실무 적용 예 (직접 적용한 사례)
✅ Notion-Mind
- 문제: 대용량 노션 데이터 정렬 및 변환 처리 시 UI 프리즈 발생
- 해결:
DispatchQueue.global(qos: .userInitiated)
에서 변환 처리 후,DispatchQueue.main
으로 결과 전달 - 결과: UI 멈춤 없이 빠른 처리 완료
✅ Brawlytics
- 문제: JSON 파싱, 데이터 가공 중 UI 지연
- 해결: 모든 로직을 백그라운드로 처리 후, 결과만 메인 스레드에서 UI에 반영
- 추가: 앱 수명 중 반복되는 작업은 OperationQueue로 관리함
7. 주의점
- UI는 반드시 메인 스레드에서 조작해야 함
- 동기(sync)는 데드락 주의 (특히 main에서 main.sync 호출 금지)
- 백그라운드 처리 후 반드시
DispatchQueue.main.async
로 UI 갱신할 것
8. 결론
Swift에서 멀티스레딩을 다룰 때 직접 Thread를 생성하기보단, **GCD(DispatchQueue)**를 사용하는 것이 표준이다. UI는 메인, 연산은 글로벌. 이것만 제대로 구분해도 앱 성능과 UX가 크게 달라진다.
실제 앱에서의 적용은 “무거운 작업은 백그라운드, 결과는 메인에서 UI 반영” 이것만 기억해도 80%는 커버된다.
This post is licensed under CC BY 4.0 by the author.