dart fix와 코드 품질 도구
코드를 혼자 작성할 때는 스타일이 제각각이어도 큰 문제가 없습니다. 하지만 팀 프로젝트나 오픈소스에서는 일관된 코드 품질이 필수입니다. Dart는 dart fix, dart format, analysis_options.yaml을 통해 코드 품질 관리를 자동화합니다.
dart format
Dart 공식 코드 포매터입니다. 줄바꿈, 들여쓰기, 공백을 자동으로 정리합니다. Prettier(JavaScript)나 gofmt(Go)와 같은 역할입니다.
기본 사용
# 현재 디렉토리 전체 포맷dart format .# 특정 파일dart format lib/my_module.dart# 포맷 결과 확인만 (파일 수정 안 함)dart format --output=show lib/# 포맷이 필요한 파일 목록만 출력dart format --set-exit-if-changed .
기본 줄 길이
기본값은 80자입니다. 수정하려면 --line-length 옵션을 사용합니다.
dart format --line-length 120 .
VS Code에서 설정합니다.
// settings.json{ "dart.lineLength": 120, "editor.formatOnSave": true, "[dart]": { "editor.formatOnSave": true, "editor.defaultFormatter": "Dart-Code.dart-code" }}
포맷 전후 비교
// 포맷 전
void main(){final x=1;final y =2;print(x+y);if(x>0){print('positive');}else{print('negative');}}
// 포맷 후
void main() {
final x = 1;
final y = 2;
print(x + y);
if (x > 0) {
print('positive');
} else {
print('negative');
}
}
dart fix
dart analyze가 문제를 찾아준다면, dart fix는 그 문제를 자동으로 수정합니다. Dart SDK 마이그레이션(예: null safety 이전 코드 변환)에서도 사용됩니다.
기본 사용
# 수정 가능한 항목 미리 보기dart fix --dry-run# 실제 수정 적용dart fix --apply# 특정 파일dart fix --apply lib/old_code.dart
dart fix가 처리하는 항목 예시
// 수정 전 (구식 패턴)
new MyClass() // → MyClass()
new List<int>() // → <int>[]
Future<void> f() async => null // → Future<void> f() async {}
// dart fix --apply 후
MyClass()
<int>[]
Future<void> f() async {}
null safety 마이그레이션
Dart 2.x에서 3.x로 올리는 경우 dart fix가 null 관련 코드를 자동으로 변환합니다.
dart fix --apply --code=unnecessary_null_checksdart fix --apply --code=prefer_null_aware_operators
analysis_options.yaml
프로젝트의 정적 분석 동작을 제어하는 설정 파일입니다. 프로젝트 루트에 위치합니다.
기본 구조
# analysis_options.yamlinclude: package:lints/recommended.yamlanalyzer: exclude: - build/** - "**/*.g.dart" - "**/*.freezed.dart" errors: missing_required_param: error missing_return: errorlinter: rules: - prefer_const_constructors - prefer_final_fields - avoid_print - always_declare_return_types - sort_constructors_first
include 패키지
Dart 공식 lint 패키지를 기반으로 시작하는 것이 좋습니다.
| 패키지 | 내용 |
|---|---|
package:lints/core.yaml |
최소한의 핵심 규칙 |
package:lints/recommended.yaml |
권장 규칙 (일반 프로젝트) |
package:flutter_lints/flutter.yaml |
Flutter 프로젝트용 |
pubspec.yaml에 의존성을 추가합니다.
dev_dependencies: lints: ^4.0.0
lint 규칙 주요 목록
성능 관련
linter: rules: - prefer_const_constructors # const 생성자 선호 - prefer_const_declarations # const 변수 선호 - prefer_final_locals # 재할당 없는 변수는 final로 - avoid_unnecessary_containers # 불필요한 Container 제거 (Flutter)
코드 스타일
linter: rules: - always_declare_return_types # 반환 타입 명시 - sort_constructors_first # 생성자를 맨 앞에 - prefer_single_quotes # 홑따옴표 사용 - curly_braces_in_flow_control_structures # if/for에 중괄호 필수
안전성
linter: rules: - avoid_dynamic_calls # dynamic 타입 메서드 호출 금지 - avoid_returning_null_for_void # void 함수에서 null 반환 금지 - cancel_subscriptions # StreamSubscription 해제 필수
규칙 비활성화
특정 파일이나 줄에서 규칙을 끌 수 있습니다.
// 파일 전체에서 규칙 비활성화
// ignore_for_file: avoid_print
void debugLog(String msg) {
// ignore: avoid_print
print('[DEBUG] $msg');
}
또는 analysis_options.yaml에서 특정 규칙을 false로 설정합니다.
linter: rules: avoid_print: false
CI 통합
GitHub Actions에서 코드 품질 검사를 자동화합니다.
# .github/workflows/dart.ymlname: Dart CIon: [push, pull_request]jobs: analyze: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dart-lang/setup-dart@v1 with: sdk: stable - name: Install dependencies run: dart pub get - name: Verify formatting run: dart format --output=none --set-exit-if-changed . - name: Analyze run: dart analyze --fatal-infos - name: Run tests run: dart test
--fatal-infos 옵션을 주면 info 수준 경고도 빌드 실패로 처리합니다. 엄격하게 관리하고 싶을 때 유용합니다.
실전 설정 예시
실무에서 바로 사용할 수 있는 analysis_options.yaml 템플릿입니다.
include: package:lints/recommended.yamlanalyzer: language: strict-casts: true strict-inference: true strict-raw-types: true exclude: - build/** - "**/*.g.dart" - "**/*.freezed.dart" - "**/*.config.dart" errors: missing_required_param: error missing_return: error todo: ignorelinter: rules: # 스타일 - prefer_single_quotes - always_declare_return_types - sort_constructors_first - prefer_const_constructors - prefer_final_fields - prefer_final_locals # 안전성 - avoid_dynamic_calls - cancel_subscriptions - close_sinks # 품질 - avoid_print - avoid_empty_catch - no_duplicate_case_values
dart format + dart fix + dart analyze 워크플로우
세 도구를 함께 사용하는 표준 워크플로우입니다.
# 1. 코드 자동 수정dart fix --apply# 2. 코드 포맷 정리dart format .# 3. 남은 문제 확인dart analyze
VS Code에서는 저장 시 자동 포맷이 실행되고, Problems 패널에서 analyze 결과를 항상 확인할 수 있으므로 개발 중에는 3번만 주기적으로 실행하면 됩니다.
정리
이번 챕터에서 다룬 내용입니다.
dart format은 코드 스타일을 자동으로 통일합니다. 저장 시 자동 실행 설정을 권장합니다.dart fix --apply는 구식 패턴과 마이그레이션 대상 코드를 자동으로 수정합니다.analysis_options.yaml로 프로젝트에 맞는 lint 규칙을 세밀하게 제어합니다.- CI 파이프라인에 포맷 검증과 analyze를 포함시키면 코드 품질이 자동으로 유지됩니다.
PART 01이 끝났습니다. 다음 PART에서는 Dart 핵심 문법을 빠르게 복습합니다.