저는 Flutter에서 Entity나 Model에 해당하는 객체를 만들 때 Freezed와 Code generator를 이용해서 주로 만들어요. Freezed는 Java의 Lombok과 비슷해요.
Freezed는 개발자가 구현해야 하는 반복적인 코드를 코드 생성 방식을 이용해서 작성해야 할 코드를 대신 만들어주는 편리한 패키지예요. 무척 편리해서 데이터 객체를 만들 땐 필수적으로 사용하고있어요.
그런데 freezed를 사용할 때 몇 가지 해야 하는 것들이 있어요. 클래스명 위에 @freezed라고 적어주고 필요한 패키지를 import하고 생성될 파일의 이름을 part 키워드를 통해 적어주어야 해요. 아래와 같은 형태로 주로 만들어요(저는 json_serializable 패키지도 같이 사용하고 있어요).
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:my_awesome_project/src/features/events/domain/time_slot.dart';
part 'event.freezed.dart';
part 'event.g.dart';
@freezed
class Event with _$Event {
const factory Event({
required String title,
required String description,
required DateTime dateTime,
required DateTime duration,
required String? location,
required String creator,
required List<String> invitees,
required List<TimeSlot> availableTimes,
}) = _Event;
factory Event.fromJson(Map<String, dynamic> json) => _$EventFromJson(json);
}
이걸 매번 적어주는 건 참 귀찮은 일이에요. 그래서 VS Code의 스니펫을 이용해 만들어보려고 해요.
명령 팔레트(⇧ + ⌘ + p)를 실행시키고 snippets를 입력해 주시면 여러 가지 옵션이 나와요.
여기선 Configure Snippets를 선택할게요.
그다음 어떤 언어의 snippet을 만들 건지 선택해야 해요. 저는 Dart 언어로 만들 것이기 때문에 dart.json을 선택할게요.
그럼 dart.json이라는 파일이 열릴 텐데요. 처음에는 빈 json과 주석으로만 이루어져 있을 거예요.
이제 Freezed를 위한 snippet을 json에 추가해 주면 돼요. 변경사항을 저장해 주세요.
{
"Freezed Data Class": {
"prefix": "domain",
"body": [
"import 'package:freezed_annotation/freezed_annotation.dart';",
"\n",
"part '${TM_FILENAME_BASE}.g.dart';",
"part '${TM_FILENAME_BASE}.freezed.dart';",
"\n",
"@freezed",
"class ${1:DataClass} with _$${1:DataClass} {",
" const factory ${1:DataClass}({${2}}) = _${1:DataClass};",
"\n",
" factory ${1:DataClass}.fromJson(Map<String, dynamic> json) => _${1:DataClass}.fromJson(json);",
"}",
],
"description": "Freezed Data Class"
},
}
저는 domain이라고 입력했을 때, 이 snippet을 실행할 거예요. Trigger Suggest 단축키(저는 option + esc)를 통해서도 아래처럼 뜨게 할 수 있어요.
제가 만든 snippet을 찾아 enter키를 누르면 아래처럼 적용돼요.
이런 식으로 Riverpod이나 Freezed 같이 일정한 포맷이 필요한 경우, 누군가가 만든 스니펫을 VS Code Extensions을 통해 설치하시거나 직접 만들면 될 것 같아요.
Kindness in words creates confidence. Kindness in thinking creates profoundness. Kindness in giving creates love.
— Laozi