freezed와 copyWith 개념 다시 짚기

주혜림·2026년 3월 12일

상태관리 라이브러리 이해하기

Freezed

  • 불변성 모델클래스를 쉽게 만들어준다.
  • 반복적인 코드를 자동으로 생성해주는 도구
  • JSON직렬화와 함께 사용하는 API모델을 만들 때 필수 사용

RiverPod과 copyWith

모델클래스를 구현할 때 RiverPod같은 상태관리 라이브러리를 쓸 때 이 패턴이 필수적인데
final로 선언된 필드는 수정할 수 없어서 불변성을 가지지만
copyWith로 상태를 변경한 값을 받을 수 있게 된다.
상태변경에 대해서도 감지를 할 수 있어야 화면을 새로 그려낸다.

class AppTodo {
  final String id;
  final String title;
  final DateTime scheduleAt; // 날짜+시간

  const AppTodo({
    required this.id,
    required this.title,
    required this.scheduleAt,
  });

  AppTodo copyWith({String? id, String? title, DateTime? schduleAt}) {
    return AppTodo(
      id: id ?? this.id,
      title: title ?? this.title,
      scheduleAt: scheduleAt,
    );
  }
}

copyWith를 구현하는게 번거롭다면?

단점:
직접 작성 시 번거롭고 실수할 확률이 올라가게 된다.
freezed같은 코드생성 라이브러리를 사용하면
copyWith, toString, equals를 자동으로 생성해서 사용해준다.

설정

패키지 추가 후 pubspec.yaml 파일에서 필요한 의존성 추가. 최신버전인지도 확인하기
freezed_annotation: ^3.0.0

Freezed를 적용했을 때

@freezed 어노테이션을 사용해서 모델을 정의


class AppTodo with _$AppTodo {
  const factory AppTodo({
    required String id,
    required String title,
    required DateTime scheduleAt,
  }) = _AppTodo;
}

해당 모델은 앱에 리스트를 추가하기 위한 기본타입이어서 별도 외부 패키지가 필요한 규모는 아님

copyWith를 사용하는 이유

바꾸고 싶은 것만 매개변수로 넘기고 나머지는 null로 두는 것인데
-> 값이 null이 와도 된다 X
-> 변경할 값이 없다면 기존의 값을 쓰겠다 O

수정하고 싶을 때만 값을 넘기기 때문에 기존 값을 유지하면서 안전하게 교체할 수 있고,
null값이 전달되어도 ?? 연산자를 통해 기존 객체의 값을 사용하기 때문에 항상 유효한 값을 가질 수 있게된다.

profile
앱 개발을 공부중입니다.

0개의 댓글