학습
Dart 고급 비동기 패턴
Dart 고급 비동기 패턴 — 고급
고급 비동기 패턴
1. 도입 (왜 배워야 하는가)
Dart 언어는 비동기 프로그래밍을 지원하는 강력한 기능을 제공합니다. 특히 Flutter와 함께 사용될 때, 사용자 인터페이스(UI)가 매끄럽고 반응성이 뛰어나게 만들어줍니다. 비동기 패턴을 이해하지 못하면, UI가 멈추거나 느려지는 문제에 직면할 수 있으며, 이는 사용자 경험을 저하시킵니다. 예를 들어, 네트워크 요청을 비동기적으로 처리하지 않으면, 사용자가 버튼을 눌렀을 때 앱이 잠시 멈추는 현상이 발생할 수 있습니다. 이러한 상황은 사용자가 앱을 떠나는 원인이 될 수 있습니다. 따라서 고급 비동기 패턴을 배우는 것은 매우 중요합니다.
2. 핵심 개념 설명
비동기 프로그래밍
비동기 프로그래밍은 코드가 실행되는 동안 다른 작업을 동시에 수행할 수 있도록 해줍니다. 마치 요리를 할 때, 한 요리가 끓고 있는 동안 다른 재료를 준비하는 것과 같습니다.
Future
Future는 비동기 작업의 결과를 다루기 위한 객체입니다. Future를 사용하면 나중에 완료될 작업의 결과를 받을 수 있습니다.
| 용어 | 정의 |
|---|---|
| Future | 비동기 작업의 결과를 나타내는 객체 |
| async | 비동기 함수를 정의할 때 사용하는 키워드 |
| await | Future의 결과를 기다릴 때 사용하는 키워드 |
Stream
Stream은 비동기적으로 데이터의 연속적인 흐름을 처리할 수 있는 객체입니다. 여러 개의 데이터를 시간에 따라 받는 것과 비슷합니다. 예를 들어, 실시간 뉴스 피드를 생각해볼 수 있습니다.
3. 기본 코드 예제
가장 기본적인 비동기 함수와 Future의 사용법을 살펴보겠습니다.
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 2)); // 2초 대기
return '데이터 로드 완료'; // 완료된 데이터 반환
}
void main() async {
print('데이터 로드 중...');
String data = await fetchData(); // fetchData가 완료될 때까지 대기
print(data); // '데이터 로드 완료' 출력
}
실행 결과
데이터 로드 중...
데이터 로드 완료
코드 한 줄씩 동작 설명
Future<String> fetchData() async {...}: 데이터를 비동기로 가져오는 함수를 정의합니다.await Future.delayed(Duration(seconds: 2));: 2초 동안 대기합니다. 이 동안 다른 작업을 수행할 수 있습니다.return '데이터 로드 완료';: 2초 후에 "데이터 로드 완료"라는 문자열을 반환합니다.void main() async {...}: 메인 함수도 비동기로 정의되어 있습니다.String data = await fetchData();: fetchData가 완료될 때까지 대기하고, 결과를 data에 저장합니다.print(data);: 결과를 출력합니다.- 비동기 프로그래밍은 사용자 경험을 향상시키는 데 필수적입니다.
- Future와 Stream을 이해하고 활용하는 것이 중요합니다.
- await 키워드를 활용하여 비동기 작업의 결과를 쉽게 받을 수 있습니다.
- 실무에서는 비동기 패턴을 잘 활용하여 성능을 최적화할 수 있습니다.
4. 실전 활용 예제
1. 쇼핑몰에서 장바구니 구현
Future<void> addToCart(String item) async {
await Future.delayed(Duration(seconds: 1)); // 1초 대기
print('$item이 장바구니에 추가되었습니다.'); // 아이템 추가 완료 메시지
}
void main() async {
print('장바구니에 아이템 추가 중...');
await addToCart('신발'); // 신발을 장바구니에 추가
print('장바구니 업데이트 완료');
}
2. 실시간 채팅 애플리케이션
Stream<String> messageStream() async* {
List<String> messages = ['안녕하세요!', '어떻게 지내세요?', '비동기 프로그래밍은 흥미롭죠!'];
for (String message in messages) {
await Future.delayed(Duration(seconds: 1)); // 1초 대기
yield message; // 메시지를 스트림으로 전송
}
}
void main() async {
await for (String message in messageStream()) {
print('새 메시지: $message'); // 새로운 메시지 출력
}
}
5. 흔한 실수와 주의사항
실수 1: await을 사용하지 않음
void main() {
fetchData(); // await 누락
print('데이터 로드 중...'); // 이 코드가 먼저 실행됨
}
올바른 코드
void main() async {
await fetchData(); // 올바른 사용
print('데이터 로드 중...');
}
실수 2: Stream의 데이터 수신을 누락
void main() {
messageStream(); // 데이터 수신을 위한 구문 누락
}
올바른 코드
void main() async {
await for (String message in messageStream()) {
print('새 메시지: $message'); // 데이터 수신
}
}
6. 정리
다음에 학습하면 좋은 주제로는 비동기 오류 처리와 Future의 조합에 대해 알아보는 것을 추천합니다.