Model
애플리케이션에서 사용되는 데이터를 표현하는 클래스 또는 객체를 의미한다
특징
- 데이터 모델은 데이터의 구조와 속성을 정의하며, 데이터의 유효성을 검증하고 데이터를 조작하는 데 사용된다
- 일반적으로 별도의 기능을 가지지 않는 순수한 클래스로 작성한다. toJson, fromJson, copyWith, toString, ==, hashCode 등 기본적인 메소드만 정의한다.
모델링 방법
- DDD(Domain Driven Design)
- 소프트웨어 개발 방법론 중 하나로, 비즈니스 도메인을 중심으로 소프트웨어를 설계하고 구현하는 방식이다
- 도메인은 소프트웨어가 해결하고자 하는 실제 비즈니스 영역이다. 예를 들어, 은행 어플리케이션의 도메인은 고객, 계좌, 거래등이 될 수 있다
- ORM (Object-Relational Mapping)
- 데이터 소스가 DB인 경우 DB와 모델 간 상호 변환을 도와주는 기법이다
불변 객체
모델 클래스의 속성을 직접적으로 수정할 수 없게 한다
- 값 변경을 위해서는 copyWith 메서드를 제공해준다
- ==, hashCode 메서드를 재정의한다
class User {
final int id;
final String name;
const User(this.id, this.name);
}
const로 정의한 불변 객체
void main() {
final user1 = const User(1, '홍길동');
final user2 = const User(1, '홍길동');
print(identical(user1, user2));
final user3 = User(1, '홍길동');
final user4 = User(1, '홍길동');
print(identical(user3, user4));
const user5 = User(1, '홍길동');
final user6 = const User(1, '홍길동');
print(identical(heo, heo1));
}
Repository 패턴
데이터 저장소와 애플리케이션 사이의 중간 계층 역할을 수행한다
특징
- 데이터 접근에 대한 추상화 계층이다
- 데이터 소스를 은닉한다
- 데이터를 매핑하고, 변환시키는 역할을 담당한다
장점
- 관심사를 분리시키고, 코드 재사용이 가능하여 유지보수성이 향상된다
- 단위 테스트 작성에 용이하다
- 새로운 데이터 소스를 추가하는데 용이하여 확장성이 좋다
각각의 역할
- Data Source: JSON String 을 Map<String, dynamic> 이나 List 으로의 변경과 CRUD 작업에 집중한다
- Repository: 비즈니스 로직에만 집중한다. 데이터 소스에서 가져온 데이터를 사용하여 Model로 변환하고 가공하여 앱의 필수적인 기능을 제공한다
- Model: 외부 데이터가 아닌 앱 내에서 사용되는 순수한 데이터 모델이다