Dart에서 반복 코드 자동 생성하기: Code Generation

Dart에서 코드 생성기를 사용하면 반복적인 코드를 자동으로 생성할 수 있어 개발 효율성을 크게 향상시킬 수 있습니다.

주요 개념

  • 코드 생성기 (Code Generator): 반복적인 코드를 자동으로 생성해주는 도구입니다.
  • 주요 기능:
    • 객체 복사: copyWith() 메서드를 통해 객체를 복사하고 특정 속성만 변경할 수 있습니다.
    • JSON 변환: fromJson()toJson() 메서드를 통해 객체와 JSON 간의 변환을 자동화합니다.
    • 값 비교: ==hashCode 메서드를 자동 생성하여 객체의 값을 비교할 수 있습니다.
    • 객체 로깅: toString() 메서드를 통해 객체의 상태를 쉽게 로깅할 수 있습니다.

등장 배경

커스텀 클래스를 만들 때, 매번 반복적으로 구현해야 하는 코드들이 있습니다. 이를 자동으로 생성하면 개발 시간을 절약할 수 있습니다. 다음 패키지들을 이용하면 이러한 반복되는 코드들을 자동으로 생성할 수 있습니다.

패키지 설치

  1. dev_dependency 설치:

    dart pub add -d freezed build_runner json_serializable
    
  2. dependency 설치:

    dart pub add freezed_annotation json_annotation
    

실습 준비

패키지 설치

  1. dev_dependency 설치:

    dart pub add -d freezed build_runner json_serializable
    
  2. dependency 설치:

    dart pub add freezed_annotation json_annotation
    

VSCode 확장 프로그램 설치

  1. Flutter freezed Helpers: freezed 코드를 쉽게 작성하도록 도와주는 확장 프로그램.
  2. Build Runner: 코드 변경 시 자동으로 코드를 생성하도록 도와주는 확장 프로그램.

코드 예제

Step 1: person.dart 파일 생성

bin 폴더 아래에 code_generator 폴더를 만들고, 그 안에 person.dart 파일을 생성합니다.

Step 2: Freezed 자동 완성 사용

person.dart 파일에 frf를 입력한 후, 자동 완성을 통해 다음과 같이 Person 클래스를 작성합니다.

import 'package:freezed_annotation/freezed_annotation.dart';
part 'person.freezed.dart';
part 'person.g.dart';


class Person with _$Person {
  const factory Person({
    required String name,
    required int age,
  }) = _Person;

  factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
}

Step 3: 코드 생성 명령어 실행

dart run build_runner build

이 명령어를 실행하면 person.freezed.dartperson.g.dart 파일이 생성됩니다.

Step 4: 코드 수정 및 자동 생성 설정

person.dart 파일의 생성자에 int age 속성을 추가하고, Watch 버튼을 클릭하여 코드 변경 시 자동으로 생성되도록 설정합니다.

Step 5: 코드 확인

code_generator 폴더 아래에 main.dart 파일을 만들고, 아래와 같은 코드를 작성하여 생성된 함수들을 확인합니다.

import 'dart:convert';
import 'person.dart';

void main() {
  Person a = Person(name: '철수', age: 10);
  Person b = a;

  /// copyWith()
  a = a.copyWith(name: '영희');

  /// toString()
  print("toString() : $a");
  print("toString() : $b");

  /// 값 비교(Value Equality)
  bool valueEquality = Person(name: "철수", age: 1) == Person(name: "철수", age: 1);
  print("값 비교 : $valueEquality");

  /// JSON 직렬화(Serialization)
  Map<String, dynamic> map = a.toJson();
  print("toJson() : $map");
  String jsonString = jsonEncode(map);

  /// JSON 역직렬화(Deserialization)
  Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  Person person = Person.fromJson(jsonMap);
  print("fromJson() : $person");
}

코드 설명

  • 불변 객체: 생성된 객체는 불변 객체로, 속성을 수정할 수 없습니다.
  • copyWith(): 객체의 속성을 변경할 수 있는 메서드입니다.
  • toString(): 객체의 속성을 문자열로 출력하는 메서드입니다.
  • 값 비교: ==hashCode를 통해 객체의 값을 비교합니다.
  • toJson(): 객체를 JSON 포맷으로 직렬화합니다.
  • fromJson(): JSON 포맷의 데이터를 객체로 역직렬화합니다.

관련 자료

profile
flutter 개발자(진)

0개의 댓글