티스토리 뷰
iOS환경에서 비동기 작업을 관리하는 두 가지 핵심 기술이 있는데요. GCD(Grand Central Dispatch)와 Swift Concurrency의 작업단위인 Task입니다.
이들은 내부적으로 QoS(Quality of Service)라는 통일된 시스템을 사용하여 작업의 우선순위를 관리하는데요. 오늘은 이 QoS에 대해서 알아보겠습니다.
1. Task와 GCD의 우선순위 연관 관계
GCD와 Task 모두 QoS(Quality of Service)를 통해 시스템에 작업의 중요도를 알립니다. GCD의 DispatchQueue와 Swift Concurrency의 Task를 사용할때 시스템은 설정된 QoS 정보를 기반으로 스레드 풀에서 작업을 스케줄링하고, 필요한 CPU 및 리소스 할당을 결정합니다.
비동기 작업의 특징에 따라서 바로 동작해야하거나, 중요도가 후순위인 경우가 있을텐데, 이러한 작업 성격에 맞게 작업을 실행하고자 할때 사용할 수 있습니다.
| 기술 | 우선순위 설정 방식 | 내부 처리 원리 |
|---|---|---|
| GCD (DispatchQueue) | qos 매개변수에 DispatchQoS.QoSClass (예: .userInitiated, .background)를 큐에 직접 지정합니다. |
해당 QoS로 태그된 스레드에서 작업이 실행됩니다. |
| Task (Swift Concurrency) | Task 초기화 시 priority 매개변수로 TaskPriority (예: .userInitiated, .background)를 지정해서 사용합니다. |
지정된 QoS를 기반으로 GCD의 스레드에서 작업을 실행합니다. |
💡 연관 관계:
Task의priority는 내부적으로 GCD의 QoS Class에 매핑되어 동일한 스케줄링 시스템을 사용합니다. 즉, 새로운Task시스템도 기존의 GCD 인프라를 활용하여 우선순위를 처리합니다.
Task, GCD DispatchQueue QoS 사용 예시
Task(priority: .medium) { // .default도 사용 가능하나, deprecated case로 .medium 으로 대체
// do something
}
DispatchQueue.global(qos: .default).async {
// do something
}
2. QoS (Quality of Service) Class 특징 및 사용 예시
QoS 클래스는 총 6가지가 있으며, 각각의 특징과 적절한 사용 예시는 다음과 같습니다.
- QoS관련 Task 특이사항
- .userInteractive 옵션 deprecated
- .default 옵션 -> .medium 으로 rename
- .unspecified 옵션 deprecated -> 옵션 미지정 혹은 QoS 를 nil로 지정하는것을 권장합니다.
- Task { ... } 처럼 옵션 미지정 시 기본으로 지정되는 옵션입니다. unstructured concurrency 방식으로 Task 중첩 등이 있을때 작업 취소 전파가 되지 않으니 사용에 유의해야합니다.
| QoS Class | 특징 및 중요도 | CPU 스케줄링 | 사용 예시 |
|---|---|---|---|
.userInteractive |
최고 중요도 작업에 사용합니다. 사용자가 즉각적인 반응을 기대하는 작업에 사용할 수 있는 QoS입니다. | 높은 우선순위. 메인 스레드에 자주 사용됨. | 애니메이션, 이벤트 처리, UI 새로고침, 사용자 입력에 대한 즉각적인 피드백. |
.userInitiated |
높은 중요도. 사용자가 결과를 즉시 기대하며, 결과를 기다리는 동안 UI가 차단될 수 있는 작업. | 높은 우선순위. 사용자 인터페이스와 직접적으로 관련됨. | "저장" 버튼 클릭 후 데이터 저장, 문서 로딩, 사용자가 시작한 데이터 가져오기. |
.default |
중간 중요도. QoS가 명시적으로 지정되지 않은 대부분의 작업에 사용되는 기본값. (시스템이 적절히 조절) | .userInitiated와 .utility 사이의 우선순위를 가집니다. |
우선순위를 명확히 설정하지 않을 때 사용. 대부분의 일반 비동기 작업. |
.utility |
중간/낮은 중요도. 시간이 걸릴 수 있지만 즉각적인 응답이 필요 없는 작업. 진행 표시줄 등을 제공함. | 낮은 우선순위. 에너지 효율을 위해 설계됨. | 긴 네트워크 요청, 데이터 다운로드, 이미지 필터링, 사용자에게 보이지 않는 백업. |
.background |
최저 중요도. 사용자에게 보이지 않으며 시간 제약이 거의 없는 작업. 리소스 경합을 피하기 위해 최저 우선순위로 실행됨. | 가장 낮은 우선순위. 주로 I/O 및 유지보수 작업에 사용. | 데이터베이스 정리, 로그 업로드, 사전 로드(Prefetching), 인덱싱. |
.unspecified |
시스템이 가장 적절한 QoS를 추론하도록 맡기는 경우. (주로 레거시 코드 호환성) | 시스템 추론에 따름. | 명확한 QoS가 필요 없거나 시스템에 맡길 때. |
3. Task 및 GCD 사용 예시 코드
3-1. Task에서 QoS 사용 (iOS 13+ / Swift Concurrency)
Task를 생성할 때 priority 파라미터를 지정해서 사용합니다. priority 미지정 시, default로 .unspecified 옵션이 지정됩니다.

// 🚀 사용자에게 즉시 결과를 보여줘야 하는 중요한 작업
Task(priority: .userInitiated) {
print("User Initiated Task: 데이터 로딩 시작")
// 데이터를 서버에서 즉시 가져오는 비동기 함수 호출
await loadImportantData()
print("User Initiated Task: 데이터 로딩 완료")
}
// 🔋 백그라운드에서 실행되어도 무방하며, 배터리 효율이 중요한 작업
Task(priority: .background) {
print("Background Task: 로깅 및 정리 작업 시작")
// 로그 파일 정리, 캐시 삭제 등 시간이 오래 걸려도 되는 작업
await cleanUpLogs()
print("Background Task: 로깅 및 정리 작업 완료")
}
3-2. GCD에서 QoS 사용 (Legacy 방식)
GCD 방식의 경우 DispatchQueue.global에 qos 파라미터를 사용하여 우선순위를 지정합니다.
// 중간 우선순위 작업 (예: 오래 걸리는 이미지 처리)
DispatchQueue.global(qos: .utility).async {
print("Utility Queue: 이미지 프로세싱 시작")
// ... 이미지 필터링 코드 ...
// UI 업데이트는 thread-safe 하지 않으므로 반드시 .userInteractive (main) 큐에서 수행해야합니다.
DispatchQueue.main.async {
print("Utility Queue: UI 업데이트 완료")
// self.imageView.image = processedImage
}
}
// 메인 스레드와 동일한 최고 우선순위 (시스템이 즉각 반응하도록 보장)
DispatchQueue.global(qos: .userInteractive).async {
print("User Interactive Queue: 탭 이벤트 처리 시작")
// 작은 계산을 빠르게 처리
}
요약
- Task와 GCD를 사용할때 작업의 중요도에 맞는 적절한 QoS를 설정하는 것이 가장 중요합니다.
.userInteractive,.userInitiated는 꼭 필요한 곳(UI 관련)에만 사용하고, 장시간 소요되는 작업은.utility나.background를 사용하여 작업 중요도를 지정하고 시스템 리소스를 효율적으로 관리할 수 있습니다.
'iOS 개발 > iOS 개발 팁' 카테고리의 다른 글
| Swift Structured Concurrency, 비동기 작업 간 취소 전파 제어방법 (0) | 2025.10.31 |
|---|---|
| iOS 개발, Cocoa Touch 개념 및 UIKit, Foundation과의 관계 (0) | 2025.10.10 |
| iOS AppDelegate, 앱 초기설정 및 생애주기 관리 방법 (0) | 2025.10.06 |
| iOS26 개발, 시뮬레이터 테스트 위한 Xcode26 설치 방법 (0) | 2025.09.26 |
| App Store Connect 애플 개발자 계정 비밀번호 변경하는 방법 (0) | 2025.09.06 |
- Total
- Today
- Yesterday
- Collection
- SwiftUI
- CoreML
- createML
- 스위프트
- 컬렉션
- swift
- swift 문자열
- 프로그래머스
- swift알고리즘
- 백준swift
- swift 기초
- uikit
- 프로토콜
- 김프매매
- 자연어처리
- 알고리즘
- 개발자문서
- 부스트코스
- swift문제
- Protocol
- swift언어
- 프로그래머스swift
- 알고리즘문제
- 백준알고리즘
- ios
- Swift 알고리즘
- swift string
- swift reduce
- swift concurrency
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |