진행 상황
1. 모델을 freezed 기반으로 통일
핵심 포인트
- Freezed는 불변성(immutability) 확보
copyWith, equality, toString 자동 생성
- JSON 직렬화는
json_serializable로 자동 처리
- enum 직렬화는
JsonConverter로 관리
개선 이유
- 모델 필드 변경 시 JSON 변환 코드를 직접 수정해야 하는 문제 해소
- 타입 안정성 확보
- 전체 모델 구조를 일관적으로 유지하기 용이
Freezed 도입 효과
- 생성자 + 직렬화 코드 자동화
- state 관리 안정성 상승
- 유지보수 비용 감소
2. JSON 직렬화 / 역직렬화 흐름 정리
역직렬화(JSON → 객체)
- Dio가 JSON 문자열 → Map 변환
- Retrofit이 응답 타입을 보고
fromJson 호출
- jsonserializable이 생성한 `$ModelFromJson` 실행
- Freezed 내부의 구현체로 모델 생성
- 최종적으로 Dart 객체로 전달
직렬화(객체 → JSON)
- Dio가 객체에
toJson() 존재 여부 확인
- Freezed + jsonserializable이 생성한 `$ModelToJson` 실행
- Map → JSON 문자열 변환 후 API 요청
핵심 요약
- Retrofit은 타입 기반으로 자동 직렬화
- Freezed는 모델 구조를 일관적으로 유지
- json_serializable은 실제 변환 로직 담당
3. Repository / DataSource 추상화
문제점
- DataSource가 단일 구현체로 고정
- 테스트용 Mock과 실제 API 교체가 어려움
- Repository가 구현체에 직접 결합됨
개선 방향
abstract DataSource 정의
- API 구현체, Mock 구현체를 별도 분리
- Repository는 인터페이스에만 의존
- main.dart에서 의존성 주입으로 구현체 교체
구조 요약
Cubit → Repository(인터페이스) → DataSource(인터페이스) → 구현체(API 또는 Mock)
장점
- 테스트 쉬움
- 교체 유연성 확보
- 의존성 역전(DIP) 적용
- 단일 책임(SRP) 유지
단점
4. 전체 아키텍처 레이어 맵
UI
↓
Cubit (State 관리)
↓
Repository (비즈니스 로직)
↓
DataSource (API, Mock)
↓
Model (Freezed)
핵심 원칙
- 상태는 불변성 기반
- 비즈니스 로직과 데이터 접근 분리
- 인터페이스 기반 의존
- 자동 코드 생성 활용
진행 예정
1. 앱이 종료돼도 데이터가 유지되게
- 디스크 저장 방식이나 클라이언트 DB(Hive/Drift) 사용 고려
- 클라이언트 DB를 적극적으로 활용하는 앱 사례가 많으며,
우리도 앱 고도화 단계에서 변동성이 낮은 데이터(예: 리포트 등)를 로컬에 캐싱해 전달하는 방식으로 활용 가능
웹페이지 리뉴얼은 참여 안 할수도..?
나중에 reactiveX, 추상화, 디자인 패턴, flutter에서의 상태 관리와 타이밍 이슈 처리 전략 같은 부분을 좀 더 개념적이고 기술적인 부분 위주로 학습해서 포스팅 해야겠다.