Flutter 앱에서 Null Safety 마이그레이션 진행하며
배경
회사 프로젝트의 Flutter 앱을 2.0 베타로 업그레이드하면서 Null Safety를 적용하기로 했다. Dart 2.12부터 정식 지원되는 기능이라 이참에 도입하는 게 맞다고 판단했다.
마이그레이션 과정
1. 사전 준비
먼저 모든 패키지를 최신 버전으로 업데이트했다. pubspec.yaml의 SDK 제약을 확인했다.
environment:
sdk: '>=2.12.0 <3.0.0'
2. 자동 마이그레이션 도구 실행
dart migrate
도구가 코드를 분석하고 마이그레이션 미리보기를 제공했다. 웹 인터페이스로 변경 사항을 확인할 수 있었는데, 생각보다 정확도가 높았다.
3. 수동 수정 필요 케이스
late 키워드 처리
초기화가 지연되는 변수들은 late 키워드로 명시했다.
// Before
StreamSubscription _subscription;
// After
late StreamSubscription _subscription;
nullable 체크
API 응답 파싱 부분에서 null 체크가 많이 필요했다.
final user = response.data['user'] as Map<String, dynamic>?;
if (user != null) {
final name = user['name'] as String?;
// ...
}
4. 외부 패키지 이슈
일부 패키지가 아직 Null Safety를 지원하지 않아 문제였다. 임시로 해당 패키지들은 제외하고 진행했다.
dependency_overrides:
some_package: ^1.0.0 # null-safety 미지원
소감
전체 마이그레이션에 약 2일 정도 소요됐다. 도구의 도움을 많이 받았지만, 비즈니스 로직의 null 처리는 개발자가 직접 판단해야 했다. 특히 기존에 암묵적으로 null을 허용하던 부분들을 명시적으로 처리하면서 잠재적 버그를 몇 개 발견했다.
패키지 생태계가 완전히 전환되려면 시간이 더 필요할 것 같다. 당분간은 mixed-mode로 운영하면서 점진적으로 완전한 Null Safety 환경을 구축할 예정이다.