본문 바로가기

Flutter

riverpod 과 MVVM 활용 - API에서 사용할 데이터 구조를 정의하기 위해 Post 클래스를 만들어 보자.(모델링 작업)(3)

API에서 받아올 데이터의 구조를 정의하고, 이를 Dart 객체로 변환하는 작업을 수행하자.\

Post 클래스를 정의하고, 이 클래스에서 JSON 데이터를 객체로 변환하는 메서드(fromJson)와 객체를 JSON으로 변환하는 메서드(toJson)를 구현을 해보자.

 

import 'package:equatable/equatable.dart';

/// Post 데이터를 표현하는 모델 클래스입니다.
/// 서버로부터 받은 JSON 데이터를 Dart 객체로 변환하거나,
/// Dart 객체를 JSON으로 변환할 때 사용됩니다.
/// Equatable을 사용하여 값 기반 비교를 지원합니다.
class Post extends Equatable {

  final int? userId;
  final int? id;
  final String title;
  final String body;

  Post({this.userId, this.id, required this.title, required this.body});

  // Json 데이터를 Post 객체로 변환하는 생성자를 생성
  // 이름이 있는 생성자
  Post.fromJson(Map<String, dynamic> json)
      : userId = json['userId'],
        id = json['id'],
        title = json['title'],
        body = json['body'];

  // Post 객체를 JSON 형식으로 변환하는 메서드를 만들자
  Map<String, dynamic> toJson() {
    return {'userId': userId, 'id' : id, 'title' : title, 'body' : body };
  }

  @override
  List<Object?> get props => [userId, id, title, body];
}

 

왜 Equatable 을 사용해서 객체를 주소 값 비교 기반이 아닌 값 기반으로 비교하는 걸까?

  • 실제 애플리케이션 로직에서는 객체가 같은 메모리에 있지 않더라도 내용이 같으면 같은 객체로 간주하는 경우가 많음.
    • (동일한 게시물(Post)의 두 인스턴스가 같은 id, title, body 값을 가지고 있다면, 두 객체는 논리적으로 동일한 게시물을 표현한다.)
  • 상태 관리 라이브러리(Riverpod, Bloc)에서는 동일한 데이터를 가진 객체가 여러 개 생성되더라도, 값이 같으면 동일한 상태로 간주하는 것이 일반적이다. 이를 통해 불필요한 상태 변경을 방지하고, 최적화된 상태 관리를 구현할 수 있다.
  • 또한, 컬렉션(Set, Map)에서 중복 제거를 할 때도 값 기반 비교가 유용하다. 동일한 값의 객체가 여러 개 생성되더라도 한 번만 저장되도록 관리할 수 있다.
  • Equatable을 사용하면 직접 == 연산자와 hashCode를 구현하지 않아도, 필요한 필드만 선언하여 쉽게 값 비교 기능을 활용할 수 있다.
728x90