| name | flutter-dart-code-review |
| description | 위젯 모범 사례, 상태 관리 패턴(BLoC, Riverpod, Provider, GetX, MobX, Signals), Dart 관용구, 성능, 접근성, 보안 및 클린 아키텍처를 아우르는 라이브러리에 독립적인 Flutter/Dart 코드 리뷰 체크리스트입니다. |
| origin | ECC |
Flutter/Dart 코드 리뷰 모범 사례
Flutter/Dart 애플리케이션 리뷰를 위한 포괄적이고 라이브러리에 독립적인 체크리스트입니다. 이 원칙들은 어떤 상태 관리 솔루션, 라우팅 라이브러리 또는 DI 프레임워크를 사용하는지와 관계없이 적용됩니다.
1. 전반적인 프로젝트 건강 상태
2. Dart 언어의 함정
3. 위젯 모범 사례
위젯 분해 (Decomposition):
Const 사용:
Key 사용:
테마 및 디자인 시스템:
Build 메서드 복잡도:
4. 상태 관리 (라이브러리에 독립적인 원칙)
이 원칙들은 모든 Flutter 상태 관리 솔루션(BLoC, Riverpod, Provider, GetX, MobX, Signals, ValueNotifier 등)에 적용됩니다.
아키텍처:
불변성 및 값 비교 (불변 상태 솔루션: BLoC, Riverpod, Redux용):
반응형 규칙 (가변 반응형 솔루션: MobX, GetX, Signals용):
상태 설계:
// 나쁨 — 불리언 플래그들의 조합은 불가능한 상태를 허용함
class UserState {
bool isLoading = false;
bool hasError = false; // isLoading && hasError 같은 상태가 표현 가능함!
User? user;
}
// 좋음 (불변 방식) — sealed 타입을 통해 불가능한 상태를 원천 차단
sealed class UserState {}
class UserInitial extends UserState {}
class UserLoading extends UserState {}
class UserLoaded extends UserState {
final User user;
const UserLoaded(this.user);
}
class UserError extends UserState {
final String message;
const UserError(this.message);
}
리빌드 최적화:
구독 및 해제 (Disposal):
로컬 상태 vs 전역 상태:
5. 성능
불필요한 리빌드:
build() 내 무거운 작업:
이미지 최적화:
지연 로딩 (Lazy Loading):
기타:
6. 테스트
테스트 종류 및 기대 사항:
커버리지 목표:
테스트 격리:
위젯 테스트 품질:
7. 접근성 (Accessibility)
시맨틱 위젯:
스크린 리더 지원:
시각적 접근성:
상호작용 접근성:
8. 플랫폼별 고려 사항
iOS/Android 차이점:
반응형 디자인:
9. 보안
안전한 저장소:
API 키 관리:
입력 유효성 검사:
네트워크 보안:
10. 패키지/의존성 리뷰
pub.dev 패키지 평가:
버전 제약:
모노레포 관련 (melos/workspace):
11. 내비게이션 및 라우팅
일반 원칙 (모든 솔루션 공통):
12. 에러 핸들링
프레임워크 에러 처리:
에러 보고:
우아한 성능 저하 (Graceful Degradation):
13. 국제화 (l10n)
설정:
콘텐츠:
코드 리뷰:
14. 의존성 주입 (DI)
원칙 (모든 DI 방식 공통):
15. 정적 분석
설정:
강제 사항:
반드시 확인해야 할 주요 규칙:
prefer_const_constructors — 위젯 트리 성능 최적화
avoid_print — 적절한 로깅 사용 유도
unawaited_futures — 비동기 에러 방지
prefer_final_locals — 변수 레벨의 불변성 확보
always_declare_return_types — 명확한 API 계약
avoid_catches_without_on_clauses — 특정 에러 처리 강제
always_use_package_imports — 일관된 임포트 스타일
상태 관리 빠른 참조
아래 표는 인기 있는 상태 관리 솔루션들이 공통 원칙을 어떻게 구현하는지 보여줍니다. 프로젝트에서 사용하는 솔루션에 맞춰 리뷰 규칙을 조정하세요.
| 원칙 | BLoC/Cubit | Riverpod | Provider | GetX | MobX | Signals | 내장 기능 |
|---|
| 상태 컨테이너 | Bloc/Cubit | Notifier/AsyncNotifier | ChangeNotifier | GetxController | Store | signal() | StatefulWidget |
| UI 소비자 | BlocBuilder | ConsumerWidget | Consumer | Obx/GetBuilder | Observer | Watch | setState |
| 셀렉터 | BlocSelector/buildWhen | ref.watch(p.select(...)) | Selector | 해당 없음 | computed | computed() | 해당 없음 |
| 사이드 이펙트 | BlocListener | ref.listen | Consumer 콜백 | ever()/once() | reaction | effect() | 콜백 함수 |
| 해제 (Disposal) | BlocProvider에 의해 자동 처리 | .autoDispose | Provider에 의해 자동 처리 | onClose() | ReactionDisposer | 수동 처리 | dispose() |
| 테스트 | blocTest() | ProviderContainer | ChangeNotifier 직접 테스트 | 테스트 내 Get.put | Store 직접 테스트 | Signal 직접 테스트 | 위젯 테스트 |
참고 자료