Freezed 사용과 오류

2025. 3. 24. 17:32

독서록 앱에서 책 정보를 일일이 입력하기 보다 검색을 통해서 책정보를 가져오면 좋을 거 같아서 찾아보니 여러곳에서 책 api를 제공하고있었습니다. 책 제목, 저자, 출판사 등의 간단한 정보만 필요하기 때문에 그 중에서 가장 친숙한 naver api를 이용하기로 결정했습니다.

api 통신을 할 때는 역직렬화라는 여러 단계를 거처야 json 형식으로 오는 데이터의 요소를 필요에 따라서 이용할 수 있습니다. 이를 간편하게 해주는 라이브러리 Freezed 가 있어서 사용해보기로 했습니다.

https://totally-developer.tistory.com/139

 

[060] 플러터 (Flutter) 배우기 - freezed 사용하기 1

안녕하세요~ totally 개발자입니다. 먼저 이 포스팅 보시기에 앞서 지난 059 포스팅의 immutable 객체에 대한 사전 이해가 필요하기 때문에 먼저 보고 이 포스팅을 보기를 권장합니다. https://totally-devel

totally-developer.tistory.com

https://velog.io/@tygerhwang/Flutter-Freezed

 

[Flutter] Freezed

freezed | Dart Packagefreezed_annotation | Dart package이번에는 가장 좋아하는 라이브러리인 바로 Freezed에 대해서 살펴보도록 하겠다.Freezed는 Dart Package에서 작성 날짜 기준으로 Likes 2520 / P

velog.io

 

여러 블로그에서 친절하게 설명이 되어있어서 따라 해보았습니다.

1. 라이브러리 설치

  freezed: ^3.0.4
  freezed_annotation: ^3.0.0
  json_serializable: ^6.9.4
  json_annotation: ^4.9.0
  build_runner: ^2.4.15

총 다섯개를 설치 했는데 dependencies, dev_dependencies에 설치하는게 설명마다 달라서 저는 bulid_runner만 dev_dependencies에 설치했습니다.

 

2. dto 생성

import 'package:freezed_annotation/freezed_annotation.dart';

part 'naver_dto.freezed.dart';
part 'naver_dto.g.dart';

@freezed
class NaverDto with _$NaverDto {
  factory NaverDto({
    required String title,
    required String link,
    required String author,
    required String discount,
    required String publisher,
    required String pubdate,
    required String isbn,
    required String description,
  }) = _NaverDto;
  
  factory NaverDto.fromJson(Map<String, dynamic> json) => _$NaverDtoFromJson(json);

}

 

3. flutter pub run build_runner build 실행

터미널에 명령을 입력하면 part로 만든 이름의 파일이 dto와 같은 라이브러리 안에 생성됩니다.

 

오류

블로그들을 따라서 그대로 진행을 했고, 두개의 파일에 생성이 제대로 생성이 되었지만 문제가 있었습니다.

class NaverDto with _$NaverDto {

여기에서 NaverDto에 빨간줄이 생겨서 사라지지 않았습니다.

Missing concrete implementations of '_$NaverDto.toJson', 'getter _$NaverDto.author', 'getter _$NaverDto.description', 'getter _$NaverDto.discount', and 5 more.
Try implementing the missing methods, or make the class abstract.

위의 말이 뜨면서 문제가 있던것입니다.

1. 오타 찾기

처음해보는 방식이니까 오타가 있는지 찾아보았습니다. 오타가 있었을때는 파일 생성이 되지 않고 다른 곳에서 오류가 생겼었는데 저 한곳에서만 오류가 있을때는 오타가 없었습니다.

2. 검색 해보기

flutter freezed getter에 대해서 검색 해봤습니다.

getter를 커스텀할 수 있다는 글이 있었습니다. 그런데 저는 커스텀 getter를 생성할 필요가 없고, 무조건 적으로 생성하라고 뜬다는 점에서 문제가 달랐습니다.

분명 블로그 글과 같이 진행해보았고, Ai 알려준 freezed 사용 방식과도 일치 했습니다. 한참을 검색 해보았지만 같은 문제를 찾을 수 없었습니다.

3. Try implementing the missing methods, or make the class abstract.

처음에는 첫번째 줄에서 해결해야한다고 생각했습니다. 왜냐하면 어디에서도 abstract를 사용해서 알려주는 곳이 없었습니다.

https://pub.dev/packages/freezed/example

 

freezed example | Dart package

Code generation for immutable classes that has a simple syntax/API without compromising on the features.

pub.dev

그런데 공식 예제에서 답을 찾았습니다. 공식 예제에서 abstract를 붙여서 추상 클래스로 사용하고 있었습니다. 그래서 추상클래스로 바꾸고 사용해본 결과 문제를 해결 할 수 있었습니다.

 

4. 이유는?

이유가 무엇일까 궁금했습니다. 다른 블로그 글에서는 추상 클래스로 바꿔서 알려주지 않았기 때문에 왜 나는 사용해야할까라는 의문이 생겼습니다. 

freezed가 올해에도 활발하게 업데이트 되는 것을 보았습니다. 업데이트 되면서 바뀌는 게 있는데 혹시 그래서 그럴까? 라는 의문이 생겼습니다. 그래서 Freezed 의 changelog를 살펴 보았습니다. 

abstract 단어 검색으로 찾아보니 "3.0.0 - 2025-02-25" 에서 "Breaking: Freezed classes should now either be abstract, sealed, or manually implements _$MyClass." 즉 Freezed 클래스는 추상클래스여야한다는 문구가 있는 것을 발견할 수 있었습니다. 

한달도 되지 않는 변경 사항이다보니까 블로그 글들은 작년, 제작년의 글이라서 당연하게 반영이 안되고 있던 것이였습니다.

 

5. 결론

3.0.0 - 2025-02-25 부터 Freezed는 추상클래스여야한다.

changelog도 잘 살펴야한다는 것이 머리로는 알고 있었지만 이번에 잘 알게 되었습니다. 정말 한달도 안되게 바뀐 사항이라서 검색도 되지 않는 문제였지만 changlog만 살펴봤다면 쉽게 해결할 수 있는 문제였습니다. 

Freezed를 이용해보니 FromJson, ToJson과 같은 함수를 직접 만들지 않아서 좋았고 편하게 바로 사용할 수 있어서 매우 좋은 거 같습니다. 이번에는 json 데이터의 양이 많지는 않지만 더 복잡하고 많은 데이터를 다루를 과정에서 직접 함수를 모두 만드는 과정은 매우 힘든데 이를 생략할 수 있게 되니 편리했습니다.

'Flutter > 독서록 앱' 카테고리의 다른 글

책 검색에 무한스크롤 사용하기  (1) 2025.03.26

BELATED ARTICLES

more