seong_hye, the developer

Swift) 동기 vs 비동기에 대해서 알아보기 본문

IOS

Swift) 동기 vs 비동기에 대해서 알아보기

seong_hye 2022. 11. 10.

 

코드를 작성하다보면 동기와 비동기에 대해 알게 되는데

오늘은 이 내용을 한 번 정리해보려 합니다.

 

동기 & 비동기 = 프로그래밍에서 작업의 실행 흐름과 시간 제어 방식에 대한 개념


📘 동기(Synchronous)

한 작업이 끝나야 다음 작업을 실행하는 방식

작업이 완료될 때까지 기다렸다가 다음 명령을 실행하는 순차적 흐름

 

🔹예시 코드

func loadData() -> String {
	//ex. 오래 걸리는 작업
    return "데이터 로딩 완료"
}

let result = loadData()		//📌 작업이 끝날 때까지 여기서 멈춤
print(result)

- loadData() 함수가 완료될 때까지 다음 줄로 넘어가지 않음

- 사용자 경험 (UX) 측면에서 UI가 멈추는 것처럼 보일 수 있음

 

🔹핵심 특징

항목 설명
실행 흐름 순서대로 실행 (선형적)
다음 작업 실행 시점 이전 작업이 완료된 후에만 가능
병렬 처리 기본적으로 없음
UI/UX 영향 오래 걸리는 작업은 UI를 멈추게 함
예시 for 반복문, 숫자 계산, 즉시 반환 함수 등

 

🔹장점과 단점

장점 단점
직관적 (코드의 흐름이 순차적이라 읽기 쉬움) 느림 (오래 걸리는 작업이 전체 흐름을 멈춤)
디버깅 쉬움 (코드 실행 순서가 명확함) 멀티태스킹 X (다른 작업과 동시에 처리하기 어려움)
상태 관리 쉬움 (복잡한 콜백이나 비동기 상태 필요 없음) UI 멈춤 가능성 (메인 스레드에서 실행되면 앱이 멈춘 것처럼 보일 수 있음)

 

🔹사용하는 경우

단순 계산 (오랜 안걸리는 작업을 바로 처리 가능)

내부 로직 테스트 (흐름을 쉽게 파악하고 디버깅 가능)

메인 스레드 아닌 곳에서 블로킹해도 괜찮은 상황 (ex. 백그랑누드 계산 전용 스레드)


📘 비동기 (Asynchronous)

어떤 작업이 진행되는 동안 기다리지 않고, 다른 작업을 동시에(병렬 또는 예약) 처리할 수 있도록 하는 실행 방식

 

🔹예시 코드

// Swift 5.5 + async/await
func fetchData() async -> String {
	// 시간이 걸리는 작업 (EX. 네트워크 요청)
    return "완료된 데이터"
}

Task {
	let result = await fetchData()
    print(result) //기다리긴하지만 메인흐름을 막진 않음
}

// 클로저 기반 비동기 (전통적 방식)
func fetchData(completion: @escaping (String) -> Void) {
	DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
    	completion("완료된 데이터")
    }
}

fetchData { result in
	print("받은 값 : \(result)")
}

 

🔹핵심 특징

항목 설명
실행 흐름 여러 작업이 동시에 (또는 독립적으로) 실행됨
완료 시점 콜백 / await 등을 통해 나중에 결과 전달
사용자 반응성 유지됨 (UI 멈추지 않음)
사용 장소 네트워크 요청, 파일 읽기, 타이머, 애니메이션 등
구현 방식 DispatchQueue.async, async/await, completion handler 등

 

🔹비동기 구현 방식

방식 설명
DispatchQueue.async GCD 기반 비동기 실행
async/await Swift 5.5부터 도입된 비동기 패턴
completion handler 전통적 비동기 방식
Combine RxSwift 유사한 비동기 이벤트 처리

 

🔹장점과 단점

장점 단점
사용자 경험 향상 (UI가 멈추지 않음) 코드 복잡도 증가 (콜백 지옥, 흐름 추적이 어려움)
성능 향상 (여러 작업을 동시에 처리 가능) 에러 처리 복잡 (완료 시점이 나중이라 예외 추적 어려움)
적은 리소스로 대기 없이 처리 상태 관리 어려움 (작업 간 순서와 결과 관리 필요)

 

🔹사용하는 경우

네트워크 요청

디스크 / 파일 읽기

애니메이션 / 타이머

UI 관련 작업 (MainActor에서 처리 필요)

계산량 많은 CPU 작업 (백그라운드로 보내야 앱 멈춤 방지)


 

🔹한 줄 비교

동기 (Sync) - 작업이 끝날 때까지 기다리고 다음 작업을 실행

비동기 (Async) - 작업이 끝나길 기다리지 않고, 바로 다음 작업 실행

 

🔹특징 비교

항목 동기 (Synchronous) 비동기 (Asynchronous)
처리 흐름 직선적 (한 번에 하나) 분기적 (다른 일과 병행)
속도 / 반응성 느릴 수 있음 (UI 멈춤) 빠름, UI 끊김 없음
사용 위치 단순한 계산, IO가 없는 경우 네트워크, 파일, 디스크 등 느린 작업
코드 스타일 이해하기 쉬움 복잡하지만 유연함
예시 readFile() URLSession.dataTask, async/await, DispatchQueue.async

 


 

Comments