안녕하세요! 22일간의 다트 언어 집중 학습을 마친 개발자입니다. 자바에서 다트로 전환하면서 겪은 모든 과정을 솔직하게 공유해드릴게요. 특히 비동기 프로그래밍에서 정말 많은 삽질을 했는데, 이 경험이 다른 분들에게 도움이 되길 바랍니다.
📊 22일간의 학습 성과
⏱️ 학습 기간: 22일
🎯 난이도: ⭐⭐⭐⭐⭐ (비동기 때문에...)
📈 플러터 준비도: 95% 완료
🎯 학습 목표와 결과
- ✅ 다트 기초 문법 완전 습득
- ✅ 비동기 프로그래밍 마스터 (Future, Stream, async/await)
- ✅ 플러터 연결 지식 확보
- ✅ 실무 수준 프로젝트 완성 (도서관 관리 시스템)
🔥 가장 큰 깨달음: "프로그래밍은 이해보다 친밀도"
학습하면서 가장 큰 사고방식의 변화가 있었습니다.
Before: 구현하면서 동시에 리팩토링 진행
After: 일단 동작하게 구현하고, 그 다음에 리팩토링
이유는 간단했습니다. 돌아가야 디버깅을 하며 개선할 수 있기 때문이죠. 동작하지 않는 코드를 아무리 예쁘게 만들어도 의미가 없더라고요.
🚨 절대 잊으면 안 되는 핵심 4가지
1. Future vs Stream - 생명줄!
Future<T> // 단일 값, .then() 사용
Stream<T> // 여러 값, .listen() 사용
// ❌ 절대 혼용 금지: Stream에 .then() 사용하면 컴파일 에러!
구분 기준: 단일 값이냐, 여러 값이냐의 차이입니다.
2. StreamController 메모리 누수 - 치명적!
// 🚨 치명적: 반드시 close() 호출!
finally {
controller.close(); // 안 하면 앱 죽음
}
이거 하나 놓치면 메모리 누수로 앱이 크래시됩니다. 정말 무서운 함정이에요.
3. 비동기 에러 처리 (Stream 지속)
} catch (e) {
yield* Stream.error(e); // 에러 전달
continue; // 🔥 작업 계속!
}
에러가 발생해도 스트림이 계속 동작할 수 있게 하는 핵심 패턴입니다.
4. 메서드 체이닝 순서
stream
.where() // 1. 변환
.distinct() // 2. 변환
.listen(); // 3. 소비 (마지막!)
💻 프로젝트 구조와 핵심 구현
📁 6단계 학습 프로젝트
다트 기초 예제/
├── Project1: 기본 변수와 자료구조
├── Project2: 함수 기초와 타입 정의
├── Project3: 클래스 설계와 생성
├── Project4: 컬렉션과 함수형 패턴
├── Project5: 핵심! 비동기 파트
└── Final Project: 종합 예제 도서관 관리 프로그램
🔨 핵심 구현 예제
실시간 채팅 욕설 필터링 시스템과 sealed 클래스를 활용한 결과 처리 패턴을 구현했습니다. 특히 비동기 처리에서 에러가 발생해도 시스템이 중단되지 않도록 하는 것이 핵심이었어요.
⚠️ 위험한 함정들 - 실제 경험담
실수결과해결책
StreamController 미종료 | 메모리 누수 → 앱 크래시 | finally { controller.close(); } |
Future.then() vs Stream.listen() 혼동 | 컴파일 에러 | 타입에 맞는 메서드 사용 |
yield vs yield* 혼동 | 예상과 다른 동작 | *는 전체 스트림 연결용 |
💭 가장 힘들었던 삽질들
- 네임드 파라미터 미사용: 다트에서는 거의 기본적으로 네임드 파라미터를 사용한다고 보면 됩니다.
- 퓨처와 스트림 메서드 구분: then과 listen을 계속 헷갈렸는데, 타입을 확실히 구분하는 게 중요해요.
- 스트림 에러 발생 시 처리: 에러가 발생해도 프로그램이 종료되지 않도록 Stream.error와 continue를 활용하는 패턴을 익혔습니다.
🚀 플러터 연결점 - 즉시 활용 가능!
다트 학습이 끝나니 플러터에서 바로 활용할 수 있는 것들이 보이더라고요:
- FutureBuilder → API 호출 결과 표시
- StreamBuilder → 실시간 데이터 UI 업데이트
- async/await → 사용자 액션 처리
📈 성능과 코드 품질 평가
- 가독성: ⭐⭐⭐⭐☆
- 재사용성: ⭐⭐⭐⭐☆
- 유지보수성: ⭐⭐⭐⭐☆
- 문제해결능력: ⭐⭐⭐⭐⭐
- 학습효과: ⭐⭐⭐⭐⭐
🎯 다음 학습 계획
단기 계획 (1주일)
- HTTP 통신 마스터
- 다트 프로젝트 기록 정리 완료
중기 계획 (1개월)
- ✅ Dart 기초 (완료)
- 🎯 Flutter 위젯 (다음 목표)
- 📱 상태 관리 (Provider/Bloc)
💪 미래의 나에게, 그리고 여러분에게
"이때 당시에도 어렵고 힘든 과정을 잘 해냈어. 할 수 있어! 남들도 다 하는데 너라고 왜 못해? 더 잘할 수 있지!"
22일간 정말 많은 삽질을 했지만, 그 덕분에 비동기 프로그래밍의 핵심을 완전히 이해할 수 있었습니다.
특히 비동기 프로그래밍은 다트와 플러터의 핵심이기 때문에, 이 부분을 확실히 잡고 넘어가는 것이 정말 중요해요. 사용자에게 보이지 않는 곳에서 많은 작업을 처리하기 때문입니다.
💬 소통해요!
이 포스팅이 다트 학습을 고민하고 계신 분들에게 도움이 되었나요?
궁금한 점이나 공감하는 부분이 있다면 댓글로 남겨주세요! 특히 비동기 프로그래밍에서 어려움을 겪고 계신다면 언제든 질문해주세요. 같은 고민을 했던 개발자로서 최대한 도움을 드리고 싶습니다.
다음에는 플러터 실전 프로젝트 진행 과정도 공유할 예정이니, 관심 있으시면 구독과 좋아요 부탁드려요! 🙏
'📚 학습 기록 > Dart & Flutter 기초' 카테고리의 다른 글
[Flutter] Row, Column, Padding 위젯 완벽 마스터 가이드 - 실무 코드 예제 포함 (2) | 2025.06.10 |
---|---|
[Flutter] StatelessWidget 핵심 원리와 실무 적용 가이드 - 위젯 컴포넌트 설계 패턴 (1) | 2025.06.05 |
Dart 실전 프로젝트: 비동기 프로그래밍과 최신 문법 활용 가이드 (2) | 2025.05.28 |
Dart 비동기 프로그래밍 심화: Stream, Future, Timer 완전정복 (1) | 2025.05.22 |
Dart Stream 완벽 가이드: 기초부터 실전까지 (0) | 2025.05.21 |