Skip to content

[Fix] 루틴 불러오는 로직 수정#43

Merged
choijungp merged 3 commits intodevelopfrom
fix/routine-fetch
Aug 8, 2025
Merged

[Fix] 루틴 불러오는 로직 수정#43
choijungp merged 3 commits intodevelopfrom
fix/routine-fetch

Conversation

@choijungp
Copy link
Copy Markdown
Contributor

@choijungp choijungp commented Aug 8, 2025

🌁 Background

루틴 불러오기가 무한루프를 탔던 이슈를 해결했시유 ㅠㅠ !!!!!!!!!!!!
뇌를 조금 식혀주니까 돌아가긴 했는데. ... 아직 완벽하게 맘에 들지는 않아요 ㅠㅠ

👩‍💻 Contents

  • 루틴 fetch 로직 수정
  • 루틴 등록하기 View에서 키보드 내려가기 동작 추가

Summary by CodeRabbit

  • 신규 기능

    • 루틴 생성 입력란에서 키보드의 완료(Return) 키를 누르면 키보드가 자동으로 닫히도록 개선되었습니다.
    • 루틴 생성 화면에서 정보 버튼이나 툴팁 외의 영역을 탭하면 키보드가 자동으로 닫히도록 변경되었습니다.
  • 기능 개선

    • 홈 화면 진입 시마다 루틴 목록이 새로고침되어 항상 최신 정보를 확인할 수 있습니다.
    • 홈 화면의 루틴 데이터 조회가 날짜별로 더 효율적으로 캐시되고 관리되도록 개선되었습니다.
    • 추천 루틴 화면에서 루틴 생성 화면으로 이동 시 하단 탭 바가 숨겨지도록 변경되었습니다.
  • 기타

    • iOS 기기에서 앱이 전체 화면 모드로 실행되도록 설정이 추가되었습니다.

@choijungp choijungp requested a review from taipaise August 8, 2025 08:22
@choijungp choijungp self-assigned this Aug 8, 2025
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Aug 8, 2025

Walkthrough

이번 변경에서는 루틴 데이터를 날짜별로 캐싱하고 조회하는 로직이 개선되었으며, 루틴 조회 시점이 viewDidLoad()에서 viewWillAppear(_:)로 변경되었습니다. 또한, RoutineCreation 입력 필드의 키보드 처리와 사용자 경험이 향상되고, 탭 바 숨김 설정이 추가되었습니다.

Changes

Cohort / File(s) Change Summary
HomeView 루틴 조회 시점 변경
Projects/Presentation/Sources/Home/View/HomeView.swift
루틴 조회 호출 위치가 viewDidLoad()에서 viewWillAppear(_:)로 이동하여, 뷰가 나타날 때마다 루틴을 새로 조회하도록 변경됨.
HomeViewModel 루틴 캐싱 및 조회 개선
Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift
날짜별 루틴 캐싱 및 조회 로직 개선. fetchRoutines(for:) 제거, fetchDailyRoutine(for:), fetchRoutines(startDate:endDate:), selectDate(date:) 메서드 추가. 캐시 범위 관리와 일별 조회 분리.
RoutineCreation 입력 필드 개선
Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift
텍스트 필드의 returnKeyType을 .done으로 설정하고, .editingChanged 이벤트로 텍스트 변경을 알림. 기존 shouldChangeCharactersIn 메서드 제거 및 textFieldShouldReturn(_:) 추가로 키보드 내림 처리.
RoutineCreation 키보드 닫기 UX 개선
Projects/Presentation/Sources/RoutineCreation/View/RoutineCreationView.swift
뷰 탭 시 키보드가 내려가도록 handleTap(_:) 메서드에 view.endEditing(true) 추가.
탭 바 숨김 설정 추가
Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineView.swift, Projects/Presentation/Sources/ResultRecommendedRoutine/View/ResultRecommendedRoutineView.swift
RoutineCreationView를 네비게이션 푸시할 때 hidesBottomBarWhenPushedtrue로 설정하여 하단 탭 바 숨김 처리 추가.
RoutineCreationViewModel 유효성 검사 간소화
Projects/Presentation/Sources/RoutineCreation/ViewModel/RoutineCreationViewModel.swift
루틴 유효성 검사에서 요일 선택 및 서브루틴 이름 검사 제거, 루틴 이름과 실행 시간 조건만 검사하도록 간소화.
Info.plist 전체화면 모드 설정 추가
SupportingFiles/Info.plist
UIRequiresFullScreen 키를 true로 추가하여 앱이 iOS에서 전체화면 모드를 요구하도록 설정.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant HomeView
    participant HomeViewModel
    participant Cache
    participant Server

    User->>HomeView: View appears
    HomeView->>HomeViewModel: action(input: .fetchRoutines)
    HomeViewModel->>Cache: Check routines cache for date
    alt Cache hit
        Cache-->>HomeViewModel: Return cached daily routines
        HomeViewModel-->>HomeView: Update UI with daily routines
    else Cache miss
        HomeViewModel->>Server: Fetch routines for extended date range
        Server-->>HomeViewModel: Return routines
        HomeViewModel->>Cache: Update cache with new routines
        HomeViewModel-->>HomeView: Update UI with daily routines
    end
Loading
sequenceDiagram
    participant User
    participant RoutineCreationInputView
    participant Keyboard

    User->>RoutineCreationInputView: Tap return key
    RoutineCreationInputView->>RoutineCreationInputView: textFieldShouldReturn(_:)
    RoutineCreationInputView->>Keyboard: Resign first responder
    Keyboard-->>User: Keyboard dismissed
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~18 minutes

Poem

(⁎˃ᆺ˂) 𝄞
루틴은 날짜별로 똑똑하게,
캐시도 넓게, 키보드는 가볍게!
탭 한 번에 사라지는 키보드,
뷰가 뜨면 싱싱한 루틴도 등장해.
코드는 점점 더 부드러워져,
토끼는 오늘도 깡충깡충 기뻐해! 🐇✨


📜 Recent review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 966002e and 31d0c3b.

📒 Files selected for processing (5)
  • Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineView.swift (1 hunks)
  • Projects/Presentation/Sources/ResultRecommendedRoutine/View/ResultRecommendedRoutineView.swift (1 hunks)
  • Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift (2 hunks)
  • Projects/Presentation/Sources/RoutineCreation/ViewModel/RoutineCreationViewModel.swift (1 hunks)
  • SupportingFiles/Info.plist (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • SupportingFiles/Info.plist
🚧 Files skipped from review as they are similar to previous changes (1)
  • Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift:0-0
Timestamp: 2025-07-16T10:58:30.858Z
Learning: choijungp는 OnboardingUseCase의 convertToDictionary 함수에서 에러 처리 개선을 추후 고민하고 반영할 계획을 가지고 있음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#31
File: Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift:97-103
Timestamp: 2025-08-01T06:38:18.687Z
Learning: choijungp의 HomeViewModel에서 fetchRoutines(for date: Date) 메서드는 기존 캐시 범위를 확장하는 것이 아니라, 요청된 날짜 주변의 새로운 데이터 청크를 가져오기 위해 oldestDate와 latestDate를 모두 업데이트한다. 과거 날짜 요청 시에는 해당 날짜의 1주 전~1일 전, 미래 날짜 요청 시에는 해당 날짜의 1일 후~1주 후 범위로 설정한다.
Learnt from: taipaise
PR: YAPP-Github/Bitnagil-iOS#25
File: Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift:104-111
Timestamp: 2025-07-27T10:05:46.043Z
Learning: RoutineCreationInputView에서 textField(_:shouldChangeCharactersIn:replacementString:) 메서드가 변경 전 텍스트를 delegate에 전달하는 이유: 변경된 텍스트를 전달하면 텍스트 입력 중에 다른 UI 액션(예: 서브루틴 추가)이 발생할 때 입력 중이던 텍스트가 손실되는 문제가 발생하기 때문. 이는 의도적인 구현으로 동시성 문제를 방지함.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#30
File: Projects/DataSource/Sources/NetworkService/Plugin/RefreshTokenPlugin.swift:42-43
Timestamp: 2025-07-30T03:56:18.617Z
Learning: choijungp는 현재 테스트 단계에서 RefreshTokenPlugin의 토큰 갱신 로직 디버깅을 위해 액세스 토큰과 리프레시 토큰의 실제 값을 로그에 기록하는 것을 선호함.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift:0-0
Timestamp: 2025-07-16T10:57:16.559Z
Learning: choijungp는 추후 CustomAlertView를 만들어서 에러 처리를 UI로 해결하도록 수정할 계획을 가지고 있음.
📚 Learning: 2025-07-16T09:21:15.038Z
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.

Applied to files:

  • Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineView.swift
  • Projects/Presentation/Sources/ResultRecommendedRoutine/View/ResultRecommendedRoutineView.swift
🔇 Additional comments (2)
Projects/Presentation/Sources/ResultRecommendedRoutine/View/ResultRecommendedRoutineView.swift (1)

371-373: 탭바 숨김 처리 일관성 확보 — LGTM

RoutineCreationView로 이동 시 하단 탭바가 숨겨져 UX 일관성이 맞춰졌습니다. 상위 바인딩에서 메인 스레드로 수신하고 있어 네비게이션 타이밍도 안전합니다.

Projects/Presentation/Sources/RecommendedRoutine/View/RecommendedRoutineView.swift (1)

330-332: RoutineCreation 이동 시 탭바 숨김 처리 — LGTM

플로팅 메뉴 경로에서도 하단 탭바를 숨겨 화면 전환 일관성이 확보되었습니다. 다른 경로(ResultRecommended 포함)와 동작이 통일되었습니다.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/routine-fetch

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary or @coderabbitai 요약 to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🔭 Outside diff range comments (1)
Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift (1)

181-194: 에러 처리 구현 필요: 실패 이벤트 방출 및 로깅/사용자 알림 추가
fetchRoutines(startDate:endDate:)catch 블록이 비어 있어 SwiftLint 경고가 발생합니다. 실패 시에도 구독자에게 알림을 보내고, 로깅/사용자 피드백 경로를 마련하세요.

• 대상 파일/라인

  • Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift:181–194

• 제안하는 코드 변경 예시

     } catch {
-        // TODO: 에러 처리
+        // 실패 알림
+        fetchRoutineResultSubject.send(false)
+        // 로깅
+        Logger.shared.error("루틴 조회 실패: \(error.localizedDescription)")
+        // TODO: 사용자 피드백(UI 토스트/알럿) 추가 (추후 CustomAlertView 연계)
     }
🧹 Nitpick comments (2)
Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift (1)

106-110: 리턴 키 입력 시 델리게이트 콜백 누락 가능성

textFieldShouldReturn에서 키보드를 내리는 것까진 좋지만, 마지막 입력 상태가 shouldChangeCharactersIn에 전달되지 못할 수 있습니다. 필요하다면 아래처럼 최종 텍스트를 한 번 더 delegate에 전달해 보세요.

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {
+    if let text = textField.text {
+        delegate?.routineCreationInputView(self, didChangeText: text)
+    }
     textField.resignFirstResponder()
     return true
 }
Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift (1)

139-143: 초기 캐시 윈도우 설정 합리적이나 경계 시점(startOfDay/endOfDay) 검토 권장

오늘 기준 ±1주를 첫 윈도우로 여는 건 합리적입니다. 다만 서버의 날짜 해석(포함/제외, 시간대)에 따라 오프바이원이 생길 수 있어 startOfDay/endOfDay 정규화 필요성도 한번 확인해 주세요.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1891a62 and 966002e.

📒 Files selected for processing (4)
  • Projects/Presentation/Sources/Home/View/HomeView.swift (1 hunks)
  • Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift (3 hunks)
  • Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift (2 hunks)
  • Projects/Presentation/Sources/RoutineCreation/View/RoutineCreationView.swift (1 hunks)
🧰 Additional context used
🧠 Learnings (5)
📓 Common learnings
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift:0-0
Timestamp: 2025-07-16T10:58:30.858Z
Learning: choijungp는 OnboardingUseCase의 convertToDictionary 함수에서 에러 처리 개선을 추후 고민하고 반영할 계획을 가지고 있음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#31
File: Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift:97-103
Timestamp: 2025-08-01T06:38:18.687Z
Learning: choijungp의 HomeViewModel에서 fetchRoutines(for date: Date) 메서드는 기존 캐시 범위를 확장하는 것이 아니라, 요청된 날짜 주변의 새로운 데이터 청크를 가져오기 위해 oldestDate와 latestDate를 모두 업데이트한다. 과거 날짜 요청 시에는 해당 날짜의 1주 전~1일 전, 미래 날짜 요청 시에는 해당 날짜의 1일 후~1주 후 범위로 설정한다.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#30
File: Projects/DataSource/Sources/NetworkService/Plugin/RefreshTokenPlugin.swift:42-43
Timestamp: 2025-07-30T03:56:18.617Z
Learning: choijungp는 현재 테스트 단계에서 RefreshTokenPlugin의 토큰 갱신 로직 디버깅을 위해 액세스 토큰과 리프레시 토큰의 실제 값을 로그에 기록하는 것을 선호함.
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift:0-0
Timestamp: 2025-07-16T10:57:16.559Z
Learning: choijungp는 추후 CustomAlertView를 만들어서 에러 처리를 UI로 해결하도록 수정할 계획을 가지고 있음.
📚 Learning: 2025-07-27T10:05:46.043Z
Learnt from: taipaise
PR: YAPP-Github/Bitnagil-iOS#25
File: Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift:104-111
Timestamp: 2025-07-27T10:05:46.043Z
Learning: RoutineCreationInputView에서 textField(_:shouldChangeCharactersIn:replacementString:) 메서드가 변경 전 텍스트를 delegate에 전달하는 이유: 변경된 텍스트를 전달하면 텍스트 입력 중에 다른 UI 액션(예: 서브루틴 추가)이 발생할 때 입력 중이던 텍스트가 손실되는 문제가 발생하기 때문. 이는 의도적인 구현으로 동시성 문제를 방지함.

Applied to files:

  • Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift
  • Projects/Presentation/Sources/RoutineCreation/View/RoutineCreationView.swift
📚 Learning: 2025-08-01T06:38:18.687Z
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#31
File: Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift:97-103
Timestamp: 2025-08-01T06:38:18.687Z
Learning: choijungp의 HomeViewModel에서 fetchRoutines(for date: Date) 메서드는 기존 캐시 범위를 확장하는 것이 아니라, 요청된 날짜 주변의 새로운 데이터 청크를 가져오기 위해 oldestDate와 latestDate를 모두 업데이트한다. 과거 날짜 요청 시에는 해당 날짜의 1주 전~1일 전, 미래 날짜 요청 시에는 해당 날짜의 1일 후~1주 후 범위로 설정한다.

Applied to files:

  • Projects/Presentation/Sources/Home/View/HomeView.swift
  • Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift
📚 Learning: 2025-07-16T09:21:15.038Z
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift:57-59
Timestamp: 2025-07-16T09:21:15.038Z
Learning: OnboardingRecommendedRoutineView에서 viewWillAppear에 registerOnboarding 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.

Applied to files:

  • Projects/Presentation/Sources/Home/View/HomeView.swift
📚 Learning: 2025-07-16T09:09:13.869Z
Learnt from: choijungp
PR: YAPP-Github/Bitnagil-iOS#19
File: Projects/Presentation/Sources/Login/View/TermsAgreementView.swift:44-46
Timestamp: 2025-07-16T09:09:13.869Z
Learning: BaseViewController의 viewDidLoad() 메서드에서 이미 configureAttribute(), configureLayout(), bind()를 호출하므로, 하위 클래스에서 super.viewDidLoad()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.

Applied to files:

  • Projects/Presentation/Sources/Home/View/HomeView.swift
🪛 SwiftLint (0.57.0)
Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift

[Warning] 191-191: TODOs should be resolved (에러 처리)

(todo)

🔇 Additional comments (3)
Projects/Presentation/Sources/RoutineCreation/View/Component/RoutineCreationInputView.swift (1)

51-52: returnKeyType 설정 👍

returnKeyType = .done 지정으로 키보드 UX가 개선되었습니다. 따로 문제될 부분 없습니다.

Projects/Presentation/Sources/RoutineCreation/View/RoutineCreationView.swift (1)

625-626: 탭 시 키보드 해제 처리 반영 완료

외부 탭으로 키보드를 닫도록 view.endEditing(true)를 추가한 점 확인했습니다.
tapGesture.cancelsTouchesInView = false 설정도 되어 있어 버튼 터치와 충돌 없이 동작할 것으로 보입니다.

Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift (1)

101-103: .refreshSelectedDateRoutine에서 일간 조회로 분리한 방향은 적절합니다

선택된 날짜만 갱신하도록 변경해 불필요한 대역 재조회 가능성을 낮추는 설계로 보입니다. 아래 fetchDailyRoutine 개선 제안을 함께 적용하면 루프/깜빡임 이슈가 더 확실히 사라집니다.

super.viewWillAppear(animated)
configureNavigationBar(navigationStyle: .hidden)
viewModel.action(input: .loadEmotion)
viewModel.action(input: .fetchRoutines)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

fetchRoutines를 viewWillAppear로 이동한 것은 타이밍 관점에서 적절합니다

뷰 재진입 시 최신 상태를 보장할 수 있습니다. 다만 ViewModel.selectDate 내부의 fetchRoutines 중복 호출은 제거해야 루프/과호출을 근본적으로 줄일 수 있습니다(위 ViewModel 코멘트의 diff 참고).

🤖 Prompt for AI Agents
In Projects/Presentation/Sources/Home/View/HomeView.swift at line 115, the call
to viewModel.action(input: .fetchRoutines) should be removed to avoid redundant
fetchRoutines calls. This is because fetchRoutines is already triggered inside
ViewModel.selectDate, so removing this direct call here will prevent duplicate
fetches and reduce unnecessary loops or over-calling.

Comment on lines +145 to +151
// 날짜를 선택하고 그 날에 해당하는 루틴을 불러옵니다.
private func selectDate(date: Date) {
selectedDateSubject.send(date)
fetchRoutines()
fetchDailyRoutine(for: date)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

selectDate에서 fetchRoutines 중복 호출 제거 권장 (루프·중복 네트워크 호출 방지)

selectDate 내부의 fetchRoutines는 fetchDailyRoutine가 캐시 확장까지 담당하는 현재 구조에서 중복 호출이며, HomeView.viewWillAppear에서도 fetch가 실행되어 과호출/루프의 촉매가 됩니다. 아래처럼 제거해 주세요.

 private func selectDate(date: Date) {
     selectedDateSubject.send(date)
-    fetchRoutines()
     fetchDailyRoutine(for: date)
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// 날짜를 선택하고 그 날에 해당하는 루틴을 불러옵니다.
private func selectDate(date: Date) {
selectedDateSubject.send(date)
fetchRoutines()
fetchDailyRoutine(for: date)
}
// 날짜를 선택하고 그 날에 해당하는 루틴을 불러옵니다.
private func selectDate(date: Date) {
selectedDateSubject.send(date)
fetchDailyRoutine(for: date)
}
🤖 Prompt for AI Agents
In Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift around lines
145 to 151, the selectDate function calls fetchRoutines redundantly, causing
duplicate network requests and potential loops since fetchDailyRoutine already
handles cache extension and fetchRoutines is also called in
HomeView.viewWillAppear. Remove the fetchRoutines call from selectDate to
prevent these redundant calls and improve efficiency.

Comment on lines +152 to +179
private func fetchDailyRoutine(for date: Date) {
if let dailyRoutines = routines[date.convertToString(dateType: .yearMonthDate)] {
routinesSubject.send(dailyRoutines)
return
}

var startDate: Date = Date()
var endDate: Date = Date()
if date < oldestDate {
// 캐싱된 데이터보다 이전의 날짜 조회 시,
startDate = calendar.date(byAdding: .weekOfYear, value: -1, to: oldestDate) ?? oldestDate
endDate = calendar.date(byAdding: .day, value: -1, to: oldestDate) ?? oldestDate
oldestDate = startDate
} else if date > latestDate {
// 캐싱된 데이터보다 이후의 날짜 조회 시,
startDate = calendar.date(byAdding: .day, value: 1, to: latestDate) ?? latestDate
endDate = calendar.date(byAdding: .weekOfYear, value: 1, to: latestDate) ?? latestDate
latestDate = endDate
}
fetchRoutines(startDate: startDate, endDate: endDate)

if let dailyRoutines = routines[date.convertToString(dateType: .yearMonthDate)] {
routinesSubject.send(dailyRoutines)
return
} else {
routinesSubject.send([])
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

무한 루프 및 깜빡임(flicker) 유발 지점: 캐시 내부 날짜에도 불필요한 fetch 및 즉시 빈 배열 방출

문제점

  • date가 캐시 [oldestDate, latestDate] 안에 있지만 해당 날짜 키가 비어있을 때도 start/end를 오늘(Date())로 둔 채 fetchRoutines가 호출됩니다.
  • 비동기 fetchRoutines 호출 직후 즉시 빈 배열을 routinesSubject로 내보내 UI가 빈 상태로 깜빡이고, fetch 완료 → refreshSelectedDateRoutine → 다시 fetchDailyRoutine의 루프가 이어질 수 있습니다.

해결

  • 캐시 범위 밖인 경우에만 네트워크 fetch를 수행하고, 수행했다면 즉시 반환(return)하여 빈 배열을 방출하지 않도록 합니다.
  • 캐시 범위 안인데 데이터가 없는 경우에만 빈 배열을 단 1회 방출합니다.

아래 패치 적용을 제안합니다.

 private func fetchDailyRoutine(for date: Date) {
     if let dailyRoutines = routines[date.convertToString(dateType: .yearMonthDate)] {
         routinesSubject.send(dailyRoutines)
         return
     }

-    var startDate: Date = Date()
-    var endDate: Date = Date()
+    var startDateToFetch: Date?
+    var endDateToFetch: Date?

     if date < oldestDate {
         // 캐싱된 데이터보다 이전의 날짜 조회 시,
-        startDate = calendar.date(byAdding: .weekOfYear, value: -1, to: oldestDate) ?? oldestDate
-        endDate = calendar.date(byAdding: .day, value: -1, to: oldestDate) ?? oldestDate
-        oldestDate = startDate
+        let s = calendar.date(byAdding: .weekOfYear, value: -1, to: oldestDate) ?? oldestDate
+        let e = calendar.date(byAdding: .day, value: -1, to: oldestDate) ?? oldestDate
+        startDateToFetch = s
+        endDateToFetch = e
+        oldestDate = s
     } else if date > latestDate {
         // 캐싱된 데이터보다 이후의 날짜 조회 시,
-        startDate = calendar.date(byAdding: .day, value: 1, to: latestDate) ?? latestDate
-        endDate = calendar.date(byAdding: .weekOfYear, value: 1, to: latestDate) ?? latestDate
-        latestDate = endDate
+        let s = calendar.date(byAdding: .day, value: 1, to: latestDate) ?? latestDate
+        let e = calendar.date(byAdding: .weekOfYear, value: 1, to: latestDate) ?? latestDate
+        startDateToFetch = s
+        endDateToFetch = e
+        latestDate = e
     }
-    fetchRoutines(startDate: startDate, endDate: endDate)
-
-    if let dailyRoutines = routines[date.convertToString(dateType: .yearMonthDate)] {
-        routinesSubject.send(dailyRoutines)
-        return
-    } else {
-        routinesSubject.send([])
-    }
+    if let s = startDateToFetch, let e = endDateToFetch {
+        // 범위 확장 fetch를 수행했다면, 완료 후 .refreshSelectedDateRoutine에서 다시 들어와 데이터 방출하도록 즉시 반환
+        fetchRoutines(startDate: s, endDate: e)
+        return
+    }
+    // 캐시 범위 안이지만 데이터가 없을 때만 빈 배열 방출 (중복 네트워크 호출/루프 방지)
+    routinesSubject.send([])
 }

이 변경으로

  • 캐시 확대가 필요한 경우에만 네트워크 호출
  • 확대 fetch 직후에는 빈 배열 방출을 피해서 UI 깜빡임↓
  • fetch 완료 → refreshSelectedDateRoutine → 재평가 흐름으로 유한 반복 보장
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
private func fetchDailyRoutine(for date: Date) {
if let dailyRoutines = routines[date.convertToString(dateType: .yearMonthDate)] {
routinesSubject.send(dailyRoutines)
return
}
var startDate: Date = Date()
var endDate: Date = Date()
if date < oldestDate {
// 캐싱된 데이터보다 이전의 날짜 조회 시,
startDate = calendar.date(byAdding: .weekOfYear, value: -1, to: oldestDate) ?? oldestDate
endDate = calendar.date(byAdding: .day, value: -1, to: oldestDate) ?? oldestDate
oldestDate = startDate
} else if date > latestDate {
// 캐싱된 데이터보다 이후의 날짜 조회 시,
startDate = calendar.date(byAdding: .day, value: 1, to: latestDate) ?? latestDate
endDate = calendar.date(byAdding: .weekOfYear, value: 1, to: latestDate) ?? latestDate
latestDate = endDate
}
fetchRoutines(startDate: startDate, endDate: endDate)
if let dailyRoutines = routines[date.convertToString(dateType: .yearMonthDate)] {
routinesSubject.send(dailyRoutines)
return
} else {
routinesSubject.send([])
}
}
private func fetchDailyRoutine(for date: Date) {
if let dailyRoutines = routines[date.convertToString(dateType: .yearMonthDate)] {
routinesSubject.send(dailyRoutines)
return
}
var startDateToFetch: Date?
var endDateToFetch: Date?
if date < oldestDate {
// 캐싱된 데이터보다 이전의 날짜 조회 시,
let s = calendar.date(byAdding: .weekOfYear, value: -1, to: oldestDate) ?? oldestDate
let e = calendar.date(byAdding: .day, value: -1, to: oldestDate) ?? oldestDate
startDateToFetch = s
endDateToFetch = e
oldestDate = s
} else if date > latestDate {
// 캐싱된 데이터보다 이후의 날짜 조회 시,
let s = calendar.date(byAdding: .day, value: 1, to: latestDate) ?? latestDate
let e = calendar.date(byAdding: .weekOfYear, value: 1, to: latestDate) ?? latestDate
startDateToFetch = s
endDateToFetch = e
latestDate = e
}
if let s = startDateToFetch, let e = endDateToFetch {
// 범위 확장 fetch를 수행했다면, 완료 후 .refreshSelectedDateRoutine에서 다시 들어와 데이터 방출하도록 즉시 반환
fetchRoutines(startDate: s, endDate: e)
return
}
// 캐시 범위 안이지만 데이터가 없을 때만 빈 배열 방출 (중복 네트워크 호출/루프 방지)
routinesSubject.send([])
}
🤖 Prompt for AI Agents
In Projects/Presentation/Sources/Home/ViewModel/HomeViewModel.swift around lines
152 to 179, the fetchDailyRoutine function calls fetchRoutines unnecessarily
when the requested date is within the cached range but the data is missing,
causing flickering and potential infinite loops. Fix this by modifying the logic
to only call fetchRoutines when the date is outside the cached range, and
immediately return after fetching to avoid emitting an empty array prematurely.
If the date is within the cached range but data is missing, emit an empty array
only once without triggering a fetch. This prevents unnecessary network calls
and UI flicker.

- 키보드 입력 끊김 이슈 수정
- 루틴 반복 선택하지 않아도 등록 활성화 되도록 수정
@choijungp choijungp merged commit caff51e into develop Aug 8, 2025
2 checks passed
@choijungp choijungp deleted the fix/routine-fetch branch August 8, 2025 11:39
choijungp added a commit that referenced this pull request Aug 8, 2025
* Feat: SnapKit, Then 외부 라이브러리 추가

* Feat: Logger 구현

* Feat: Logger 구현

* Del: 임시 파일 (Shared.swift) 삭제

* Fix: log 메시지 출력 형식 변경

- 파일명, 라인 수, 함수명 default로 출력하도록 수정

* Feat: DIContainer 구현 (#T3-56)

* Update Package.swift

* [Del}  불필요한 이미지 파일 삭제

* Feat: Keychain 및 UserDefaults 기반 Persistence 구현 (#T3-60)

* Feat: Persistence 저장소 리팩토링 (#T3-60)

* Feat: NetworkService 구현 (#T3-57)

* Del: 임시 파일 (Domain.swift) 삭제

* Feat: Endpoint 구현 (#T3-57)

- Endpoint 프로토콜 구현
- Network 레이어에 Endpoint extension 구현
- 편의성을 위한 URLRequest extension 구현

* Feat: 네트워크 로직을 위한 enum 값들 구현 (#T3-57)

- NetworkError, HTTPMethod, AppProperties 구현

* Feat: NetworkService 구현

- NetworkServiceProtocol 추상체 구현
- NetworkService 구현체 구현

* Feat: BaseResponseDTO 구현 (#T3-57)

* Feat: 개발 서버 테스트 구현

- health-check API를 통한 테스트 진행
- 이를 위한 Endpoint, UseCase, Repository 구현
- App 모듈에 의존성 추가 (NetworkService, Persistence)

* Refactor: 피드백 기반 UserDefaultsStore 네이밍 및 불필요 타입 제거 (#T3-60)

* Refactor: KeyValueStorage 네이밍 및 계층 구조 정리 (#T3-60)

* Refactor: UserDefaults 밑 KeychainStorageProtocol (#T3-60)

* Refactor: KeychainStorage 오탈자 수 (#T3-60)

* Fix: UserDefaultsStorageProtocol 구현  타입 수정 (#T3-60)

* Refactor: UserDefaultsStorage 제네릭 타입 대응 및 프로토콜 정합성 개선 (#T3-60)

* Del: Git Cache 및 불필요한 파일 삭제

* Docs: gitignore 정보 추가

* Del: .xcworkspace 파일 삭제

* Feat: Design System 구현 (#T3-64)

* Feat: Gray 색상 Asset 추가 (#T3-64)

* Feat: BitnagilColor Enum 정의 (#T3-64)

* Feat: Pretendard 폰트 파일 추가

* Feat: BitnagilFont Enum 정의 (#T3-64)

- BitnagilFont Enum 정의
- FontName Enum 정의
- UIFont extension 구현

* Chore: Project 파일 수정

- 각 모듈의 infoPlist 설정 제거
- App 단의 info.plist 파일 사용하도록 수정

* Feat: BaseViewController 및 ViewModel protocol 구현 (#T3-65)

* Feat: ViewModel protocol 구현 (#T3-65)

* Feat: BaseViewController 구현 (#T3-56)

* Refactor: Test를 위한 HomeViewController 및 Test 객체들 수정

* Feat: Design System 구현 (#T3-64)

* Feat: Gray 색상 Asset 추가 (#T3-64)

* Feat: BitnagilColor Enum 정의 (#T3-64)

* Feat: Pretendard 폰트 파일 추가

* Feat: BitnagilFont Enum 정의 (#T3-64)

- BitnagilFont Enum 정의
- FontName Enum 정의
- UIFont extension 구현

* Chore: Project 파일 수정

- 각 모듈의 infoPlist 설정 제거
- App 단의 info.plist 파일 사용하도록 수정

* Refactor: BaseViewController의 viewModel 접근 제한자 수정 및 중복 제거

* Feat: ViewModel protocol 구현 (#T3-65)

* Feat: BaseViewController 구현 (#T3-56)

* Refactor: Test를 위한 HomeViewController 및 Test 객체들 수정

* Refactor: BaseViewController의 viewModel 접근 제한자 수정 및 중복 제거

* Refactor: HomeViewController에 디자인 시스템 적용

* Feat: Dependency Assembler 구현 (#T3-63)

* Refactor: DIContainer 로직 수정 (#T3-63)

- 기존 Any 타입으로 인스턴스를 저장하던 의존성을 factory closure 형태로 변경
- resolve 시 클로저 실행을 통해 인스턴스를 생성하도록 개선

* Feat: DependencyAssemblerProtocol 구현 (#T3-63)

* Feat: 각 모듈별 DependencyAssembler 구현

- Network, Persistence, DataSource, Domain, Presentation 모듈의 DependencyAssembler 구현
- previous 의존성을 명시하여 DI 등록 순서를 보장하도록 함

* Feat: App 모듈에 DependencyInjection 함수 구현 (#T3-63)

* Del: DataSoure의 불필요한 Resources 파일 제거

* Refactor: NetworkService 테스트 가능한 구조를 위해 NetworkProviderProtocol 구현 및 채택

* Feat: 빌드 체크 자동화 Github Actions 추가

* Chore: Kakao SDK 설치 및 Tuist 외부 의존성 추가

* Chore: Kakao SDK init 및 필요한 프로젝트 설정 세팅

* Refactor: 네트워크 모듈 세부 구현 수정

- Endpoint, URLRequest 수정
- 기존 parameter만 받던 Endpoint에서 queryParameters, bodyParameters를 구분지어서 받도록 수정
- 확장해서 만든 커스텀 URLRequest 생성자에서 url 뿐만 아니라 queryParamters도 받아 쿼리 파라미터가 있다면 붙여서 url 만들어주도록 수정
- 그에 따른 TestEndpoint 수정

* Feat: 카카오 로그인 기능 구현 (#T3-66)

- Enum, Error 폴더 구조 정리
- AuthEndpoint 구현
- AuthRepository 구현체 및 추상체 구현
- LoginUseCase 구현체 및 추상체 구현

* Feat: LoginView 및 LoginViewModel 구현 (#T3-66)

* Feat: 각 모듈 Assembler에 Login 및 Auth 의존성 추가

* Chore: info.plist 카카오 네이티브 키 설정 값 오타 수정

* Fix: 서버 요청사항에 맞게 Endpoint 수정

- AuthEndpoint 수정
- accessToken, refreshToken 저장 후 로그 찍기

* Feat: Apple 로그인 구현 (#T3-67)

* Refactor: LoginView Layout Enum 상수값 네이밍 수정

* Feat: LoginViewController에 Apple Login 버튼 추가

* Fix: TokenResponse, TokenEntity 값 서버에 맞게 수정

* Refactor: Apple 로그인 토큰 값 및 유저 정보 가져오는 로직 ViewController로 이동 (#T3-67)

- ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding 채택해주는 로직 LoginViewController로 이동 (기존 AuthRepository)

* Feat: LoginViewModel, LoginUseCase에 appleLogin 함수 구현 (#T3-67)

- LoginViewModel에서 apple 로그인 결과에 따라 값을 방출할 수 있도록 구현
- LoginUseCaseProtocol, LoginUseCase appleLogin 함수 정의 및 구현

* Feat: AuthError 및 UserDefaultsKey Enum 값 정의

* Refactor: 카카오 로그인 에러 구체화

* Feat: AuthRepository appleLogin 구현 (#T3-67)

- AuthRepositoryProtocol, AuthRepository appleLogin 정의 및 구현
- 받은 닉네임, 토큰 값을 통해 서버 통신 로직 구현
- UserDefaults에 닉네임 저장 및 불러오는 로직 구현

* Feat: AuthRepository UserDefaults 의존성 추가

* Chore: 프로젝트 세팅에 entitlements 지정

* Chore: 코드래빗 설정 파일 추가

* Refactor: Height 오타 수정

* Feat: 로그아웃, 탈퇴 및 토큰 재발급 로직 구현 (#T3-75)

* Del: health-check 관련 테스트 코드 삭제

* Feat: AuthRepository에 로그아웃 함수 구현 (#T3-75)

- AuthRepositoryProtocol, AuthRepository에 logout 함수 정의 및 구현
- AuthError에 토큰 삭제 에러 추가

* Feat: LogoutUseCase 구현 (#T3-75)

- LogoutUseCase Protocol, LogoutUsecase logout 함수 정의 및 구현
- LoginUseCase 폴더 이동

* Feat: LoginViewController, LoginViewModel에 logout 함수 추가

- 테스트 진행을 위해 LoginViewModel, LoginViewController에 로그아웃 버튼 추가 및 함수 구현

* Feat: LogoutUseCase 의존성 조립

* Refactor: 서버 응답 값에 맞게 BaseResponseDTO 수정

* Feat: 소셜 로그인 탈퇴 구현 (#T3-75)

- AuthEndpoint에 withdraw case 추가
- AuthRepositoryProtocol 및 AuthRepository에 withdraw 함수 정의 및 구현
- WithdrawUseCaseProtocol 및 WithdrawUseCase 정의 및 구현
- Domain, Presentation 의존성 등록 및 조립
- LoginViewModel, LoginViewController에 테스트를 위한 함수 및 버튼 추가

* Feat: 토큰 재발급 함수 reissueToken 구현

- AuthEndpoint에 reissue 케이스 추가
- AuthRepositoryProtocol 및 AuthRepository에 reissueToken 정의 및 구현
- LoginViewModel, LoginViewController에 reissue 테스트 관련 버튼 및 함수 추가

* Feat: 인트로 · 로그인 · 이용 약관 UI 구현 및 로직 정리 (#T3-86)

* Chore: 디자인 시스템 색상 Color Asset 추가 및 BitnagilColor 변수 값 추가

- Figma 디자인 시스템에 정의된 색상 값 Asset 추가
- 그에 따른 BitnagilColor 변수 추가
- Bundle을 해당 모듈에서 찾을 수 있도록 코드 변경

* Chore: 디자인 시스템 폰트 정리

- 기존 Enum으로 정리된 BitnagilFont에서 Struct로 변경하여 weight 값에 따른 폰트를 받을 수 있도록 수정
- FontAttributes, FontStyle, FontWeight 등 폰트 정의에 필요한 enum 및 struct 정의

* Chore: 디자인 시스템 icon 이미지 Asset 추가

- apple, kakao, check icon 이미지 추가
- BitnagilIcon Enum 정의

* Feat: IntroView 구현 (#T3-86)

- PrimaryButton Component 구현
- IntroView 구현

* Feat: LoginView UI 구현 및 로직 수정 (#T3-86)

* Refactor: 로그인 서버 통신 관련 AuthRepository 및 LoginUseCase 수정

* Feat: IntroView UI 구현 (#T3-86)

- IntroView UI 구현
- SceneDelegate 앱 진입점 수정

* Feat: LoginView UI 구현 (#T3-86)

- LoginView UI 구현
- SocialLoginButton Component 구현 (카카오, 애플)

* Feat: 이용 약관 동의 UI 구현 (#T3-86)

- TermAgreementItemView 컴포넌트 구현
- TermAgreementView UI 구현
- LoginViewModel과 로직 구현

* Feat: 이용 약관 동의 로직 구현 (#T3-86)

- 기존 TokenResponseDTO에서 LoginResponseDTO로 수정 (서버 응답에 User의 role이 추가되었음)
- AuthEndpoint에 agreements 케이스 추가
- AuthRepositoryProtocol 및 AuthRepository에 submitAgreements 정의 및 구현
- LoginUseCaseProtocol 및 LoginUseCase에 submitAgreements 정의 및 구현
- LoginViewModel에 submitAgreement 로직 구현

* Feat: UIViewController extension에 공통 backbutton을 사용할 수 있도록 커스텀

* Fix: IntroView, TermsAgreementView에 Label 색상 적용

* Refactor: label 오타 수정

* Feat: 온보딩 UI 구현 (#T3-68)

* Feat: 온보딩 선택지 버튼 Components UI 구현 (#T3-68)

* Feat: GradientProgressBar UI 구현

- Gradient 색상 Asset 추가
- GradientProgressBar를 포함한 navigationItem 구현

* Refactor: 온보딩 선택지 UI 수정 (#T3-68)

- OnboardingChoiceProtocol 구현
- 온보딩 선택 화면에서 해당 프로토콜을 채택한 타입이라면 OnboardingChoiceButton을 그릴 수 있도록 수정

* Feat: 온보딩에서 사용될 enum 타입 정의 (#T3-68)

- OnboardingType (온보딩 유형 값)
- OnboardingChoiceType (온보딩 선택지 값)

* Feat: OnboardingView 구현 (#T3-68)

- 온보딩 선택 화면에서 재사용될 OnboardingView 구현

* Feat: OnboardingResultView 구현 (#T3-68)

- 온보딩 결과 화면 UI 구현
- 특정 텍스트만 semiBold로 보여지기 위해 NSAttributedString extension 구현

* Feat: 온보딩 추천 루틴 UI 구현 (#T3-68)

* Feat: OnboardingViewModel 구현 (#T3-68)

* Feat: OnboardingViewModel 의존성 조립 및 이용 약관 화면에서 온보딩 화면으로 넘어가는 로직 구현 (#T3-68)

* Feat: 온보딩 서버 통신 구현 (#T3-102)

* Style: 통일성을 위한 폴더명 변경

* Refactor: BaseViewController 및 ViewModel에 public 접근제어자 삭제

* Refactor: NetworkService 리팩토링

- BaseResponseDTO DataSource에서 Network 모듈로 이관
- T 타입 반환에서 T? 타입 반환으로 수정 (EmptyResponse 대응)
- Server Message 출력

* Feat: 온보딩 선택지 등록 및 추천 루틴 받기 구현 (#T3-102)

- OnboardingEndpoint 정의
- OnboardingRepositoryProtocol · OnboardingRepository 구현
- OnboardingUseCaseProtocol · OnboardingUseCase 구현

* Feat: Onboarding 관련 의존성 조립 (#T3-102)

- DataSource, Domain, Presentaion 레이어에서 OnboardingRepository, OnboardingUseCase, OnboardingViewModel 의존성 등록

* Feat: 로그인 결과에 따른 이용약관 vs 온보딩 화면 분기 처리

* Feat: CustomFontStyle 추가

- 디자인 시스템에 정의되어 있는 폰트 외에도 정의해서 사용할 수 있도록 custom 케이스 추가

* Feat: 온보딩 선택 결과 바탕으로 추천 받은 루틴 등록 구현 (#T3-102)

* Refactor: AuthRepository do-catch 블록 수정

* Refactor: 의존성 없을 시 fatalError 발생하도록 수정

* Refactor: 온보딩 선택지 Dictonary 변경 로직 수정

* Feat: 탭바 구현

* Refactor: BitnagilColor 수정

- 기존 White 계열 컬러들 Orange로 수정
- HomeGradient 색상 및 Error 색상 추가

* Docs: 홈 탭바 아이콘 이미지 Asset 추가

* Feat: TabBarView 구현

* Style: 코드 컨벤션을 위한 import 순서 정렬

* Refactor: Gradient 오타 수정

* Feat: 추천 루틴 UI 구현 (#T3-70)

* Feat: 아이콘 이미지 Asset 추가 및 BitnagilIcon 케이스 추가

- plus, chevron 아이콘 이미지 asset 추가
- BitnagilIcon plus, chevron 아이콘 케이스 추가
- UIImage extension을 통해 resize 및 roate 함수 구현

* Feat: 추천 루틴 카테고리 타입 및 뷰 구현 (#T3-70)

* Feat: 추천 루틴 난이도 타입 및 뷰 구현 (#T3-70)

- RoutineLevelType enum 정의
- RoutineLevelView UI 구현 (+ RoutineLevelCell)
- RoutineLevelButton 구현

* Feat: 감정 등록 버튼 구현 (#T3-70)

* Feat: 추천 루틴 카드 뷰 구현 (#T3-70)

* Style: BaseViewController, ViewModel 폴더 위치 변경

* Feat: CustomButtonSheet 구현

* Feat: RecommendedRoutineView 구현 (#T3-70)

* Feat: RecommendedRoutineViewModel 구현 (#T3-70)

* Feat: Presentation 모듈에 RecommendedViewModel 의존성 추가

* Feat: TabBarView에 추천 루틴 View 변경

- 기존 테스트용 View 삭제

* Fix: ScrollViewBottomSpacing 값 수정

* Refactor: Delegate 함수 네이밍 수정

* Refactor: RoutineLevelView 테이블 뷰 셀 UI 수정

- RoutineLevelView 테이블 뷰 셀 밑줄 간격 조정 및 마지막 셀 밑줄 생략
- CustomBottomSheet 투명도 변경

* Refactor: RoutineLevelType 정렬 중복 로직 정리

* [Feat-T3-104] 마이페이지 UI 구현 (#22)

* Feat: 이미지 asset 추가 (#T3-104)

- BitnagilIcon에 이미지 추가

* Feat: NSObject extension 추가  (#T3-104)

- {class이름}.className을 통해 클래스의 이름을 스트링으로 사용할 수 있도록 구현

* Feat: UserDataRepository 구현  (#T3-104)

- 유저 정보 (닉네임, accessToken)을 가져올 수 있는 repository 구현

- UserDataRepository 의존성 등록

* Feat: 마이페이지 화면 구현  (#T3-104)

- 마이페이지 화면 구현
- 의존성 등록
- TabBar에서 Myapge 클래스 삭제

* refactor: 코드 리뷰 반영

* Feat: 홈 화면 UI 구현 (#T3-105)

* Feat: 메인 루틴 Component UI 구현 (#T3-105)

- epllipsis 아이콘 에셋 추가 및 BitnagilIcon 프로퍼티 추가
- MainRoutineView 구현

* Refactor: MainRoutineView 리팩토링

- Layout enum 추가
- 불필요한 do 문법 제거
- MainRoutine 구조체 폴더 위치 변경

* Feat: SubRoutineButton UI 구현 (#T3-105)

* Feat: RoutineView UI 구현 (#T3-105)

* Feat: DateView UI 구현 (#T3-105)

* Feat: HomeEmptyView UI 구현 (#T3-105)

* Feat: 이미지 에셋 추가 및 BitnagilIcon에 정의

- informationIcon, sortIcon HomeView에서 필요한 이미지 에셋 추가

* Feat: 홈 감정구슬 등록하기 버튼 UI 구현 (#T3-105)

* Feat: WeekView UI 구현 (#T3-105)

* Feat: HomeView UI Layout 구현 (#T3-105)

* Feat: 루틴 정렬, 필터링 테이블뷰 재사용 SelectableItemTableView로 구현 (#T3-105)

- SelectableItem protocol 정의 (정렬, 필터링 시 선택지)
- SelectableItemCell UI 구현
- SelectableItemTableView UI 구현
- RoutineLevelView, RoutineLevelCell 삭제 -> SelectableItemTableView 재사용
- RoutineSortType 정의

* Feat: HomeViewModel + HomeView 연동 (#T3-105)

* Refactor: routinesSubject 오타 수정

* Feat: 모듈 구조 변경 및 토큰 로직

* Refactor: NetworkService, Persistence 모듈 DataSource 모듈 합치기

* Refactor: Then 외부 라이브러리 제거 및 사용 코드 제거

* Feat: TokenManager 구현

* Refactor: Endpoint에 isAuthorized 값 추가

- Endpoint에 isAuthorized 값 추가 (인증이 필요한지 여부)
- 그렇다면 Endpoint 만들 때 header에 TokenManager에서 accessToken 빼와서 저장

* Refactor: UserDataRepository에 token 재발급 로직 추가

* Feat: 로그인 시 소셜 로그인 타입, 프로필 이미지 저장

- 카카오 로그인 시 nickname, profileImageUrl을 KakaoSDK에서 받아와 저장하도록 로직 추가
- 카카오, 애플 로그인 시 소셜 로그인 타입 저장하도록 로직 추가

* Fix: 온보딩 서버 Request Enum 값 변경

- 온보딩 서버 Request Enum 값 변경
- 온보딩 UI 수정 (SubTitle 여부)

* Feat: UserDataRepository에서 토큰 재발급 가능 여부에 따라 앱 진입점 분기처리

* Fix: 토큰 재발급 로직 Response 타입 변경

- TokenResponseDTO 구현
- reissue response 타입 교체

* Style: 불필요한 주석 제거

* Style: UserDataRepository 오타 수정

* Refactor: 코드 리뷰 반영

- NetworkService에서 endpoint.isAuthorized 값 확인하여 헤더에 토큰 값 세팅해주는 로직으로 수정
- 카카오 유저 정보 (닉네임, 프로필 이미지 URL) 메인스레드에서 동작하는 것 제거
- SceneDelegate에서 SplashView를 먼저 표시하고, reissueToken 결과에 따라 rootViewController 교체하도록 구조 개선

* Refactor: import SnapKit 추가

* [Feat-T3-110] 루틴 생성 화면 구현

* feat: 루틴 추가 화면 이미지 asset 추가 (#T3-110)

* feat: ToolTipView 구현  (#T3-110)

* feat: 서브루틴 추가 View 구현  (#T3-110)

* feat: 루틴 생성 ViewModel 구현  (#T3-110)

* feat: 기타 subview 구현  (#T3-110)

- 루틴 시작 시간 선택 버튼
- 서브 루틴 추가 버튼

* feat: 루틴 추가 화면 구현  (#T3-110)

* fix: Tooltip 오타 수정  (#T3-110)

* refactor: 코드 리뷰 반영

* [Feat] 날짜 선택가능한  DatePickerView 구현

* feat: DatePickerView 구현

* fix: 하루 종일 설정 버튼 추가

- 하루 종일 UILabel을 눌러도 하루 종일 버튼이 눌리도록 수정

* refactor: 코드 리뷰 반영

* Feat: 감정 등록 화면 구현 (#T3-69)

* Docs: 감정 구슬 이미지 Asset 추가 및 BitnagilGraphic에 케이스 추가 (#T3-69)

- 감정 구슬 이미지 Asset 추가
- 이미지 Asset 폴더링 정리
- BitnagilGraphic에 감정 구슬 변수 추가

* Feat: 감정 구슬 화면 UI 구현 (#T3-69)

- 감정 구슬 enum 타입 정의 (EmotionType)
- 감정 구슬 CollectionViewCell UI 구현 (EmotionOrbCollectionViewCell)
- 감정 구슬 등록 화면 UI 구현 (EmotionRegisterView)

* Feat: EmotionRegisterViewModel 의존성 조립 및 감정 등록 화면 연결 (홈, 추천 루틴)

* Style: emotionOrbCollectionView let으로 수정

* Feat: 추천 루틴 API 연동 (#T3-121)

* Style: 일부 파일들 import 컨벤션 맞추기

* Feat: RecommendedRoutineRepository 구현 (#T3-121)

- RecommendedRoutineDTO, RecommendedRoutineDictionaryResponseDTO, RecommendedRoutineListResponseDTO 타입 정의
- RecommendedRoutineEndpoint 생성
- RecommendedRoutineRepositoryProtocol, RecommendedRoutineRepository 정의 및 구현

* Feat: RecommendedRoutineUseCase 구현 (#T3-121)

- RecommendedRoutineUseCaseProtocol, RecommendedRoutineUseCase 정의 및 구현
- RecommendedRoutineEntity 수정 (카테고리, 난이도 값 추가)
- RoutineCategoryType, RoutineLevelType 위치 변경 (기존 Presentation -> Domain)

* Refactor: 추천 루틴 뷰 수정 (#T3-121)

- 감정 등록 버튼이 추천 루틴 목록들보다 상단에 뜨도록 UI 수정
- RecommendedRoutineCardView에서 Label trailing Layout 추가

* Refactor: RoutineLevelType, RoutineCategoryType 모듈 위치 변경으로 인한 Presentation 모듈 수정

- Presentation 모듈에 있는 RoutineLevelType, RoutineCategoryType가 Domain을 extension해서 필요한 값을 추가하여 사용할 수 있도록 수정
- 그에 따른 import Domain 추가

* Feat: RecommendedRoutineView 및 RecommendedRoutineViewModel 로직 구현 (#T3-121)

- 전체 추천 루틴 받아오는 로직 추가 + 더미 데이터 삭제
- 카테고리 및 난이도에 대해 받아온 루틴 필터링하는 로직 추가
- 의존성 조립 (DataSource, Domain, Presentation)

* Feat: FloatingButton, FloatingMenuView UI 구현

* Feat: 추천 루틴 화면에 FloatingButton 추가 및 등록 화면 이동 (#T3-121)

- RecommendedRoutineView에 FloatingButton, FloatingMenu, dimmedView 추가
- 루틴 등록 화면으로 이동해야 하므로 RoutineCreationViewModel 의존성 등록

* Style: 오타 수정

* Refactor: 맞춤 추천 카테고리인 경우 감정 등록 버튼 보여주기

* [Feat] NetworkService 플러그인 구현 

* feat: 네트워크 플러그인 프로토콜 구현

* feat: 네트워크 플러그인 구현

* feat: networkService에 플러그인 적용

* refactor: 코드래빗 리뷰 반영

* refactor: 코드 리뷰 반영

* Feat: 감정 구슬 API 연동 및 추천 루틴 결과 화면 재사용 (#T3-127)

* Style: 클라에서 저장하고 있는 감정 구슬 값 삭제 (이미지 Asset, EmotionType 등)

* Feat: Emotion 조회 및 등록 API 연동 (#T3-127)

- EmotionEndpoint 정의
- EmotionRepositoryProtocol, EmotionRepository 정의 및 구현 (+ EmotionResponseDTO)
- EmotionUseCaseProtocol, EmotionUseCase 정의 및 구현 (+ EmotionEntity)

* Chore: Kingfisher 외부 라이브러리 의존성 추가

* Refatcor: 감정구슬 Cell, 감정구슬 등록 화면 수정 (#T3-127)

- 서버 통신으로 받은 값들을 보여주도록 수정
- 감정 구슬 이미지 Kingfisher로 출력

* Docs: 그래픽 이미지 Asset 추가 및 BitnagilGraphic 케이스 추가

* Refactor: 기존 OnboardingUseCase 삭제 및 추천 루틴 받아오는 로직 이동 (#T3-127)

- OnboardingUseCaseProtocol, OnboardingUseCase 삭제
- OnboardingRecommendedRoutineView 삭제
- 기존 온보딩 선택지 · 감정 값을 등록하고 추천 루틴을 받아오는 로직 이동

* Chore: Common View 폴더 생성 및 재사용 View 이동 (SplashView, TabBarView)

* Feat: ResultRecommendedRoutineView · ResultRecommendedRoutineViewModel 구현 (#T3-127)

- 추천 루틴 결과 값을 보여주는 화면(ResultRecommendedRoutineView) 구현
- 온보딩 선택지 or 감정 구슬 선택지에 따른 추천 루틴 받아오는 로직
- 선택한 추천 루틴 등록 로직

* Refactor: ResultRecommendedRoutineView 재사용을 위한 분기처리 (#T3-127)

- MypageView, OnboardingResultView, EmotionRegisterView에서 재사용할 수 있도록 분기 처리
- OnboardingResultView에 그래픽 추가

* Feat: 의존성 조립 (Domain, DataSource, Presentation)

* Refactor: 오타 수정

* Refactor: UIScreen.main 기준으로 height 계산하는 코드 수정

* Feat: 홈 API 연동 (1) - 루틴 조회, 루틴 상세 보기 (#T3-130)

* Feat: 유저 닉네임 가져오는 API 연동 (#T3-130)

- HomeView, MypageView에서 사용

* Chore: 이용 약관 및 공지사항 등 서비스 URL 교체

* Feat: HomeView에 FloatingButton 추가 (#T3-130)

* Feat: 루틴 목록 조회 API 연동 (#T3-130)

* Feat: 감정 구슬 관련 TooltipView 추가 (#T3-130)

* Feat: RoutineDetailView UI 구현 (#T3-130)

* Refactor: KakaoSDK에서 닉네임, 프로필 가져오는 로직 제거

* Refactor: 오타 수정 및 분기 처리

* Refactor: RoutineView, SubRoutineButton Layout 조정

* Refactor: LoginView, IntroView 그래픽 추가

* Chore: AppIcon 추가

* Feat: Home 화면에서 감정 구슬 보여주기 (#T3-130)

* Fix: IntroView Layout 수정

* Fix: handleTap 좌표 계산 수정

* [Feat-T3-132] 설정 화면 구현

* feat: 이미지 asset 추가

* feat: TableViewCell 구현

- TableView에서 사용할 수 있는 3가지 타입의 cell 구현
- chevron 이미지로 다음 화면으로 넘어갈 수 있는 cell
- button이 있는 cell
- switch가 있는 cell

* feat: 커스텀 Alert View 추가

* feat: 설정 화면 커스텀 tableView Section HeaderView 구현

* feat: 설정 화면 구현

* feat: navigationController appearance 수정

* refactor: custom alert 파라미터 이름 수정, alert 표시 타입 수정

* refactor: 오타 수정 (토끼 리뷰 반영)

* Feat: 루틴 등록 / 수정 로직 구현

* feat: DTO -> Parameter 변환을 위한 Encodable extension 구현

* feat: 루틴 생성/수정 관련 DTO 정의

* feat: 루틴 endpoint 수정

- 루틴 생성 추가
- 루틴 수정 추가
- 루틴 단건 조회 추가

* fix: routine 엔티티의 id를 옵셔널로 수정

* feat: 루틴 repository 구현

* feat: 루틴 생성/수정 UseCase 구현

- 루틴 요약, 서브 루틴 요약 엔티티 생성

* feat: 루틴 등록/수정 로직 View와 연결

* [Feat] 네트워킹 로깅 플러그인 구현

* feat: 네트워킹 로깅 플러그인 구현

* refactor: 불필요한 공백, 상수 제거

* Feat: 루틴 삭제 구현 (#T3-134)

* Feat: 루틴 삭제 AlertView 구현 및 HomeView에 적용 (#T3-134)

* Feat: 반복 루틴 전체 삭제 구현 (#T3-134)

* Feat: 당일 루틴 삭제 구현 (#T3-134)

* Refactor: 서버 Request에 routineType 추가 및 Layout enum 정의

* Refactor: 오타 및 컨벤션 수정

* Feat: Splash view UI 구현

* Chore: Lottie 외부 라이브러리 의존성 추가

* Docs: Splash json 파일 및 bitnail logo 이미지 asset 추가

* Feat: SplashView UI 구현

* Chore: splash.json 파일 교체

- 용량이 너무 커서 git push가 안되는 이슈로 압축된 json 파일로 교체

* Chore: splash.json 파일 교체

* Refactor: SplashViewDelegate 구현하여 애니메이션 완료하도록 수정

* Feat: 온보딩 여부 저장 및 분기 처리

* Feat: 온보딩 여부 저장 및 불러오기, 삭제 로직 구현

- 온보딩 여부 저장, 불러오기, 삭제 로직 구현
- 필요없는 profileImageUrl 저장, 불러오기, 삭제 로직 제거

* Feat: 온보딩 여부에 따른 진입 뷰 분기 처리

- 온보딩 여부에 따른 진입 뷰 분기 처리
- 그에 따른 ViewController, ViewModel 접근제어자 변경 (internal -> public)

* Feat: 온보딩 네비게이션 Background 색상 변경

* Refactor: 코드 리뷰 반영

- 중복된 네비게이션 바 Appearance 설정 제거
- OnboardingView viewDidLoad 제거

* Refactor: 온보딩 첫 화면에서 백버튼 제거

* Feat: 설정 화면 로직 구현

* feat: 알림 section 주석 처리

* feat: 설정 로직 구현

* feat: 업데이트 로직 추가

* Feat: 프로필 default 이미지 asset 추가 및 MypageView에 세팅

* Refactor: isAuthenticated 값에 따른 화면 전환

---------

Co-authored-by: 최정인 <wjddls980912@naver.com>

* Feat: 루틴 완료 로직 구현 (#T3-144)

* Feat: 추천 루틴 화면에서 감정 등록에 따른 감정 버튼 안보이게 하기

* Fix: 루틴 삭제 performedDate 수정

* Feat: RoutineView UI 인터랙션 (#T3-144)

- 세부 루틴 완료 값에 따른 메인 루틴 완료 값 업데이트
- 메인 루틴 완료 값에 따른 세부 루틴 완료 값 업데이트

* Feat: 루틴 완료 API 연동 (#T3-144)

* Feat: loadingIndicatorView 추가

* Feat: 루틴 정렬 로직 구현

* Fix: 루틴 완료 배열 수정

* Feat: 추천 루틴 등록하기 기능 추가

* feat: 추천 루틴 등록하기 기능 추가

* Refactor: 오타 수정

---------

Co-authored-by: 최정인 <wjddls980912@naver.com>

* feat: 토스트 메시지 구현

* Fix: 토큰 재발급 role 추가

* Fix: reissue role에 따른 화면 분기 처리

* Feat: Home Toast View 적용

* Fix: 감정 구슬 등록 후 추천 루틴 등록 화면 이동

* Chore: 빌드 버전 업 (0.0.1 -> 0.0.3)

* Refactor: 오타 수정

* Refactor: nil일 때에도 감정 구슬 등록 action 추가

* [Fix] 루틴 불러오는 로직 수정 (#43)

* Fix: 루틴 fetch 로직 수정

* Fix: 루틴 등록 시, 키보드 내려가는 로직 수정

* Fix: 루틴 등록 수정

- 키보드 입력 끊김 이슈 수정
- 루틴 반복 선택하지 않아도 등록 활성화 되도록 수정

* feat: 로그 메시지 privacy 정책 적용

* Chore: 배포 전 설정 변경

---------

Co-authored-by: soungjunban <soungjunban@gmail.com>
Co-authored-by: Ban Soungjun <119939410+generalban@users.noreply.github.com>
Co-authored-by: taipaise <taipaise@gmail.com>
taipaise added a commit that referenced this pull request Aug 8, 2025
* Feat: SnapKit, Then 외부 라이브러리 추가

* Feat: Logger 구현

* Feat: Logger 구현

* Del: 임시 파일 (Shared.swift) 삭제

* Fix: log 메시지 출력 형식 변경

- 파일명, 라인 수, 함수명 default로 출력하도록 수정

* Feat: DIContainer 구현 (#T3-56)

* Update Package.swift

* [Del}  불필요한 이미지 파일 삭제

* Feat: Keychain 및 UserDefaults 기반 Persistence 구현 (#T3-60)

* Feat: Persistence 저장소 리팩토링 (#T3-60)

* Feat: NetworkService 구현 (#T3-57)

* Del: 임시 파일 (Domain.swift) 삭제

* Feat: Endpoint 구현 (#T3-57)

- Endpoint 프로토콜 구현
- Network 레이어에 Endpoint extension 구현
- 편의성을 위한 URLRequest extension 구현

* Feat: 네트워크 로직을 위한 enum 값들 구현 (#T3-57)

- NetworkError, HTTPMethod, AppProperties 구현

* Feat: NetworkService 구현

- NetworkServiceProtocol 추상체 구현
- NetworkService 구현체 구현

* Feat: BaseResponseDTO 구현 (#T3-57)

* Feat: 개발 서버 테스트 구현

- health-check API를 통한 테스트 진행
- 이를 위한 Endpoint, UseCase, Repository 구현
- App 모듈에 의존성 추가 (NetworkService, Persistence)

* Refactor: 피드백 기반 UserDefaultsStore 네이밍 및 불필요 타입 제거 (#T3-60)

* Refactor: KeyValueStorage 네이밍 및 계층 구조 정리 (#T3-60)

* Refactor: UserDefaults 밑 KeychainStorageProtocol (#T3-60)

* Refactor: KeychainStorage 오탈자 수 (#T3-60)

* Fix: UserDefaultsStorageProtocol 구현  타입 수정 (#T3-60)

* Refactor: UserDefaultsStorage 제네릭 타입 대응 및 프로토콜 정합성 개선 (#T3-60)

* Del: Git Cache 및 불필요한 파일 삭제

* Docs: gitignore 정보 추가

* Del: .xcworkspace 파일 삭제

* Feat: Design System 구현 (#T3-64)

* Feat: Gray 색상 Asset 추가 (#T3-64)

* Feat: BitnagilColor Enum 정의 (#T3-64)

* Feat: Pretendard 폰트 파일 추가

* Feat: BitnagilFont Enum 정의 (#T3-64)

- BitnagilFont Enum 정의
- FontName Enum 정의
- UIFont extension 구현

* Chore: Project 파일 수정

- 각 모듈의 infoPlist 설정 제거
- App 단의 info.plist 파일 사용하도록 수정

* Feat: BaseViewController 및 ViewModel protocol 구현 (#T3-65)

* Feat: ViewModel protocol 구현 (#T3-65)

* Feat: BaseViewController 구현 (#T3-56)

* Refactor: Test를 위한 HomeViewController 및 Test 객체들 수정

* Feat: Design System 구현 (#T3-64)

* Feat: Gray 색상 Asset 추가 (#T3-64)

* Feat: BitnagilColor Enum 정의 (#T3-64)

* Feat: Pretendard 폰트 파일 추가

* Feat: BitnagilFont Enum 정의 (#T3-64)

- BitnagilFont Enum 정의
- FontName Enum 정의
- UIFont extension 구현

* Chore: Project 파일 수정

- 각 모듈의 infoPlist 설정 제거
- App 단의 info.plist 파일 사용하도록 수정

* Refactor: BaseViewController의 viewModel 접근 제한자 수정 및 중복 제거

* Feat: ViewModel protocol 구현 (#T3-65)

* Feat: BaseViewController 구현 (#T3-56)

* Refactor: Test를 위한 HomeViewController 및 Test 객체들 수정

* Refactor: BaseViewController의 viewModel 접근 제한자 수정 및 중복 제거

* Refactor: HomeViewController에 디자인 시스템 적용

* Feat: Dependency Assembler 구현 (#T3-63)

* Refactor: DIContainer 로직 수정 (#T3-63)

- 기존 Any 타입으로 인스턴스를 저장하던 의존성을 factory closure 형태로 변경
- resolve 시 클로저 실행을 통해 인스턴스를 생성하도록 개선

* Feat: DependencyAssemblerProtocol 구현 (#T3-63)

* Feat: 각 모듈별 DependencyAssembler 구현

- Network, Persistence, DataSource, Domain, Presentation 모듈의 DependencyAssembler 구현
- previous 의존성을 명시하여 DI 등록 순서를 보장하도록 함

* Feat: App 모듈에 DependencyInjection 함수 구현 (#T3-63)

* Del: DataSoure의 불필요한 Resources 파일 제거

* Refactor: NetworkService 테스트 가능한 구조를 위해 NetworkProviderProtocol 구현 및 채택

* Feat: 빌드 체크 자동화 Github Actions 추가

* Chore: Kakao SDK 설치 및 Tuist 외부 의존성 추가

* Chore: Kakao SDK init 및 필요한 프로젝트 설정 세팅

* Refactor: 네트워크 모듈 세부 구현 수정

- Endpoint, URLRequest 수정
- 기존 parameter만 받던 Endpoint에서 queryParameters, bodyParameters를 구분지어서 받도록 수정
- 확장해서 만든 커스텀 URLRequest 생성자에서 url 뿐만 아니라 queryParamters도 받아 쿼리 파라미터가 있다면 붙여서 url 만들어주도록 수정
- 그에 따른 TestEndpoint 수정

* Feat: 카카오 로그인 기능 구현 (#T3-66)

- Enum, Error 폴더 구조 정리
- AuthEndpoint 구현
- AuthRepository 구현체 및 추상체 구현
- LoginUseCase 구현체 및 추상체 구현

* Feat: LoginView 및 LoginViewModel 구현 (#T3-66)

* Feat: 각 모듈 Assembler에 Login 및 Auth 의존성 추가

* Chore: info.plist 카카오 네이티브 키 설정 값 오타 수정

* Fix: 서버 요청사항에 맞게 Endpoint 수정

- AuthEndpoint 수정
- accessToken, refreshToken 저장 후 로그 찍기

* Feat: Apple 로그인 구현 (#T3-67)

* Refactor: LoginView Layout Enum 상수값 네이밍 수정

* Feat: LoginViewController에 Apple Login 버튼 추가

* Fix: TokenResponse, TokenEntity 값 서버에 맞게 수정

* Refactor: Apple 로그인 토큰 값 및 유저 정보 가져오는 로직 ViewController로 이동 (#T3-67)

- ASAuthorizationControllerDelegate, ASAuthorizationControllerPresentationContextProviding 채택해주는 로직 LoginViewController로 이동 (기존 AuthRepository)

* Feat: LoginViewModel, LoginUseCase에 appleLogin 함수 구현 (#T3-67)

- LoginViewModel에서 apple 로그인 결과에 따라 값을 방출할 수 있도록 구현
- LoginUseCaseProtocol, LoginUseCase appleLogin 함수 정의 및 구현

* Feat: AuthError 및 UserDefaultsKey Enum 값 정의

* Refactor: 카카오 로그인 에러 구체화

* Feat: AuthRepository appleLogin 구현 (#T3-67)

- AuthRepositoryProtocol, AuthRepository appleLogin 정의 및 구현
- 받은 닉네임, 토큰 값을 통해 서버 통신 로직 구현
- UserDefaults에 닉네임 저장 및 불러오는 로직 구현

* Feat: AuthRepository UserDefaults 의존성 추가

* Chore: 프로젝트 세팅에 entitlements 지정

* Chore: 코드래빗 설정 파일 추가

* Refactor: Height 오타 수정

* Feat: 로그아웃, 탈퇴 및 토큰 재발급 로직 구현 (#T3-75)

* Del: health-check 관련 테스트 코드 삭제

* Feat: AuthRepository에 로그아웃 함수 구현 (#T3-75)

- AuthRepositoryProtocol, AuthRepository에 logout 함수 정의 및 구현
- AuthError에 토큰 삭제 에러 추가

* Feat: LogoutUseCase 구현 (#T3-75)

- LogoutUseCase Protocol, LogoutUsecase logout 함수 정의 및 구현
- LoginUseCase 폴더 이동

* Feat: LoginViewController, LoginViewModel에 logout 함수 추가

- 테스트 진행을 위해 LoginViewModel, LoginViewController에 로그아웃 버튼 추가 및 함수 구현

* Feat: LogoutUseCase 의존성 조립

* Refactor: 서버 응답 값에 맞게 BaseResponseDTO 수정

* Feat: 소셜 로그인 탈퇴 구현 (#T3-75)

- AuthEndpoint에 withdraw case 추가
- AuthRepositoryProtocol 및 AuthRepository에 withdraw 함수 정의 및 구현
- WithdrawUseCaseProtocol 및 WithdrawUseCase 정의 및 구현
- Domain, Presentation 의존성 등록 및 조립
- LoginViewModel, LoginViewController에 테스트를 위한 함수 및 버튼 추가

* Feat: 토큰 재발급 함수 reissueToken 구현

- AuthEndpoint에 reissue 케이스 추가
- AuthRepositoryProtocol 및 AuthRepository에 reissueToken 정의 및 구현
- LoginViewModel, LoginViewController에 reissue 테스트 관련 버튼 및 함수 추가

* Feat: 인트로 · 로그인 · 이용 약관 UI 구현 및 로직 정리 (#T3-86)

* Chore: 디자인 시스템 색상 Color Asset 추가 및 BitnagilColor 변수 값 추가

- Figma 디자인 시스템에 정의된 색상 값 Asset 추가
- 그에 따른 BitnagilColor 변수 추가
- Bundle을 해당 모듈에서 찾을 수 있도록 코드 변경

* Chore: 디자인 시스템 폰트 정리

- 기존 Enum으로 정리된 BitnagilFont에서 Struct로 변경하여 weight 값에 따른 폰트를 받을 수 있도록 수정
- FontAttributes, FontStyle, FontWeight 등 폰트 정의에 필요한 enum 및 struct 정의

* Chore: 디자인 시스템 icon 이미지 Asset 추가

- apple, kakao, check icon 이미지 추가
- BitnagilIcon Enum 정의

* Feat: IntroView 구현 (#T3-86)

- PrimaryButton Component 구현
- IntroView 구현

* Feat: LoginView UI 구현 및 로직 수정 (#T3-86)

* Refactor: 로그인 서버 통신 관련 AuthRepository 및 LoginUseCase 수정

* Feat: IntroView UI 구현 (#T3-86)

- IntroView UI 구현
- SceneDelegate 앱 진입점 수정

* Feat: LoginView UI 구현 (#T3-86)

- LoginView UI 구현
- SocialLoginButton Component 구현 (카카오, 애플)

* Feat: 이용 약관 동의 UI 구현 (#T3-86)

- TermAgreementItemView 컴포넌트 구현
- TermAgreementView UI 구현
- LoginViewModel과 로직 구현

* Feat: 이용 약관 동의 로직 구현 (#T3-86)

- 기존 TokenResponseDTO에서 LoginResponseDTO로 수정 (서버 응답에 User의 role이 추가되었음)
- AuthEndpoint에 agreements 케이스 추가
- AuthRepositoryProtocol 및 AuthRepository에 submitAgreements 정의 및 구현
- LoginUseCaseProtocol 및 LoginUseCase에 submitAgreements 정의 및 구현
- LoginViewModel에 submitAgreement 로직 구현

* Feat: UIViewController extension에 공통 backbutton을 사용할 수 있도록 커스텀

* Fix: IntroView, TermsAgreementView에 Label 색상 적용

* Refactor: label 오타 수정

* Feat: 온보딩 UI 구현 (#T3-68)

* Feat: 온보딩 선택지 버튼 Components UI 구현 (#T3-68)

* Feat: GradientProgressBar UI 구현

- Gradient 색상 Asset 추가
- GradientProgressBar를 포함한 navigationItem 구현

* Refactor: 온보딩 선택지 UI 수정 (#T3-68)

- OnboardingChoiceProtocol 구현
- 온보딩 선택 화면에서 해당 프로토콜을 채택한 타입이라면 OnboardingChoiceButton을 그릴 수 있도록 수정

* Feat: 온보딩에서 사용될 enum 타입 정의 (#T3-68)

- OnboardingType (온보딩 유형 값)
- OnboardingChoiceType (온보딩 선택지 값)

* Feat: OnboardingView 구현 (#T3-68)

- 온보딩 선택 화면에서 재사용될 OnboardingView 구현

* Feat: OnboardingResultView 구현 (#T3-68)

- 온보딩 결과 화면 UI 구현
- 특정 텍스트만 semiBold로 보여지기 위해 NSAttributedString extension 구현

* Feat: 온보딩 추천 루틴 UI 구현 (#T3-68)

* Feat: OnboardingViewModel 구현 (#T3-68)

* Feat: OnboardingViewModel 의존성 조립 및 이용 약관 화면에서 온보딩 화면으로 넘어가는 로직 구현 (#T3-68)

* Feat: 온보딩 서버 통신 구현 (#T3-102)

* Style: 통일성을 위한 폴더명 변경

* Refactor: BaseViewController 및 ViewModel에 public 접근제어자 삭제

* Refactor: NetworkService 리팩토링

- BaseResponseDTO DataSource에서 Network 모듈로 이관
- T 타입 반환에서 T? 타입 반환으로 수정 (EmptyResponse 대응)
- Server Message 출력

* Feat: 온보딩 선택지 등록 및 추천 루틴 받기 구현 (#T3-102)

- OnboardingEndpoint 정의
- OnboardingRepositoryProtocol · OnboardingRepository 구현
- OnboardingUseCaseProtocol · OnboardingUseCase 구현

* Feat: Onboarding 관련 의존성 조립 (#T3-102)

- DataSource, Domain, Presentaion 레이어에서 OnboardingRepository, OnboardingUseCase, OnboardingViewModel 의존성 등록

* Feat: 로그인 결과에 따른 이용약관 vs 온보딩 화면 분기 처리

* Feat: CustomFontStyle 추가

- 디자인 시스템에 정의되어 있는 폰트 외에도 정의해서 사용할 수 있도록 custom 케이스 추가

* Feat: 온보딩 선택 결과 바탕으로 추천 받은 루틴 등록 구현 (#T3-102)

* Refactor: AuthRepository do-catch 블록 수정

* Refactor: 의존성 없을 시 fatalError 발생하도록 수정

* Refactor: 온보딩 선택지 Dictonary 변경 로직 수정

* Feat: 탭바 구현

* Refactor: BitnagilColor 수정

- 기존 White 계열 컬러들 Orange로 수정
- HomeGradient 색상 및 Error 색상 추가

* Docs: 홈 탭바 아이콘 이미지 Asset 추가

* Feat: TabBarView 구현

* Style: 코드 컨벤션을 위한 import 순서 정렬

* Refactor: Gradient 오타 수정

* Feat: 추천 루틴 UI 구현 (#T3-70)

* Feat: 아이콘 이미지 Asset 추가 및 BitnagilIcon 케이스 추가

- plus, chevron 아이콘 이미지 asset 추가
- BitnagilIcon plus, chevron 아이콘 케이스 추가
- UIImage extension을 통해 resize 및 roate 함수 구현

* Feat: 추천 루틴 카테고리 타입 및 뷰 구현 (#T3-70)

* Feat: 추천 루틴 난이도 타입 및 뷰 구현 (#T3-70)

- RoutineLevelType enum 정의
- RoutineLevelView UI 구현 (+ RoutineLevelCell)
- RoutineLevelButton 구현

* Feat: 감정 등록 버튼 구현 (#T3-70)

* Feat: 추천 루틴 카드 뷰 구현 (#T3-70)

* Style: BaseViewController, ViewModel 폴더 위치 변경

* Feat: CustomButtonSheet 구현

* Feat: RecommendedRoutineView 구현 (#T3-70)

* Feat: RecommendedRoutineViewModel 구현 (#T3-70)

* Feat: Presentation 모듈에 RecommendedViewModel 의존성 추가

* Feat: TabBarView에 추천 루틴 View 변경

- 기존 테스트용 View 삭제

* Fix: ScrollViewBottomSpacing 값 수정

* Refactor: Delegate 함수 네이밍 수정

* Refactor: RoutineLevelView 테이블 뷰 셀 UI 수정

- RoutineLevelView 테이블 뷰 셀 밑줄 간격 조정 및 마지막 셀 밑줄 생략
- CustomBottomSheet 투명도 변경

* Refactor: RoutineLevelType 정렬 중복 로직 정리

* [Feat-T3-104] 마이페이지 UI 구현 (#22)

* Feat: 이미지 asset 추가 (#T3-104)

- BitnagilIcon에 이미지 추가

* Feat: NSObject extension 추가  (#T3-104)

- {class이름}.className을 통해 클래스의 이름을 스트링으로 사용할 수 있도록 구현

* Feat: UserDataRepository 구현  (#T3-104)

- 유저 정보 (닉네임, accessToken)을 가져올 수 있는 repository 구현

- UserDataRepository 의존성 등록

* Feat: 마이페이지 화면 구현  (#T3-104)

- 마이페이지 화면 구현
- 의존성 등록
- TabBar에서 Myapge 클래스 삭제

* refactor: 코드 리뷰 반영

* Feat: 홈 화면 UI 구현 (#T3-105)

* Feat: 메인 루틴 Component UI 구현 (#T3-105)

- epllipsis 아이콘 에셋 추가 및 BitnagilIcon 프로퍼티 추가
- MainRoutineView 구현

* Refactor: MainRoutineView 리팩토링

- Layout enum 추가
- 불필요한 do 문법 제거
- MainRoutine 구조체 폴더 위치 변경

* Feat: SubRoutineButton UI 구현 (#T3-105)

* Feat: RoutineView UI 구현 (#T3-105)

* Feat: DateView UI 구현 (#T3-105)

* Feat: HomeEmptyView UI 구현 (#T3-105)

* Feat: 이미지 에셋 추가 및 BitnagilIcon에 정의

- informationIcon, sortIcon HomeView에서 필요한 이미지 에셋 추가

* Feat: 홈 감정구슬 등록하기 버튼 UI 구현 (#T3-105)

* Feat: WeekView UI 구현 (#T3-105)

* Feat: HomeView UI Layout 구현 (#T3-105)

* Feat: 루틴 정렬, 필터링 테이블뷰 재사용 SelectableItemTableView로 구현 (#T3-105)

- SelectableItem protocol 정의 (정렬, 필터링 시 선택지)
- SelectableItemCell UI 구현
- SelectableItemTableView UI 구현
- RoutineLevelView, RoutineLevelCell 삭제 -> SelectableItemTableView 재사용
- RoutineSortType 정의

* Feat: HomeViewModel + HomeView 연동 (#T3-105)

* Refactor: routinesSubject 오타 수정

* Feat: 모듈 구조 변경 및 토큰 로직

* Refactor: NetworkService, Persistence 모듈 DataSource 모듈 합치기

* Refactor: Then 외부 라이브러리 제거 및 사용 코드 제거

* Feat: TokenManager 구현

* Refactor: Endpoint에 isAuthorized 값 추가

- Endpoint에 isAuthorized 값 추가 (인증이 필요한지 여부)
- 그렇다면 Endpoint 만들 때 header에 TokenManager에서 accessToken 빼와서 저장

* Refactor: UserDataRepository에 token 재발급 로직 추가

* Feat: 로그인 시 소셜 로그인 타입, 프로필 이미지 저장

- 카카오 로그인 시 nickname, profileImageUrl을 KakaoSDK에서 받아와 저장하도록 로직 추가
- 카카오, 애플 로그인 시 소셜 로그인 타입 저장하도록 로직 추가

* Fix: 온보딩 서버 Request Enum 값 변경

- 온보딩 서버 Request Enum 값 변경
- 온보딩 UI 수정 (SubTitle 여부)

* Feat: UserDataRepository에서 토큰 재발급 가능 여부에 따라 앱 진입점 분기처리

* Fix: 토큰 재발급 로직 Response 타입 변경

- TokenResponseDTO 구현
- reissue response 타입 교체

* Style: 불필요한 주석 제거

* Style: UserDataRepository 오타 수정

* Refactor: 코드 리뷰 반영

- NetworkService에서 endpoint.isAuthorized 값 확인하여 헤더에 토큰 값 세팅해주는 로직으로 수정
- 카카오 유저 정보 (닉네임, 프로필 이미지 URL) 메인스레드에서 동작하는 것 제거
- SceneDelegate에서 SplashView를 먼저 표시하고, reissueToken 결과에 따라 rootViewController 교체하도록 구조 개선

* Refactor: import SnapKit 추가

* [Feat-T3-110] 루틴 생성 화면 구현

* feat: 루틴 추가 화면 이미지 asset 추가 (#T3-110)

* feat: ToolTipView 구현  (#T3-110)

* feat: 서브루틴 추가 View 구현  (#T3-110)

* feat: 루틴 생성 ViewModel 구현  (#T3-110)

* feat: 기타 subview 구현  (#T3-110)

- 루틴 시작 시간 선택 버튼
- 서브 루틴 추가 버튼

* feat: 루틴 추가 화면 구현  (#T3-110)

* fix: Tooltip 오타 수정  (#T3-110)

* refactor: 코드 리뷰 반영

* [Feat] 날짜 선택가능한  DatePickerView 구현

* feat: DatePickerView 구현

* fix: 하루 종일 설정 버튼 추가

- 하루 종일 UILabel을 눌러도 하루 종일 버튼이 눌리도록 수정

* refactor: 코드 리뷰 반영

* Feat: 감정 등록 화면 구현 (#T3-69)

* Docs: 감정 구슬 이미지 Asset 추가 및 BitnagilGraphic에 케이스 추가 (#T3-69)

- 감정 구슬 이미지 Asset 추가
- 이미지 Asset 폴더링 정리
- BitnagilGraphic에 감정 구슬 변수 추가

* Feat: 감정 구슬 화면 UI 구현 (#T3-69)

- 감정 구슬 enum 타입 정의 (EmotionType)
- 감정 구슬 CollectionViewCell UI 구현 (EmotionOrbCollectionViewCell)
- 감정 구슬 등록 화면 UI 구현 (EmotionRegisterView)

* Feat: EmotionRegisterViewModel 의존성 조립 및 감정 등록 화면 연결 (홈, 추천 루틴)

* Style: emotionOrbCollectionView let으로 수정

* Feat: 추천 루틴 API 연동 (#T3-121)

* Style: 일부 파일들 import 컨벤션 맞추기

* Feat: RecommendedRoutineRepository 구현 (#T3-121)

- RecommendedRoutineDTO, RecommendedRoutineDictionaryResponseDTO, RecommendedRoutineListResponseDTO 타입 정의
- RecommendedRoutineEndpoint 생성
- RecommendedRoutineRepositoryProtocol, RecommendedRoutineRepository 정의 및 구현

* Feat: RecommendedRoutineUseCase 구현 (#T3-121)

- RecommendedRoutineUseCaseProtocol, RecommendedRoutineUseCase 정의 및 구현
- RecommendedRoutineEntity 수정 (카테고리, 난이도 값 추가)
- RoutineCategoryType, RoutineLevelType 위치 변경 (기존 Presentation -> Domain)

* Refactor: 추천 루틴 뷰 수정 (#T3-121)

- 감정 등록 버튼이 추천 루틴 목록들보다 상단에 뜨도록 UI 수정
- RecommendedRoutineCardView에서 Label trailing Layout 추가

* Refactor: RoutineLevelType, RoutineCategoryType 모듈 위치 변경으로 인한 Presentation 모듈 수정

- Presentation 모듈에 있는 RoutineLevelType, RoutineCategoryType가 Domain을 extension해서 필요한 값을 추가하여 사용할 수 있도록 수정
- 그에 따른 import Domain 추가

* Feat: RecommendedRoutineView 및 RecommendedRoutineViewModel 로직 구현 (#T3-121)

- 전체 추천 루틴 받아오는 로직 추가 + 더미 데이터 삭제
- 카테고리 및 난이도에 대해 받아온 루틴 필터링하는 로직 추가
- 의존성 조립 (DataSource, Domain, Presentation)

* Feat: FloatingButton, FloatingMenuView UI 구현

* Feat: 추천 루틴 화면에 FloatingButton 추가 및 등록 화면 이동 (#T3-121)

- RecommendedRoutineView에 FloatingButton, FloatingMenu, dimmedView 추가
- 루틴 등록 화면으로 이동해야 하므로 RoutineCreationViewModel 의존성 등록

* Style: 오타 수정

* Refactor: 맞춤 추천 카테고리인 경우 감정 등록 버튼 보여주기

* [Feat] NetworkService 플러그인 구현 

* feat: 네트워크 플러그인 프로토콜 구현

* feat: 네트워크 플러그인 구현

* feat: networkService에 플러그인 적용

* refactor: 코드래빗 리뷰 반영

* refactor: 코드 리뷰 반영

* Feat: 감정 구슬 API 연동 및 추천 루틴 결과 화면 재사용 (#T3-127)

* Style: 클라에서 저장하고 있는 감정 구슬 값 삭제 (이미지 Asset, EmotionType 등)

* Feat: Emotion 조회 및 등록 API 연동 (#T3-127)

- EmotionEndpoint 정의
- EmotionRepositoryProtocol, EmotionRepository 정의 및 구현 (+ EmotionResponseDTO)
- EmotionUseCaseProtocol, EmotionUseCase 정의 및 구현 (+ EmotionEntity)

* Chore: Kingfisher 외부 라이브러리 의존성 추가

* Refatcor: 감정구슬 Cell, 감정구슬 등록 화면 수정 (#T3-127)

- 서버 통신으로 받은 값들을 보여주도록 수정
- 감정 구슬 이미지 Kingfisher로 출력

* Docs: 그래픽 이미지 Asset 추가 및 BitnagilGraphic 케이스 추가

* Refactor: 기존 OnboardingUseCase 삭제 및 추천 루틴 받아오는 로직 이동 (#T3-127)

- OnboardingUseCaseProtocol, OnboardingUseCase 삭제
- OnboardingRecommendedRoutineView 삭제
- 기존 온보딩 선택지 · 감정 값을 등록하고 추천 루틴을 받아오는 로직 이동

* Chore: Common View 폴더 생성 및 재사용 View 이동 (SplashView, TabBarView)

* Feat: ResultRecommendedRoutineView · ResultRecommendedRoutineViewModel 구현 (#T3-127)

- 추천 루틴 결과 값을 보여주는 화면(ResultRecommendedRoutineView) 구현
- 온보딩 선택지 or 감정 구슬 선택지에 따른 추천 루틴 받아오는 로직
- 선택한 추천 루틴 등록 로직

* Refactor: ResultRecommendedRoutineView 재사용을 위한 분기처리 (#T3-127)

- MypageView, OnboardingResultView, EmotionRegisterView에서 재사용할 수 있도록 분기 처리
- OnboardingResultView에 그래픽 추가

* Feat: 의존성 조립 (Domain, DataSource, Presentation)

* Refactor: 오타 수정

* Refactor: UIScreen.main 기준으로 height 계산하는 코드 수정

* Feat: 홈 API 연동 (1) - 루틴 조회, 루틴 상세 보기 (#T3-130)

* Feat: 유저 닉네임 가져오는 API 연동 (#T3-130)

- HomeView, MypageView에서 사용

* Chore: 이용 약관 및 공지사항 등 서비스 URL 교체

* Feat: HomeView에 FloatingButton 추가 (#T3-130)

* Feat: 루틴 목록 조회 API 연동 (#T3-130)

* Feat: 감정 구슬 관련 TooltipView 추가 (#T3-130)

* Feat: RoutineDetailView UI 구현 (#T3-130)

* Refactor: KakaoSDK에서 닉네임, 프로필 가져오는 로직 제거

* Refactor: 오타 수정 및 분기 처리

* Refactor: RoutineView, SubRoutineButton Layout 조정

* Refactor: LoginView, IntroView 그래픽 추가

* Chore: AppIcon 추가

* Feat: Home 화면에서 감정 구슬 보여주기 (#T3-130)

* Fix: IntroView Layout 수정

* Fix: handleTap 좌표 계산 수정

* [Feat-T3-132] 설정 화면 구현

* feat: 이미지 asset 추가

* feat: TableViewCell 구현

- TableView에서 사용할 수 있는 3가지 타입의 cell 구현
- chevron 이미지로 다음 화면으로 넘어갈 수 있는 cell
- button이 있는 cell
- switch가 있는 cell

* feat: 커스텀 Alert View 추가

* feat: 설정 화면 커스텀 tableView Section HeaderView 구현

* feat: 설정 화면 구현

* feat: navigationController appearance 수정

* refactor: custom alert 파라미터 이름 수정, alert 표시 타입 수정

* refactor: 오타 수정 (토끼 리뷰 반영)

* Feat: 루틴 등록 / 수정 로직 구현

* feat: DTO -> Parameter 변환을 위한 Encodable extension 구현

* feat: 루틴 생성/수정 관련 DTO 정의

* feat: 루틴 endpoint 수정

- 루틴 생성 추가
- 루틴 수정 추가
- 루틴 단건 조회 추가

* fix: routine 엔티티의 id를 옵셔널로 수정

* feat: 루틴 repository 구현

* feat: 루틴 생성/수정 UseCase 구현

- 루틴 요약, 서브 루틴 요약 엔티티 생성

* feat: 루틴 등록/수정 로직 View와 연결

* [Feat] 네트워킹 로깅 플러그인 구현

* feat: 네트워킹 로깅 플러그인 구현

* refactor: 불필요한 공백, 상수 제거

* Feat: 루틴 삭제 구현 (#T3-134)

* Feat: 루틴 삭제 AlertView 구현 및 HomeView에 적용 (#T3-134)

* Feat: 반복 루틴 전체 삭제 구현 (#T3-134)

* Feat: 당일 루틴 삭제 구현 (#T3-134)

* Refactor: 서버 Request에 routineType 추가 및 Layout enum 정의

* Refactor: 오타 및 컨벤션 수정

* Feat: Splash view UI 구현

* Chore: Lottie 외부 라이브러리 의존성 추가

* Docs: Splash json 파일 및 bitnail logo 이미지 asset 추가

* Feat: SplashView UI 구현

* Chore: splash.json 파일 교체

- 용량이 너무 커서 git push가 안되는 이슈로 압축된 json 파일로 교체

* Chore: splash.json 파일 교체

* Refactor: SplashViewDelegate 구현하여 애니메이션 완료하도록 수정

* Feat: 온보딩 여부 저장 및 분기 처리

* Feat: 온보딩 여부 저장 및 불러오기, 삭제 로직 구현

- 온보딩 여부 저장, 불러오기, 삭제 로직 구현
- 필요없는 profileImageUrl 저장, 불러오기, 삭제 로직 제거

* Feat: 온보딩 여부에 따른 진입 뷰 분기 처리

- 온보딩 여부에 따른 진입 뷰 분기 처리
- 그에 따른 ViewController, ViewModel 접근제어자 변경 (internal -> public)

* Feat: 온보딩 네비게이션 Background 색상 변경

* Refactor: 코드 리뷰 반영

- 중복된 네비게이션 바 Appearance 설정 제거
- OnboardingView viewDidLoad 제거

* Refactor: 온보딩 첫 화면에서 백버튼 제거

* Feat: 설정 화면 로직 구현

* feat: 알림 section 주석 처리

* feat: 설정 로직 구현

* feat: 업데이트 로직 추가

* Feat: 프로필 default 이미지 asset 추가 및 MypageView에 세팅

* Refactor: isAuthenticated 값에 따른 화면 전환

---------

Co-authored-by: 최정인 <wjddls980912@naver.com>

* Feat: 루틴 완료 로직 구현 (#T3-144)

* Feat: 추천 루틴 화면에서 감정 등록에 따른 감정 버튼 안보이게 하기

* Fix: 루틴 삭제 performedDate 수정

* Feat: RoutineView UI 인터랙션 (#T3-144)

- 세부 루틴 완료 값에 따른 메인 루틴 완료 값 업데이트
- 메인 루틴 완료 값에 따른 세부 루틴 완료 값 업데이트

* Feat: 루틴 완료 API 연동 (#T3-144)

* Feat: loadingIndicatorView 추가

* Feat: 루틴 정렬 로직 구현

* Fix: 루틴 완료 배열 수정

* Feat: 추천 루틴 등록하기 기능 추가

* feat: 추천 루틴 등록하기 기능 추가

* Refactor: 오타 수정

---------

Co-authored-by: 최정인 <wjddls980912@naver.com>

* feat: 토스트 메시지 구현

* Fix: 토큰 재발급 role 추가

* Fix: reissue role에 따른 화면 분기 처리

* Feat: Home Toast View 적용

* Fix: 감정 구슬 등록 후 추천 루틴 등록 화면 이동

* Chore: 빌드 버전 업 (0.0.1 -> 0.0.3)

* Refactor: 오타 수정

* Refactor: nil일 때에도 감정 구슬 등록 action 추가

* [Fix] 루틴 불러오는 로직 수정 (#43)

* Fix: 루틴 fetch 로직 수정

* Fix: 루틴 등록 시, 키보드 내려가는 로직 수정

* Fix: 루틴 등록 수정

- 키보드 입력 끊김 이슈 수정
- 루틴 반복 선택하지 않아도 등록 활성화 되도록 수정

* feat: 로그 메시지 privacy 정책 적용

* Chore: 배포 전 설정 변경

---------

Co-authored-by: soungjunban <soungjunban@gmail.com>
Co-authored-by: Ban Soungjun <119939410+generalban@users.noreply.github.com>
Co-authored-by: taipaise <taipaise@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant