3기 김태영
2시간 전•

11월 2일 일지

11월 2일

오늘 공부에 투자한 순수한 시간: 5시간 30분

학습한 개념 : 서비스 검색, DB조회 및 이를 통해 얻은 데이터를 입력 값으로 받아 대시보드 Card 계산하는 데이터 흐름 및 과정을 도식화 한다.

Excalidraw 링크: https://link.excalidraw.com/l/8a7dEJwCg68/1sHSVfHphNl

<핵심 개념 1: 서비스 검색 도식화>

핵심 키워드: searchCatalogService() 는 query를 통해서 사용자가 TextField에 입력한 문자와 CatalogService 데이터 모델을 입력으로 받아서 이 이 두 입력값을 비교해서 사용자가 입력한 문자에 맞는 구독 서비스를 찾는다.

1. 사용자가 TextField에 찾고 싶은 구독 서비스의 이름을 입력해서 이 문자를 입력값으로 내보낸다.

2. CatalogService 데이터 모델 또한 입력 값으로 전달하기 위해 CatalogRepositoryProvider가 Repository 객체를 생성해서 CatalogRepository를 만든다.

3. Repository가 만들어졌고, CatalogServiceProivder가 CatalogRepository.getAll()을 호출한다.

4. 호출을 받고, Repository가 SQLite에 있는 서비스 행을 조회 및 검색해서 이 데이터를 CatalogService 데이터 모델로 변환한다.

5. 변환한 CatalogServices 모델을 CatalogServiceProvider에 전달한다.

6. CatalogServiceProvider가 전달 받은 데이터 모델을 searchCatalogService()에 입력값으로 전달한다.

7. searchCatalogService()가 두 개의 입력값을 받아서 사용자가 입력한 문자가 포함된 구독 서비스를 찾아서 Result에 담는다.

8. Result에 담긴 구독 서비스 데이터를 ListTiel로 화면에 반영한다.

<핵심 개념2: DB조회 및 이를 통해 얻은 데이터를 입력 값으로 받아 대시보드 Card 계산>

1. 먼저 subscriptionsRepositoryProvider가 Repository 객체 즉, subscriptionsRepository생성을 요청한다.

2. 생성된 repository는 사용자의 이벤트 요청을 받아서 이를 실제 subscriptions 행을 수정하거나, 변경하거나, 삭제 하도록 하는 변경을 요청 받는다.

3. Repository가 요청받은 것에 응답하여 subscriptions 행 즉, SQLITE DB의 테이블의 행을 변경한다.

4. Repository는 메서드인 WatchAll()을 호출한다. WatchAll() 메서드는 Repository로 인해 변경된 subscriptions 행의 변화를 감지하여 drift의query.watch() 메서드를 실행하여 이 메서드는 최신 전체 구독행을 select를 통해 조회해서 이 결과인 subscriptions행을 다시 WatchAll()에 반환하고, WatchAll()은 이 반환받은 subscriptions 행을 subscription 데이터 모델로 변환한다.

5. watchAll()이 subscriptions 행의 변화를 감지하고 drift의 query.watch()을 실행한다.

6. query.watch()가 사용자의 이벤트를 통해 Repository의 변경 요청으로 인해 바뀐 subscriptions 행을 조회하고, 조히해서 얻은 변경된 subscriptions 행을 스트림 타입으로 변환하여 watchAll()에 반환하다.

7. 변경된 subscriptions 행 데이터를 subscription 데이터 모델로 변환하여 Provider에 전달한다.

8. subscription 데이터 모델을 전달받고, watchAll()이 반환하는 스트림을 구독해서 watchAll()이 데이터의 변화를 감지하고, 이 데이터를 최신 데이터 모델로 변환 했을때, 스트림을 통해서 계속해서 바뀐 subscription 데이터 모델을 전달받을 수 있도록 한다.

9. Homecontent가 ref.watch()를 통해서 계속해서 새로 갱신된 Provider의 값을 전달 받을 수 있다.

10. Provider에서 받은 subscription 데이터 모델과 HomeScreen이 Date.now()를 통해 게산한 오늘날짜 데이터 받고, 이를 DashboardProvider에게 데이터를 전달해준다.

11. Provider를 통해 입력 데이터를 받아서 결제일 및 이번 달/주 금액을 계산한다 .

12. 입력 데이터를 받아calculateDashboard를 통해 계산된 결과를 실제 화면인 DashboardCard에 전달하여 화면에 반영한다.


ㄴ꼬리질문1 사용자가 TextField에 검색어를 입력했을때, Provider는 어떻게 이를 알고, CatalogService 모델을 전달하는건지 설명해줘

ㄴ꼬리질문2 입력 글자와 서비스 이름 검색어 비교는 어느 부분이 담당하는거야?

ㄴ꼬리질문3 검색화면이 열리는걸 어떻게 알고, catalogServicesProvider가 CatalogRepostitory.getAll()을 호출하는거야?

ㄴ꼬리질문4 CatalogServiceProvider가 먼저 CatalogServiceRepository를 만들고, 이 Repository가 SQLITE에 있는 원본 서비스 데이터를 검색 및 조회해서 CatalogService라는 모델을 만들고 다시 이 모델을 Provider한테 전달해주는거지?

ㄴ꼬리질문5 catalogRepositoryProvider는 원래 CatalogServiceRepository를 만들어주는 역할을 하는거야?

ㄴ꼬리질문6 DB 행을 List<Subscription> 모델로 변환하는건 Repository가 하는거 맞지?

ㄴ꼬리질문7 각 화면이나 계산용 Provider가 최신 구독 목록을 관찰하고, 자기 기능에 필요한 날짜·필터·스캔 결과 등을 더해 다시 계산 이 말에 대해 조금 더 자세하게 설명해줘

ㄴ꼬리질문8 화면에서 저장, 삭제, 요청을 처리하는 메서드나 함수가 있으면 알려줘

ㄴ꼬리질문9 save()라는 메서드에 대해 간단하게 설명해줘

ㄴ꼬리질문10 여기서 말하는 입력값이 어떤 데이터인거야? 그리고, persistFormValues()는 어떤 일을 처리하는 함수인거야?

ㄴ꼬리질문11 WatchAll()은 뭘 지켜보고 있는거야? 어떤 매서드를 지켜보고 있는지 알려줘

ㄴ꼬리질문12 query.watch()는 DB 변경에 어떻게 반응을 하는거야? 코드로 보여줘

ㄴ꼬리질문13 watch()는 메서드인 것 같은데 어떤 일을 처리하는 메서드인거야?

ㄴ꼬리질문14 그럼 watchAll()은 어떤 메서드인거야? watchAll()안에 query.watch()가 있는거야?

그리고, query를 subscription 테이블을 select(가져오기)를 통해 가져와서 이를 변수에 담은 거잖아?

query.watch()에서 query는 그 전에 select로 받은 데이터르 담은 변수 즉, 동일한거 맞는거야?

ㄴ꼬리질문15 그럼 스트림을 구독한다는 말의 의미는 뭐야?

ㄴ꼬리질문16 watchAll()이라는 메서드가 언제 만들어지고 언제 실행이 되는지 설명해줘

ㄴ꼬리질문17 ref.watch(subscriptionRepositoryProvider) 는 결국 subscriptionRepositoryProvider를 보고 있다는 거잖아? 어떤 변화가 일어나면 객체를 받아오는거야?

ㄴ꼬리질문18 ref.watch()이 코드를 자꾸 나는 지켜보고 있다가 바뀌는 것이 있으면 이 바뀐 것을 반영한 데이터값을 준다고 자꾸 생각을 하고 있는 것 같아 ref.watch()가 정확히 어떤 기능을 하는 코드인지 바로 잡을 수 있게 설명해줘

ㄴ꼬리질문19 ref.watch(subscriptionRepositoryProvider) 그럼 이 코드는 Provider가 새 값을 제공하면 Repository 객체를 준다는 말인데, 여기서 Provider가 새 값을 제공하는 상황이 뭐가 있어?

ㄴ꼬리질문20 오케이 그럼 정리해볼게 일단 앱을 맨 처음 시작해서 화면을 그릴때 (아직 아무것도 구독하지 않음) subscriptionsProvider가 호출이 되고, 이로 인해서 SubscriptionRepository를 만들어

여기서 사용자가 구독을 추가하거나 삭제하거나 수정하면 Repository가 DB의 행 즉, Subscriptions의 행을 바꾸고, watchAll()의 메서드인 Drift의 query.watc()가 DB의 변경을 감지해서 Select를 통해 구독 행을 다시 조회하고, 이를 Stream 타입으로 만들어 그리고 watchAll()이 이 행을 새Subscription 데이터모델로 변환하고, 이를 subscriptionsProvider에 전달하는거야 그리고 subscriptionsProvider는 query.watch()가 만든 스트림을 구독해서 계속해서 새로운 값을 받을 수 있어

이게 맨 처음에 앱을 처음 실행했을때의 흐름이고

만약 기존의 목록이 있는 상황에서 목록을 삭제, 수정, 등록할때는 마찬가지로 Repository가 DB행을 변경하고, 이 변경을 query.watch()가 감지해서 select를 통해 구독행을 다시 조회하고 이 결과를 또 Stream 타입으로 보내 그리고 Repository의 watchAll()이 이를 새로운 Subscription 데이터 모델로 바꿔, 그리고 subscriptionProvider가 Stream을 구독했기 때문에 다시 새로운 데이너틀 전달 하는거야

내가 정리한거 맞아?

ㄴ꼬리질문22 오케이 얼추 이해가 된 것 같아

그리고 "화면을 그릴때 (아직 아무것도 구독하지 않음) subscriptionsProvider가 호출이 되고, 이로 인해서 SubscriptionRepository를 만들어"

이 과정은 사용자가 구독 목록을 추가, 수정, 삭제 하기 전에 선행 되어야 하는 즉, 준비가 되어야 하는 과정인거지?

그럼 만약 다이어그래을 그릴때, 먼저 이 과정을 그리고 본격적으로 사용자가 구독 목록을 등록, 수정, 삭제할때를 시작으로 도식화를 이어나가면 되는거야?

ㄴ꼬리질문23 HomeContent 또한 subscriptionsProvider을 구독하고 있는거야?

ㄴ꼬리질문24 구독 목록 + 오늘 날짜 부분은 Provider를 통해 받은 데이터에서 이 두가지 데이터만 쓴다는 거지?

AI 대화 내역 링크:

GPT: https://chatgpt.com/s/cx_6ae8ca2df8cc8191997200dc08b1431b

오늘 잘한 점: Excalidraw라는 도구를 사용해서 내가 스스로 데이터의 흐름과 과정을 복기 하면서 스스로 데이터 흐름을 도식화 한 것이 잘한 것 같다.

오늘 부족했던 점: 아직 순수 혼자 처음부터 끝까지 도식화를 하는건 쉽지 않은 것 같다, 어떤 컨셉으로 도식화를 할것인가에 대한 고민은 AI와 대화를 하면서 처음 시작을 정립해 나갔다.

오늘 총평: 직접 도식화를 해보니 수동적으로 AI가 만들어준 도식화를 보는 것 보다 훨씬 이해가 더 잘된다, 그리고 AI가 만들어준 도식화보다 나만의 기준을 가지고 내가 중요하다고 생각하는 과정을 계속해서 생각하고 추가하면서 더 디테일이 좋은 도식화를 만들 수 있게 되는 것 같다는 생각이 들었다.

비록 시간은 많이 걸리지만 나의 앱을 제대로 이해하기 위해서는 필수적인 과정이자 단계라고 생각한다.

0
0

여기에 파일을 드롭하세요