Skip to content

[Feat] 탭바 구현#20

Merged
choijungp merged 5 commits into
developfrom
feat/tab-view
Jul 17, 2025
Merged

[Feat] 탭바 구현#20
choijungp merged 5 commits into
developfrom
feat/tab-view

Conversation

@choijungp

@choijungp choijungp commented Jul 17, 2025

Copy link
Copy Markdown
Contributor

🌁 Background

각 기능 구현을 하기 위해 탭 바를 구현하였습니다.
이를 위해 탭 아이콘 asset을 추가하고 TabBarView를 구현하였습니다.


📱 Screenshot

iPhone SE3 iPhone 13 mini iPhone 16 Pro

👩‍💻 Contents

  • 탭바 구현
  • BitnagilColor 수정 및 추가
  • 컨벤션을 위한 import 순서 변경

📝 Review Note

  • 현재는 Report 탭도 만들어놨지만, 리포트는 2차 기능이므로 배포 시에는 이를 주석처리 해야 합니다.
  • 또한 현재 홈, 리포트, 추천 루틴, 마이페이지 다 구현 전이라 임의의 뷰를 TabBarView 밑에 만들어 놨습니다. 각 뷰를 만드는 즉시 변경 후 삭제해야 합니다.
  • SceneDelegate에서 로그인 여부에 따라 IntroView vs TabBarView 분기처리를 해야 합니다.

Summary by CodeRabbit

  • New Features

    • 새로운 색상(에러, 홈 그라디언트 등)과 오렌지 계열 색상들이 추가되었습니다.
    • 탭 바 아이콘(홈, 추천, 신고, 마이페이지)의 채움/비움 상태 이미지가 추가되었습니다.
    • 탭 바 UI가 새롭게 도입되어 홈, 추천, 신고, 마이페이지 탭 간 이동이 가능합니다.
  • Style

    • 코드 내 불필요한 import 제거 및 import 순서가 정리되었습니다.
  • Chores

    • 다양한 색상 에셋과 탭 바용 이미지 에셋이 추가되었습니다.

@choijungp choijungp self-assigned this Jul 17, 2025
@coderabbitai

coderabbitai Bot commented Jul 17, 2025

Copy link
Copy Markdown

Walkthrough

이번 변경사항은 주로 import 구문의 순서 조정 및 불필요한 Foundation import 제거와 같은 코드 정리에 집중되어 있습니다. 또한, 새로운 컬러 및 이미지 에셋 추가, 탭바 뷰(TabBarView) 및 관련 아이콘/컬러 enum 확장 등 UI 리소스와 디자인 시스템이 보강되었습니다. 기능적 로직 변경은 없으며, 리소스 및 코드 구조 개선이 주를 이룹니다.

Changes

파일/경로 요약 변경 내용 요약
AppDelegate.swift, SceneDelegate.swift, DependencyInjection.swift, HomeViewController.swift, NetworkService/Sources/Extension/Endpoint+.swift, NetworkService.swift, Persistence/Sources/Keychain/KeychainStorage.swift, Persistence/Sources/UserDefaults/UserDefaultsStorage.swift, Presentation/Sources/Login/View/Component/.swift, LoginView.swift, TermsAgreementView.swift, Onboarding/View/.swift, IntroView.swift import 구문 순서 변경 (UIKit, Foundation, SnapKit, SafariServices 등 위치 조정)
DomainDependencyAssembler.swift, UseCase/Auth/LoginUseCase.swift, LogoutUseCase.swift, WithdrawUseCase.swift, UseCase/Onboarding/OnboardingUseCase.swift, NetworkDependencyAssembler.swift, PersistenceDependencyAssembler.swift, PresentationDependencyAssembler.swift, Protocol/BaseViewController.swift, Protocol/ViewModel.swift, Shared/Sources/DIContainer/DIContainer.swift, DependencyAssemblerProtocol.swift 불필요한 Foundation import 제거
NetworkError.swift enum 선언 전 불필요한 빈 줄 제거
Presentation/Resources/Colors.xcassets/Error.colorset/Contents.json
Gradient/HomeGradientLeft.colorset/Contents.json
Gradient/HomeGradientRight.colorset/Contents.json
새로운 컬러 에셋 추가 (Error, HomeGradientLeft, HomeGradientRight)
Presentation/Resources/Images.xcassets/home_empty_icon.imageset/Contents.json
home_fill_icon.imageset/Contents.json
mypage_empty_icon.imageset/Contents.json
mypage_fill_icon.imageset/Contents.json
recommend_empty_icon.imageset/Contents.json
recommend_fill_icon.imageset/Contents.json
report_empty_icon.imageset/Contents.json
report_fill_icon.imageset/Contents.json
탭바 및 기타용 이미지 에셋 8종 추가 (각각 1x, 2x, 3x 스케일)
Presentation/Sources/Common/DesignSystem/BitnagilColor.swift BitnagilColor enum에 error, homeGradientLeft, homeGradientRight 및 orange50~900 컬러 추가, 기존 white 계열 컬러 제거
Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift BitnagilIcon enum에 탭바용 아이콘(홈/추천/리포트/마이페이지 fill/empty) 8종 static 프로퍼티 추가
Presentation/Sources/Common/TabBarView.swift TabBarView 클래스 및 임시 HomeView, RecommendView, ReportView, MypageView 클래스 신규 추가, 탭바 UI 및 appearance 설정 구현

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant TabBarView
    participant HomeView
    participant RecommendView
    participant ReportView
    participant MypageView

    User->>TabBarView: 앱 실행/탭바 진입
    TabBarView->>TabBarView: viewDidLoad() 호출
    TabBarView->>TabBarView: configureAttribute()로 appearance 및 탭 설정
    TabBarView->>HomeView: HomeView 생성 및 네비게이션 컨트롤러에 삽입
    TabBarView->>RecommendView: RecommendView 생성 및 네비게이션 컨트롤러에 삽입
    TabBarView->>ReportView: ReportView 생성 및 네비게이션 컨트롤러에 삽입
    TabBarView->>MypageView: MypageView 생성 및 네비게이션 컨트롤러에 삽입
    User->>TabBarView: 탭 아이콘 선택
    TabBarView->>해당 View: 선택된 뷰로 전환
Loading

Poem

🐰
import 줄 맞추고, 컬러도 더하고
탭바에 아이콘이 반짝반짝!
오렌지빛 물드는 BitnagilColor
새로 온 친구 TabBarView
리소스 풍성해진 오늘,
토끼는 깡충! 코드도 깔끔!

─ 코드토끼 드림 🥕


📜 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 f3a4038 and fbc3f05.

📒 Files selected for processing (1)
  • Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift
✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/tab-view

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.
    • @coderabbitai modularize this function.
  • 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.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

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

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

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 auto-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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🔭 Outside diff range comments (2)
Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift (1)

100-103: nextButton 액션에서 강한 순환 참조 발생 가능성

UIAction 클로저가 self를 강하게 캡처하여 OnboardingView → nextButton → UIAction → self 형태의 retain cycle이 형성될 수 있습니다. 다른 버튼 액션(89-91라인)은 [weak self]를 사용하고 있으므로 동일하게 수정해 주세요.

-        nextButton.addAction(UIAction { _ in
-            self.goNextStep()
-        }, for: .touchUpInside)
+        nextButton.addAction(UIAction { [weak self] _ in
+            self?.goNextStep()
+        }, for: .touchUpInside)
Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift (1)

57-63: 지연 애니메이션에서 strong self 캡처로 인한 메모리 누수 가능성
지연 3초 후 실행되는 UIView.animateanimations 클로저가 self를 강하게 캡처합니다.
화면이 사라지기 전에 해제되지 않을 수 있어 누수 위험이 있습니다.

-        UIView.animate(withDuration: 0.5, delay: 3, options: .curveEaseInOut, animations: {
-            self.view.alpha = 0.0
+        UIView.animate(withDuration: 0.5, delay: 3, options: .curveEaseInOut, animations: { [weak self] in
+            self?.view.alpha = 0.0
         }, completion: { [weak self] finished in
             guard let self else { return }
             let recommendedRoutineView = OnboardingRecommendedRoutineView(viewModel: self.viewModel)
             self.navigationController?.pushViewController(recommendedRoutineView, animated: true)
         })
🧹 Nitpick comments (7)
Projects/Presentation/Sources/Login/View/TermsAgreementView.swift (1)

10-14: SafariServices·UIKit 그룹핑 방식 재검토 권장

Apple 프레임워크끼리는 보통 같은 블록에 묶는 경우가 많습니다. SafariServices, UIKit을 연달아 배치해도 컴파일에는 영향 없지만, Swift-Format 등 자동 포매터 규칙을 미리 정해 두면 PR 단에서 반복 리뷰를 줄일 수 있습니다.

Projects/Persistence/Sources/UserDefaults/UserDefaultsStorage.swift (1)

8-9: Foundation 임포트 위치 변경이 팀 컨벤션과 일치하는지 확인 필요

Foundation-을 도메인 모듈(DataSource) 아래쪽에 배치한 이유가 명확하다면 문제 없으나,
다른 파일(예: AppDelegate, SceneDelegate)과 정렬 기준이 일관적인지 한번 더 확인해 주세요.
컨벤션이 없다면 알파벳순 또는 시스템 프레임워크 우선 정렬이 유지보수에 유리합니다.

Projects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/Contents.json (1)

3-17: 파일명에 쉼표와 공백 포함 — 추후 리소스 접근 시 오타 위험

navigation=_mypage, status=empty.png 처럼 쉼표·공백·등호가 들어간 파일명은
코드 레벨에서 문자열 타이핑 시 실수 가능성이 높습니다.
가능하면 navigation_mypage_empty.png 형태로 단순화하는 것을 권장드립니다.

Projects/Presentation/Sources/Login/View/Component/TermsAgreementItemView.swift (1)

8-10: 임포트 순서 통일 확인

Domain → SnapKit → UIKit 순서로 재배치된 점 확인했습니다. 동일 규칙이 다른 파일에도 일관되게 적용되고 있는지 CI/Lint 레벨에서 검증되면 좋겠습니다.

Projects/NetworkService/Sources/NetworkService.swift (1)

8-10: Foundation을 아래로 이동한 이유 재확인 필요

일반적으로 Swift 표준 라이브러리(Foundation)를 최상단에 두는 경우가 많아 기존 관례와 다릅니다.
프로젝트 내 규칙(예: 모듈 의존성 관계별 정렬)이라면 OK이지만, 아니면 불필요한 diff noise가 될 수 있으니 한 번 더 검토 바랍니다.

Projects/NetworkService/Sources/Extension/Endpoint+.swift (1)

8-10: 동일한 임포트 순서 규칙 적용

위 파일과 동일한 코멘트입니다. 컨벤션 확정을 위해 README나 SwiftLint 설정에 규칙을 명시해 두시면 향후 충돌을 줄일 수 있습니다.

Projects/Presentation/Sources/Common/TabBarView.swift (1)

75-102: 플레이스홀더 뷰 컨트롤러들이 임시 구현 목적에 맞게 구현되었습니다.

PR 목표에 명시된 대로 실제 뷰 구현이 완료될 때까지의 임시 구현으로 적절합니다. TODO 주석은 정당한 임시 코드를 나타내므로 실제 뷰 구현 시 제거하면 됩니다.

실제 뷰 구현을 위한 이슈 트래킹이나 구현 가이드가 필요하시면 도움을 드릴 수 있습니다.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between e514cf5 and f3a4038.

⛔ Files ignored due to path filters (24)
  • Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/navigation=home, status=empty.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/navigation=home, status=empty@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/navigation=home, status=empty@3x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/navigation=home, status=fill.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/navigation=home, status=fill@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/navigation=home, status=fill@3x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/navigation=_mypage, status=empty.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/navigation=_mypage, status=empty@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/navigation=_mypage, status=empty@3x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/navigation=_mypage, status=fill.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/navigation=_mypage, status=fill@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/navigation=_mypage, status=fill@3x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/navigation=recommend, status=empty.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/navigation=recommend, status=empty@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/navigation=recommend, status=empty@3x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/navigation=recommend, status=fill.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/navigation=recommend, status=fill@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/navigation=recommend, status=fill@3x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/navigation=report, status=empty.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/navigation=report, status=empty@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/navigation=report, status=empty@3x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/navigation=report, status=fill.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/navigation=report, status=fill@2x.png is excluded by !**/*.png
  • Projects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/navigation=report, status=fill@3x.png is excluded by !**/*.png
📒 Files selected for processing (45)
  • Projects/App/Sources/AppDelegate.swift (1 hunks)
  • Projects/App/Sources/DependencyInjection.swift (1 hunks)
  • Projects/App/Sources/SceneDelegate.swift (1 hunks)
  • Projects/Domain/Sources/DomainDependencyAssembler.swift (0 hunks)
  • Projects/Domain/Sources/UseCase/Auth/LoginUseCase.swift (0 hunks)
  • Projects/Domain/Sources/UseCase/Auth/LogoutUseCase.swift (0 hunks)
  • Projects/Domain/Sources/UseCase/Auth/WithdrawUseCase.swift (0 hunks)
  • Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift (0 hunks)
  • Projects/NetworkService/Sources/Extension/Endpoint+.swift (1 hunks)
  • Projects/NetworkService/Sources/NetworkDependencyAssembler.swift (0 hunks)
  • Projects/NetworkService/Sources/NetworkError.swift (0 hunks)
  • Projects/NetworkService/Sources/NetworkService.swift (1 hunks)
  • Projects/Persistence/Sources/Keychain/KeychainStorage.swift (1 hunks)
  • Projects/Persistence/Sources/PersistenceDependencyAssembler.swift (0 hunks)
  • Projects/Persistence/Sources/UserDefaults/UserDefaultsStorage.swift (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Error.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientLeft.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientRight.colorset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/mypage_empty_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/Contents.json (1 hunks)
  • Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift (2 hunks)
  • Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift (1 hunks)
  • Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift (0 hunks)
  • Projects/Presentation/Sources/Common/TabBarView.swift (1 hunks)
  • Projects/Presentation/Sources/Home/HomeViewController.swift (1 hunks)
  • Projects/Presentation/Sources/Login/Model/TermsType.swift (1 hunks)
  • Projects/Presentation/Sources/Login/View/Component/SocialLoginButton.swift (1 hunks)
  • Projects/Presentation/Sources/Login/View/Component/TermsAgreementItemView.swift (1 hunks)
  • Projects/Presentation/Sources/Login/View/Component/TotalAgreementButton.swift (1 hunks)
  • Projects/Presentation/Sources/Login/View/IntroView.swift (1 hunks)
  • Projects/Presentation/Sources/Login/View/LoginView.swift (1 hunks)
  • Projects/Presentation/Sources/Login/View/TermsAgreementView.swift (1 hunks)
  • Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift (1 hunks)
  • Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift (1 hunks)
  • Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift (1 hunks)
  • Projects/Presentation/Sources/Protocol/BaseViewController.swift (0 hunks)
  • Projects/Presentation/Sources/Protocol/ViewModel.swift (0 hunks)
  • Projects/Shared/Sources/DIContainer/DIContainer.swift (0 hunks)
  • Projects/Shared/Sources/DIContainer/DependencyAssemblerProtocol.swift (0 hunks)
💤 Files with no reviewable changes (13)
  • Projects/Domain/Sources/DomainDependencyAssembler.swift
  • Projects/Shared/Sources/DIContainer/DIContainer.swift
  • Projects/Presentation/Sources/Common/PresentationDependencyAssembler.swift
  • Projects/Domain/Sources/UseCase/Auth/LogoutUseCase.swift
  • Projects/NetworkService/Sources/NetworkDependencyAssembler.swift
  • Projects/Presentation/Sources/Protocol/ViewModel.swift
  • Projects/Persistence/Sources/PersistenceDependencyAssembler.swift
  • Projects/Shared/Sources/DIContainer/DependencyAssemblerProtocol.swift
  • Projects/Domain/Sources/UseCase/Onboarding/OnboardingUseCase.swift
  • Projects/Presentation/Sources/Protocol/BaseViewController.swift
  • Projects/Domain/Sources/UseCase/Auth/WithdrawUseCase.swift
  • Projects/NetworkService/Sources/NetworkError.swift
  • Projects/Domain/Sources/UseCase/Auth/LoginUseCase.swift
🧰 Additional context used
🧠 Learnings (9)
📓 Common learnings
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로 해결하도록 수정할 계획을 가지고 있음.
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 함수에서 에러 처리 개선을 추후 고민하고 반영할 계획을 가지고 있음.
Projects/Presentation/Sources/Login/View/IntroView.swift (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 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Login/View/LoginView.swift (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 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Home/HomeViewController.swift (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 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Login/View/TermsAgreementView.swift (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 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift (3)
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#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()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
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()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift (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 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift (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 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
Projects/Presentation/Sources/Common/TabBarView.swift (3)
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()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
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()를 호출하면 이 메서드들이 자동으로 호출된다. 따라서 하위 클래스에서 추가로 호출할 필요가 없다.
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 호출하는 것이 적절한 이유: 사용자가 이전 페이지에서 온보딩 선택지를 변경한 후 돌아올 때 새로운 선택지로 다시 등록해야 하기 때문. 홈 뷰에서는 이 뷰로 돌아올 수 없어서 중복 호출 문제가 발생하지 않음.
🪛 SwiftLint (0.57.0)
Projects/Presentation/Sources/Common/TabBarView.swift

[Warning] 75-75: TODOs should be resolved (- 홈, 추천, 마이페이지 생성 후 지워주세요)

(todo)

🔇 Additional comments (24)
Projects/Presentation/Sources/Onboarding/View/OnboardingView.swift (1)

8-10: import 순서 변경 문제없음

UIKit을 하위 모듈 import 뒤로 이동한 변경은 프로젝트 전반의 컨벤션 통일을 위한 것으로 보이며, 기능상 영향이 없습니다.

Projects/App/Sources/SceneDelegate.swift (1)

11-11: UIKit import 순서 변경 확인 – 문제 없음

팀 코드 컨벤션에 맞춘 import 재정렬으로 보이며, 컴파일·동작에 영향 없습니다.

Projects/Presentation/Sources/Login/Model/TermsType.swift (1)

9-9: import 순서 정리 👍

DomainFoundation 순으로 통일하여 모듈 계층 구조가 더 명확해졌습니다.

Projects/Presentation/Sources/Login/View/IntroView.swift (1)

8-11: Shared → UIKit 순서 변경으로 일관성 확보

다른 파일들과 동일한 규칙(외부 모듈 → Apple 프레임워크) 적용이 확인되었습니다.

Projects/Presentation/Sources/Onboarding/View/OnboardingRecommendedRoutineView.swift (1)

11-11: UIKit import 위치 조정 확인

가독성 향상을 위한 정리로, 추가적인 이슈는 없습니다.

Projects/Presentation/Sources/Login/View/LoginView.swift (1)

13-13: 불필요한 변경 없음 – import 순서 정리 👍
UIKit 위치만 변경되었으며, 기능적 영향 없음.

Projects/App/Sources/AppDelegate.swift (1)

10-10: 가독성 향상을 위한 import 재배치 확인
UIKit을 하위로 이동한 변경 사항 문제 없습니다.

Projects/Presentation/Sources/Onboarding/View/OnboardingResultView.swift (1)

10-10: import 순서 재정렬 OK
의미-있는 로직 변경은 없으므로 그대로 진행해도 됩니다.

Projects/Presentation/Sources/Home/HomeViewController.swift (1)

8-12: import 순서/불필요한 Foundation 제거 확인
정리된 import 구문이 컨벤션에 부합합니다.

Projects/Persistence/Sources/Keychain/KeychainStorage.swift (1)

9-9: import 위치 변경 문제 없음
Foundation을 뒤로 이동한 변경이 다른 코드에 영향 주지 않습니다.

Projects/Presentation/Sources/Login/View/Component/TotalAgreementButton.swift (1)

8-9: UIKit 임포트 위치 변경 OK

프로젝트 전반에서 동일한 임포트 순서 규칙을 적용하고 있으므로 일관성 확보 측면에서 👍🏻
추가로, 설정된 SwiftLint 규칙(예: sorted_imports)과 충돌이 없는지만 한 번 더 확인 부탁드립니다.

Projects/Presentation/Sources/Login/View/Component/SocialLoginButton.swift (1)

8-9: 임포트 정렬 변경 문제없음

기능 변화 없고 컨벤션만 수정된 것으로 보입니다. 🚀

Projects/App/Sources/DependencyInjection.swift (1)

8-14: import 순서 변경 👍

Foundation 을 도메인 계층 이후로 내린 것은 프로젝트 전반에서 합의된 컨벤션( Domain → Foundation → Infra … )과 일관됩니다. 별다른 사이드-이펙트나 컴파일 경고가 발생하지 않는다면 그대로 유지하셔도 무방합니다.

Projects/Presentation/Resources/Images.xcassets/recommend_empty_icon.imageset/Contents.json (1)

1-23: 이미지 세트 추가 확인 완료

파일 구조, scale 별 변형, 메타데이터 모두 정상입니다.

Projects/Presentation/Resources/Images.xcassets/report_fill_icon.imageset/Contents.json (1)

1-23: 리소스 정의 무난

특이사항 없습니다. TabBarView에서 정상적으로 매핑되는지만 한번 더 빌드 확인 부탁드립니다.

Projects/Presentation/Resources/Images.xcassets/home_empty_icon.imageset/Contents.json (1)

1-23: home_empty_icon 세트 이상 무

구조 및 메타데이터 이상 없습니다.

Projects/Presentation/Resources/Images.xcassets/mypage_fill_icon.imageset/Contents.json (1)

1-23: Contents.json 내부 filename 언더스코어 제거 불필요

Contents.json의 filename 필드는 에셋 카탈로그 내 리소스 파일명을 Xcode에 알려주는 용도이며, 런타임에 UIImage(named:)는 에셋 폴더명(mypage_fill_icon)을 기준으로 이미지를 로딩합니다. 따라서 내부 PNG 파일명에 _mypage 언더스코어가 포함되어 있어도 이미지 로딩에는 문제가 없습니다.

Likely an incorrect or invalid review comment.

Projects/Presentation/Resources/Images.xcassets/recommend_fill_icon.imageset/Contents.json (1)

1-23: 아이콘 리소스 추가 확인 완료
구조와 메타데이터가 Xcode 기본 포맷을 정확히 따르고 있습니다. 별다른 이슈 없습니다.

Projects/Presentation/Resources/Images.xcassets/home_fill_icon.imageset/Contents.json (1)

1-23: 아이콘 리소스 추가 확인 완료
파일명·스케일·idiom 설정 모두 정상입니다.

Projects/Presentation/Resources/Images.xcassets/report_empty_icon.imageset/Contents.json (1)

1-23: 아이콘 리소스 추가 확인 완료
문제 될 만한 부분이 없습니다.

Projects/Presentation/Sources/Common/DesignSystem/BitnagilIcon.swift (1)

18-30: 옵셔널 UIImage 전달 시 크래시 위험 없음 확인 필요
현재 BitnagilIcon의 아이콘들은

  • UIImage(named: …)? 로 안전하게 optional chaining 처리되고
  • UITabBarItem(title:image:selectedImage:)UIImage? 파라미터를 허용하므로
    이미지가 nil 이더라도 런타임 크래시는 발생하지 않습니다.
    따라서 제안된 guard let 도입은 필수적이지 않습니다.

다만, 다음 부분은 한 번 더 검토해 주세요:

  • home/recommend/mypage 아이콘은 시스템 Tint 사용, report 아이콘만 .alwaysOriginal 로 설정된 의도
  • (선택) SwiftGen 등 타입-세이프 자산 관리 도입 검토

Likely an incorrect or invalid review comment.

Projects/Presentation/Sources/Common/TabBarView.swift (3)

11-16: 클래스 선언과 초기화 로직이 올바르게 구현되었습니다.

final public classsuper.viewDidLoad() 호출이 적절하고, 설정 로직을 별도 메서드로 분리한 것도 좋은 구조입니다.


18-40: 탭바 외관 설정이 체계적으로 잘 구현되었습니다.

UITabBarAppearance를 사용한 모던한 스타일링과 커스텀 컬러/폰트 적용, 그리고 nil 병합 연산자를 통한 안전한 fallback 처리가 잘 되어있습니다.


41-72: 탭바 아이템 구성과 뷰 컨트롤러 설정이 올바르게 구현되었습니다.

네비게이션 컨트롤러로 감싸는 것과 selected/unselected 이미지 설정이 적절합니다. 현재 플레이스홀더 뷰들은 실제 구현이 완료되면 교체될 예정이므로 임시적인 구현으로 적절합니다.

Comment on lines +1 to +20
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x68",
"green" : "0x68",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

Color components 값 형식 오류 – 0xFF, 0x68 사용은 Xcode 빌드 실패 야기

Asset-catalog JSON 의 components 값은 0~1 사이 소수 문자열이어야 합니다.
0xFF, 0x68 처럼 16진 문자열을 넣으면 actool 단계에서 오류가 발생합니다.

아래 패치처럼 255 로 나눈 실수값으로 교체해 주세요.

-          "blue" : "0x68",
-          "green" : "0x68",
-          "red" : "0xFF"
+          "blue" : "0.408",
+          "green" : "0.408",
+          "red" : "1.000"
📝 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
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x68",
"green" : "0x68",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.408",
"green" : "0.408",
"red" : "1.000"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
🤖 Prompt for AI Agents
In Projects/Presentation/Resources/Colors.xcassets/Error.colorset/Contents.json
lines 1 to 20, the color component values use hexadecimal strings like "0xFF"
and "0x68" which cause Xcode build failures. Replace these hex strings with
decimal string values representing the component as a fraction between 0 and 1
by dividing the hex value by 255 (e.g., "0xFF" becomes "1.0" and "0x68" becomes
approximately "0.4078").

Comment on lines +1 to +20
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xF7",
"red" : "0xF0"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

Color components 형식 오류 – 16진 문자열 사용

여기도 동일한 형식 오류가 있습니다. 실수값으로 교체해야 합니다.

-          "blue" : "0xFF",
-          "green" : "0xF7",
-          "red" : "0xF0"
+          "blue" : "1.000",
+          "green" : "0.969",
+          "red" : "0.941"
📝 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
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFF",
"green" : "0xF7",
"red" : "0xF0"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "0.969",
"red" : "0.941"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
🤖 Prompt for AI Agents
In
Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientRight.colorset/Contents.json
lines 1 to 20, the color component values for red, green, and blue are
incorrectly specified as hexadecimal strings like "0xFF". Replace these hex
string values with their equivalent decimal float values between 0 and 1 (e.g.,
"1.0" for 0xFF) to conform to the expected format.

Comment on lines +1 to +20
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xDF",
"green" : "0xEA",
"red" : "0xFF"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

Color components 형식 오류 – 16진 문자열 사용

마찬가지로 값 변환이 필요합니다.

-          "blue" : "0xDF",
-          "green" : "0xEA",
-          "red" : "0xFF"
+          "blue" : "0.875",
+          "green" : "0.918",
+          "red" : "1.000"
🤖 Prompt for AI Agents
In
Projects/Presentation/Resources/Colors.xcassets/Gradient/HomeGradientLeft.colorset/Contents.json
lines 1 to 20, the color component values for red, green, and blue are
incorrectly formatted as hexadecimal strings (e.g., "0xFF"). These should be
converted to decimal strings representing normalized float values between 0 and
1 (e.g., "1.000" for full intensity). Update each color component value
accordingly to fix the format error.

Comment thread Projects/Presentation/Sources/Common/DesignSystem/BitnagilColor.swift Outdated
@choijungp
choijungp merged commit 2607010 into develop Jul 17, 2025
2 checks passed
@choijungp
choijungp deleted the feat/tab-view branch July 17, 2025 06:10
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