TIL) 12/02 추상화 니가 뭔데

100·2025년 12월 3일

TIL

목록 보기
10/11

진행 상황


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에서의 상태 관리와 타이밍 이슈 처리 전략 같은 부분을 좀 더 개념적이고 기술적인 부분 위주로 학습해서 포스팅 해야겠다.

profile
멋있는 사람이 되는 게 꿈입니다

0개의 댓글