이전까지 State, Event, Entity, Dto 등의 모델을 선언할 때 모두 Freezed 패키지를 사용했다. 이유는 이곳에 정리해두었는데 요약하자면 아래와 같다.
1. 동등성 비교 (값을 기반으로 비교)
2. 불변객체 모델링
3. 패턴매칭
4. Json 직렬화/역직렬화 기능
5. copywith 기능
하지만 Freezed를 사용할 때마다 너무 치명적인 단점은 CodeGen이었다. 매번 사소한 변경이더라도 매번 codegen을 해주어 기다려야했고, 깃허브에도 코드젠 파일이 올라가면 나중에 컨플리트 나기도 해서 깃이그노어에도 등록해주는등 은근 귀찮게했다.
이러던 와중 2023년 5월 10일 Dart 3.0이 발표되면서 Sealed Class 가 추가되었다. Sealed 클래스란 네이밍 그대로 클래스들을 봉인(Sealed)한다.
Freezed 얘기하다가 갑자기 Sealed 클래스를 이야기하는 이유는 바로 Sealed 클래스의 강력한 기능, 패턴매칭이다. Freezed 를 쓰는 주된 이유중 하나였던 패턴매칭이 이젠 다트 기본문법 (3.0이상) Sealed 클래스를 통해 손쉽게 구현이 가능해진 것이다.
그리고 또하나의 장점으로 언급했던 부분 Json 직렬화/역직렬화 등등의 다양한 기능. 위와 같이 Freezed는 아주 많은 기능을 간결한 코드로 함축해주는 장점이 있다. 하지만 어느순간부터 이렇게 너무 많은 기능이 단점처럼 느껴졌다.
Presentation Layer에 들어가는 State, Event가 직렬화/역직렬화 기능이 꼭 필요할까? 사용하지도 않는 toString() 메서드가 꼭 들어가야하는걸까? 너무 많은 boilerpolate code 들이 Freezed 모델을 생성할 때마다 추가되고 있다는게 너무 거추장스럽게 느껴졌다.
그리하여 가장 기본적인 기능만 구현해주고 CodeGen이 없는 갓갓 Equtable 패키지로의 이민을 생각하게 되었다.
Equtable 패키지로 전환
Dart에서 일반적인 클래스 객체는 기본적으로 참조(referecne) 기반으로 비교한다. 즉, 두 객체가 같은 값을 갖고 있어도 서로 다른 인스턴스이면 == 비교 시 false를 반환한다. Equatable을 사용하면 간결한 코드로 객체가 포함하는 값(필드) 기반으로 비교할 수 있도록 쉽게 설정할 수 있다.
기본적인 Equtable 모델 선언은 위와 같다. 가장 눈에 띄는건 props인데 네이밍 그대로 Dart의 Equatable에서 props는 객체 비교 시 고려할 속성(properties) 들을 이곳에서 정의한다.
만약 props에 특정 필드를 포함하지 않으면, 그 필드는 비교에서 제외되므로 이부분을 주의해야한다. props에 너무 많은 필드를 포함하면 성능 저하가 발생할 수도 있으므로, 실제로 비교가 필요한 필드만 설정하는 것이 좋다.
'Flutter' 카테고리의 다른 글
이벤트를 특정시간만 기다리고 초과시 에러처리하기 (0) | 2025.02.12 |
---|---|
Theme.of(context) 사용시 주의할 점 (0) | 2025.02.11 |
조건부 처리 - 삼항 연산자, switch, if 문 중 어떤걸 쓸까 (작성중) (0) | 2025.02.06 |
Flutter에서 Stomp로 소켓통신하기 (2) | 2025.02.05 |
어떻게 플러터는 변경된 위젯만 콕찝어서 다시 페인팅할 수 있는걸까? (0) | 2025.02.02 |