DeveloperAcademy-POSTECH / 2024-MacC-M11-1Byte

TEAM: 1BYTE 🍀
2 stars 0 forks source link

[Mars/Feat/#107] 주차별 클로버 카드 기능 및 온보딩 수정 및 리팩토링 #113

Closed SANGDOLEE closed 1 day ago

SANGDOLEE commented 1 day ago

📓 Overview

1️⃣ 온보딩 1.1 버전 기준으로 수정

2️⃣ 클로버 카드

3️⃣ 루틴뷰

💬 추가 설명

✅ 온보딩 리팩토링

새롭게 추가된 기능들을 넣으면서 리팩토링을 조금 했습니다. 온보딩 뷰파일이 8개정도되는데, 뷰모델은 1개였고 create와 update, 그외에 로직들 또한 OnboardingViewModel 하나가 관리했었는데요. 온보딩이 크게 create되는 시점과, update되는 시점을 좀 나눌 수 있을 것 같더라구요.

그래서 Clover, GoalModels, 앱 설치일 등 앱의 시작부터 실행하며 필요한 create관련 로직들은 OnboardingStartViewModel ( 기존의 OnboardingViewModel )에서만 관리해서 createService만 주입받고 있구요.

그외에 사용자가 데이터를 입력하면서 update 하고, 해당 데이터를 기준으로 뷰 처리관련 로직들은 모두 RoutineCycleViewModel에서 관리해서 이 뷰모델은 updateService만 따르게 해놓았습니다.

그리고 5개View에서 백버튼+프로그레스바 뷰가 똑같아서, HeaderView로 빼서 간단히 호출만해서 뷰를 그리는 방식으로 수정했습니다.

🤔 고민 내용

🚨 온보딩 wwh 추가

만다라트 메인 뷰에서 루틴추가시 있었던 wwh의 뷰를 그대로 온보딩에서 갖다쓰는데, 로직은 어떻게 갖다쓸지 고민을좀 했어요. 처음에는 온보딩뷰에서도 똑같이 만다라트뷰모델을 선언해서, wwh를 쓰기위해 view만 붙여놨었는데, 온보딩에서 온보딩뷰모델을 선언해서 사용중인데 wwh하나때문에 다른 뷰모델 또한 선언해서 사용하고 있는게 뭔가~그냥 별로인것같아서 wwh의 함수들을 함수명만 수정해서 온보딩 뷰모델에 그대로 붙여놨습니다. 사실 뷰모델을 2개갖다쓰는데 양적으로는 코드수가 훨씬 적은건 맞지만, 조금 더 뒤를 생각했을때 온보딩과 만다라트에서 같은 로직을 둘다 갖다 쓰고 있으니까, wwh 관련 로직을 아예 다른 파일로 빼놓는형태로 리팩토링을해도 괜찮을 것 같다는 생각이 들었습니다.

🚨 클로버 카드뷰 로딩과 주차별 데이터 초기화

클로버 카드를 추가하면서, 어느시점에 어디에서 호출하면 될까 고민을 좀 했었어요. 일단 그저께 까지는, TabbarManager가 onAppear될 때 초기화를 해야하는 시점인지 판단해서, 맞을 시에 바로 초기화를 진행하면서 fullScreen으로 동시에 클로버뷰를 띄우게 했습니다. ( 초기화 시점 판단과 초기화 로직이 섞여 있는 형태 였음 )

그렇게 했더니 잘 처리가 되었고, 클로버카드를 띄울때 지난 주의 cloverState를 찾아서 그에 맞게 카드를 주어야 하는데 맨 처음에는 초기화전에 기존의 Maingoal의 CloverState를 다른 변수에 담아두고, 초기화 후에 다른 변수에 담아두었던것을 CloverView에 보낼려고했는데 자꾸 초기화랑 뷰 렌더가 동시에 되다보니 제대로 값 전달이 안되더라구요. 근데 이건 사실 Clover 객체가 날짜별로 이미 생성되어있으니 CloverView에서 지난주에 해당하는 Clover모델에서 cloverState를 찾으면 해결이었습니다.

근데 문제는, 완수율 통계를 보여주는게... Subgoal당 속한 DetailGoal들의 achiveCount와 achieveGoal을 계산해서 카테고리별로 ProgressBar 수치로 보여줘야하는데, 초기화전에 계산해서 값을 전달해주기에는 위에서 언급한 전달과 렌더링 시점문제가 있었고. UserDefaults에 저장하고 업데이트하면서 보여준다거나, 데이터 필드를 추가해준다거나 여러가지 생각해보다가

초기화가 이뤄지는 시점을 수정했어요. 위에서 말했다시피 TabbarManager에서 초기화를 해야하는 날인지 파악 + 초기화 + 클로버카드뷰 로딩이었는데, TabbarManager에서는 초기화를 해야하는 날인지만 판단해서, 해야하는 날(true)이면 클로버카드뷰를 띄워주고 클로버카드뷰에서는 Subgoal의 카테고리별로 성취수치를 계산해서 뷰로 보여주고나서, 초기화를 합니다. 즉,앱의 시작점인 TabbarManager에서는 초기화를 해야하는 날인 새로운 주차인지 판별만하고, 이를 기준으로 클로버카드뷰를 띄우고 '초기화'는 클로버카드뷰에서 일어나게 수정했습니다.

🚨 update 함수 인자 수정

루디가 최근 PR에서 언급한 update함수들 인자도 수정할곳있으면 찾아보고 하려고했는데, 다른 우선사항이 먼저 생겨서 추후에 다 수정해보도록 하겠습니다 ~!


📸 Screenshot


온보딩

온보딩에서 업데이트 이뤄지는 DetailGoal id 1의 시간대 선택은 그대로 "아침"이 기본적으로 선택되어있는 값으로 해놓았고, 다른 시간대 선택시 update 됩니다 ~


루틴뷰


클로버 카드 뷰

는.. 시뮬레이터말고 폰으로 녹화해서 올리면 gif로 변환해도 용량떄문에 첨부가 안되네요.