Flutter 개발 베스트 프랙티스 2025
Flutter 생태계는 빠르게 진화하고 있습니다. 2025년 현재, 프로덕션 수준의 앱을 만들기 위해 알아두면 좋은 베스트 프랙티스를 정리했습니다.
1. 프로젝트 구조: Feature-First
프로젝트가 커지면 폴더 구조가 중요해집니다. 기능 단위(Feature-First)로 구조를 나누는 것을 추천합니다.
lib/
features/
auth/
data/
domain/
presentation/
home/
data/
domain/
presentation/
core/
constants/
utils/
widgets/
이렇게 하면 각 기능이 독립적으로 유지되어, 팀 작업 시 충돌이 줄어들고 코드를 찾기 쉬워집니다.
2. 상태 관리: Riverpod 2.0
2025년 Flutter 상태 관리의 대세는 Riverpod입니다. Provider의 한계를 극복하고, 컴파일 타임 안전성과 테스트 용이성을 제공합니다.
@riverpod
class TodoList extends _$TodoList {
@override
Future<List<Todo>> build() async {
return ref.watch(todoRepositoryProvider).fetchTodos();
}
Future<void> addTodo(Todo todo) async {
await ref.read(todoRepositoryProvider).addTodo(todo);
ref.invalidateSelf();
}
}
Riverpod의 코드 제네레이션을 활용하면 보일러플레이트를 크게 줄일 수 있습니다. @riverpod 어노테이션 하나로 Provider가 자동 생성됩니다.
3. 네비게이션: GoRouter
Flutter의 선언적 네비게이션에는 GoRouter가 표준이 되었습니다. 딥링크, 리다이렉트, 중첩 라우팅을 깔끔하게 처리할 수 있습니다.
final router = GoRouter(
routes: [
GoRoute(
path: '/',
builder: (context, state) => const HomeScreen(),
routes: [
GoRoute(
path: 'detail/:id',
builder: (context, state) => DetailScreen(
id: state.pathParameters['id']!,
),
),
],
),
],
);
인증 상태에 따른 리다이렉트도 redirect 콜백으로 간단하게 구현할 수 있습니다.
4. 성능 최적화
const 생성자 활용
변하지 않는 위젯에는 반드시 const를 붙여주세요. 위젯 리빌드를 방지하여 성능이 크게 개선됩니다.
// 나쁜 예
return Container(
padding: EdgeInsets.all(16),
child: Text('Hello'),
);
// 좋은 예
return const Padding(
padding: EdgeInsets.all(16),
child: Text('Hello'),
);
이미지 캐싱
네트워크 이미지를 반복해서 불러오면 성능과 데이터 사용량 모두에 좋지 않습니다. cached_network_image 패키지를 사용하세요.
ListView.builder 사용
긴 리스트를 렌더링할 때는 반드시 ListView.builder를 사용하세요. 화면에 보이는 항목만 렌더링하여 메모리를 절약합니다.
5. 테스트 전략
Flutter의 3계층 테스트를 활용하세요:
- Unit Test: 비즈니스 로직과 데이터 레이어
- Widget Test: 개별 위젯의 동작 검증
- Integration Test: 전체 앱 플로우 확인
testWidgets('카운터가 증가해야 함', (tester) async {
await tester.pumpWidget(const MyApp());
expect(find.text('0'), findsOneWidget);
await tester.tap(find.byIcon(Icons.add));
await tester.pump();
expect(find.text('1'), findsOneWidget);
});
최소한 비즈니스 로직에 대한 Unit Test는 반드시 작성하는 것을 권장합니다.
6. 앱 크기 최적화
사용자가 앱을 다운로드할 때 크기가 작을수록 좋습니다.
- 사용하지 않는 패키지 제거:
dart pub deps --no-dev로 의존성 확인 - 트리 셰이킹:
--split-debug-info와--obfuscate플래그 사용 - 이미지 압축: WebP 포맷으로 에셋 크기 절감
flutter build apk --split-debug-info=debug-info --obfuscate
마무리
Flutter는 하나의 코드베이스로 iOS, Android, 웹, 데스크톱까지 커버할 수 있는 강력한 프레임워크입니다. 위 베스트 프랙티스를 적용하면 유지보수하기 쉽고, 성능 좋은 앱을 만들 수 있습니다.
devYUL Studio는 이러한 프랙티스를 모든 프로젝트에 적용하고 있습니다. Flutter 앱 개발에 대한 질문이 있다면 언제든 문의해주세요.