iBetter Books
수정

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 핵심 문법을 빠르게 복습합니다.