강의를 보며 공부하던 중 domain layer 에 엔티티를 정의할 때 Equatable 클래스를 상속받고 있어서 알아보고자 한다.
코드는 다음과 같다.
import 'package:equatable/equatable.dart';
class User extends Equatable {
final int id;
final String createdAt;
final String name;
final String avatar;
const User({
required this.id,
required this.createdAt,
required this.name,
required this.avatar,
});
List<Object?> get props => [id];
}
equatable 패키지는 다음 사이트에서 설치방법을 보며 따라하면 설치할 수 있다.
https://pub.dev/packages/equatable/install
Equatable 는 객체 비교를 더 쉽게 해주는 도구라고 생각하면된다.
Equatable 을 사용하지 않은 기본 클래스에서 아래처럼 객체를 생성하고 비교하면 false 가 나온다! 그 이유는 Dart 의 기본 = =연산이 두 객체의 참조가 같은지를 비교하기 때문에 주소가 다르면 같이 같더라도 false 로 나온다.
void main() {
final user1 = User(id: 1, createdAt: '2021-07-01', avatar: '', name: 'Yongju');
final user2 = User(id: 1, createdAt: '2021-07-01', avatar: '', name: 'Yongju');
print(user1 == user2); // false!
}
그러나 Equatable 을 사용한 클래스에서는 props에 들어간 값들끼리 비교해서 같으면 ==도 true가 나올 수 있게 된다!
공부하다보니 이런 클래스를 굳이 왜 사용하는지 궁금해졌다.
앱의 도메인 레이어에서 정의한 Entity 클래스는 앱의 핵심 비즈니스 로직을 담당하는 중요한 요소이다. 비즈니스 로직의 핵심 데이터 모델은 값 자체가 중요하지 객체가 어느 메모리에 있는가는 중요하지 않다.
유저 객체를 비교할 때 "같은 유저인가?"라는 질문에 대한 답은 이름과 id가 같냐지, 같은 인스턴스냐가 아니기 때문이다. 그래서 값이 같으면 같은 Entity로 취급하기 위해 Equatable을 사용한다.
그리고 Equatable 을 사용하면 테스트할 때도 유리하다. 예를 들어 기대하는 유저 객체가 있고, 결과로 받는 유저 객체가 있을때 아래 테스트 코드로 비교를 하게 된다. 그런데 만약 Equatable 이 없다면 값이 같더라도 테스트 실패가 뜬다. 그래서 Entity 을 테스트 가능한 구조로 만들기 위해서도 Equatable 이 도움이 된다.
expect(resultUser, expectedUser);