Skip to content

๐Ÿ”ง :: SwiftLint ๊ฒฝ๊ณ  ์ •๋ฆฌ ๋ฐ Completable dead-code ๋ฒ„๊ทธ ์ˆ˜์ •#445

Merged
leejh08 merged 2 commits into
mainfrom
feature/(#439)-swiftlint_warning_cleanup
Jun 25, 2026
Merged

๐Ÿ”ง :: SwiftLint ๊ฒฝ๊ณ  ์ •๋ฆฌ ๋ฐ Completable dead-code ๋ฒ„๊ทธ ์ˆ˜์ •#445
leejh08 merged 2 commits into
mainfrom
feature/(#439)-swiftlint_warning_cleanup

Conversation

@leejh08

@leejh08 leejh08 commented Jun 25, 2026

Copy link
Copy Markdown
Member

Summary

  • Completable.asObservable().flatMap/.map ํŒจํ„ด์œผ๋กœ ์ธํ•ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ dead-code๋กœ ํŒ๋‹จํ•˜๋˜ 11๊ฐœ Reactor์˜ RxSwift ์ฝ”๋“œ๋ฅผ Completable.andThen(...)์œผ๋กœ ๊ต์ฒด (์‹ค์ œ ๊ธฐ๋Šฅ ๋ฒ„๊ทธ 5๊ฑด ํฌํ•จ, ๋‚˜๋จธ์ง€๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋ฌดํ•ดํ–ˆ์œผ๋‚˜ ์ฝ”๋“œ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ์ •๋ฆฌ)
  • force_unwrapping, closure_parameter_position ๋“ฑ ๊ธฐ์กด SwiftLint ๊ฒฝ๊ณ  ์ •๋ฆฌ (35๊ฐœ ํŒŒ์ผ)
  • MainPresentationAssembly์˜ ์‚ฌ์ „ ์กด์žฌํ•˜๋˜ function_body_length/type_body_length ์œ„๋ฐ˜์€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ(๋ณ„๋„ ์ž‘์—… ๋ฒ”์œ„) ์—†์ด disable ์ฃผ์„์œผ๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ

Test plan

  • swiftlint lint๋กœ ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์— error ๋“ฑ๊ธ‰ ์œ„๋ฐ˜ ์—†์Œ ํ™•์ธ
  • pre-commit ํ›…(SwiftLint) ํ†ต๊ณผ ํ™•์ธ
  • CI ๋นŒ๋“œ ํ†ต๊ณผ ํ™•์ธ

Summary by CodeRabbit

  • New Features

    • Bug report ๋ชฉ๋ก ํ™”๋ฉด ๊ด€๋ จ ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด, ๊ด€๋ จ ํ™”๋ฉด ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.
  • Bug Fixes

    • ์•Œ๋ฆผ ์ฝ์Œ ์ฒ˜๋ฆฌ, ๋ถ๋งˆํฌ, ๊ด€์‹ฌ ๋ถ„์•ผ ์„ ํƒ, ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ๋“ฑ ์ผ๋ถ€ ์ž‘์—…์˜ ์ฒ˜๋ฆฌ ํ๋ฆ„์ด ๋” ์•ˆ์ •์ ์œผ๋กœ ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ง€์›ํ•˜๊ธฐ ๋ฒ„ํŠผ์˜ ํ‘œ์‹œ ๋ฌธ๊ตฌ๊ฐ€ ์ƒํƒœ์— ๋”ฐ๋ผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ฐ”๋€๋‹ˆ๋‹ค.
    • ์ตœ๊ทผ ํšŒ์‚ฌ, ์ฑ„์šฉ, ๋งˆ์ดํŽ˜์ด์ง€ ๋“ฑ ์—ฌ๋Ÿฌ ํ™”๋ฉด์˜ UI/๋™์ž‘์ด ์œ ์ง€๋œ ์ฑ„ ์„ธ๋ถ€ ํ๋ฆ„์ด ์ •๋ˆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Style

    • ์ „๋ฐ˜์ ์ธ ์ฝ”๋“œ ํฌ๋งท๊ณผ ๊ณต๋ฐฑ์ด ์ •๋ฆฌ๋˜์–ด ๊ฐ€๋…์„ฑ์ด ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

leejh08 and others added 2 commits June 25, 2026 14:06
Completable.asObservable()์€ Observable<Never>๊ฐ€ ๋˜์–ด .next ์ด๋ฒคํŠธ๊ฐ€
์ ˆ๋Œ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ด๋ฅผ .flatMap/.map์œผ๋กœ ๋ฐ›์•„ Mutation์„
๋งŒ๋“ค๋˜ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ณด์žฅํ•˜๋Š” dead code์˜€์Œ. RxSwift ํ‘œ์ค€ ํŒจํ„ด์ธ
Completable.andThen(Observable<Element>)์œผ๋กœ ๊ต์ฒด.

- ์‹ค์ œ ๋™์ž‘ ๋ฒ„๊ทธ ์ˆ˜์ •: AlarmReactor(์ฝ์Œ ์ฒ˜๋ฆฌ), MyPageReactor(ํ”„๋กœํ•„
  ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ), BugReportReactor(์ œ์ถœ ์™„๋ฃŒ), NotificationSettingReactor
  (์•Œ๋ฆผ ํ† ๊ธ€) โ€” API ์„ฑ๊ณต ํ›„ ์˜๋„ํ•œ Mutation์ด ๋ฐœ์ƒํ•˜๋„๋ก ์ˆ˜์ •
- ๋ฌดํ•ดํ•˜์ง€๋งŒ ์˜คํ•ด๋ฅผ ๋ถ€๋ฅด๋˜ dead code ์ •๋ฆฌ: InterestFieldReactor,
  OnboardingReactor, RecruitmentReactor, RecruitmentDetailReactor,
  SearchRecruitmentReactor, WinterInternReactor, WinterInternDetailReactor

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
force_unwrapping, closure_parameter_position ๋“ฑ ๊ธฐ์กด SwiftLint ๊ฒฝ๊ณ ๋ฅผ
์ •๋ฆฌํ•˜๊ณ , MainPresentationAssembly์˜ ์‚ฌ์ „ ์กด์žฌํ•˜๋˜ function_body_length/
type_body_length ์œ„๋ฐ˜์€ ๊ตฌ์กฐ ๋ณ€๊ฒฝ(๋ณ„๋„ ์ž‘์—… ๋ฒ”์œ„) ์—†์ด disable ์ฃผ์„์œผ๋กœ
๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ.
@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ ๋ชฉ๋ก ํ™”๋ฉด์˜ ๊ณต๊ฐœ ํƒ€์ž… ์„ ์–ธ์ด ๋ณต์›๋˜๊ณ , ์—ฌ๋Ÿฌ Flow/DI ์„ ์–ธ๊ณผ ํ™”๋ฉด ์ปดํฌ๋„ŒํŠธ์˜ ์ค„๋ฐ”๊ฟˆยท๊ณต๋ฐฑยทํด๋กœ์ € ํ‘œ๊ธฐ๊ฐ€ ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ Reactor๋Š” ์œ ์Šค์ผ€์ด์Šค ์™„๋ฃŒ ํ›„ Mutation ๋ฐฉ์ถœ ๋ฐฉ์‹์„ andThen ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ”๊ฟจ๊ณ , ์ผ๋ถ€ ํ™”๋ฉด์˜ ํ‘œ์‹œ ๋ถ„๊ธฐ์™€ ์„ ํƒ ๋กœ์ง๋„ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Changes

๋ฒ„๊ทธ ๋ฆฌํฌํŠธ ํ™”๋ฉด ๋ณต์›

Layer / File(s) Summary
๋ชฉ๋ก ํƒ€์ž…๊ณผ ์ง€์› ํŒŒ์ผ
Projects/Flow/Sources/MyPage/BugReport/BugReportListFlow.swift, Projects/Presentation/Sources/BugList/BugReportListViewController.swift, Projects/Presentation/Sources/BugList/BugReportListViewModel.swift, Projects/Presentation/Sources/BugList/Component/Cell/BugReportListTableViewCell.swift
BugReportListFlow์™€ BugReportListViewController๊ฐ€ ์ปดํŒŒ์ผ๋˜๋Š” ๊ณต๊ฐœ ํƒ€์ž…์œผ๋กœ ๋ณต์›๋˜๊ณ , ๊ด€๋ จ ์ง€์› ํŒŒ์ผ์˜ ์ฃผ์„๊ณผ ๊ณต๋ฐฑ๋งŒ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์™„๋ฃŒ ๋ณ€์ด ์ฒด์ธ
Projects/Presentation/Sources/BugReport/BugReportReactor.swift
bugReportButtonDidTap์—์„œ reportBugUseCase.execute(...) ๋’ค ์™„๋ฃŒ Mutation์„ andThen(.just(.setBugReportCompleted))๋กœ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์•กํ‹ฐ๋ธŒ ์™„๋ฃŒ ์ฒด์ด๋‹ ์ •๋ฆฌ

Layer / File(s) Summary
์ผ๋ฐ˜ ์™„๋ฃŒ ์ฒ˜๋ฆฌ
Projects/Presentation/Sources/Home/Alarm/AlarmReactor.swift, Projects/Presentation/Sources/InterestField/InterestFieldReactor.swift, Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift, Projects/Presentation/Sources/Onboarding/OnboardingReactor.swift, Projects/Presentation/Sources/Recruitment/RecruitmentReactor.swift, Projects/Presentation/Sources/RecruitmentDetail/RecruitmentDetailReactor.swift, Projects/Presentation/Sources/SearchRecruitment/SearchRecruitmentReactor.swift, Projects/Presentation/Sources/WinterIntern/WinterInternReactor.swift, Projects/Presentation/Sources/WinterInternDetail/WinterInternDetailReactor.swift
์—ฌ๋Ÿฌ Reactor์˜ ์™„๋ฃŒ ๋’ค ๋ณ€์ด ์ฒ˜๋ฆฌ์™€ ๋นˆ ์ŠคํŠธ๋ฆผ ์ข…๋ฃŒ๊ฐ€ andThen ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์‹œํ€€์Šค
Projects/Presentation/Sources/MyPage/MyPageReactor.swift
profileImageSelected์—์„œ ์—…๋กœ๋“œ์™€ ๋ณ€๊ฒฝ ์ž‘์—…์ด Completable.zip์œผ๋กœ ๋ฌถ์ด๊ณ , ์ดํ›„ ๋ณ€์ด ํ๋ฆ„์ด Observable.concat์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

Flow/DI์™€ ํ™”๋ฉด ์„œ์‹ ์ •๋ฆฌ

Layer / File(s) Summary
Flow์™€ DI ์—ฐ๊ฒฐ
Projects/Domain/Sources/Entities/RecentCompany/RecentCompanyEntity.swift, Projects/Domain/Sources/UseCases/Companies/FetchRecentCompanyListUseCase.swift, Projects/Flow/Sources/Home/HomeFlow.swift, Projects/Flow/Sources/Recruitment/RecruitmentFlow.swift, Projects/Flow/Sources/Signup/*.swift, Projects/Flow/Sources/WinterIntern/*.swift, Projects/Presentation/Sources/DI/Assembly/*.swift
RecentCompanyEntity์™€ FetchRecentCompanyListUseCase๋Š” ๊ณต๋ฐฑ๋งŒ ์กฐ์ •๋˜๊ณ , ์—ฌ๋Ÿฌ Flow ์ดˆ๊ธฐํ™”/๋„ค๋น„๊ฒŒ์ด์…˜ ํด๋กœ์ €์™€ DI ๋“ฑ๋ก ํด๋กœ์ €๊ฐ€ ์—ฌ๋Ÿฌ ์ค„ ํฌ๋งท์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ™”๋ฉด ์ƒํƒœ์™€ ์žฌ์‚ฌ์šฉ ๋ทฐ
Projects/Presentation/Sources/Company/CompanyViewController.swift, Projects/Presentation/Sources/EasterEgg/EasterEggViewController.swift, Projects/Modules/DesignSystem/Sources/Dropdown/JobisDropdownView.swift, Projects/Presentation/Sources/Base/BaseCollectionViewCell.swift, Projects/Presentation/Sources/Home/..., Projects/Presentation/Sources/InterestField/..., Projects/Presentation/Sources/Recruitment/..., Projects/Presentation/Sources/RecruitmentDetail/..., Projects/Presentation/Sources/WinterInternDetail/..., Projects/Presentation/Sources/ReviewFilter/..., Projects/Presentation/Sources/Signup/VerifyEmail/VerifyEmailReactor.swift
์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ํ‘œ์‹œ ๋ถ„๊ธฐ, ์„ ํƒ ์ƒํƒœ, ์ƒ๋ช…์ฃผ๊ธฐ, ์‹œ๊ทธ๋‹ˆ์ฒ˜, and ๊ณต๋ฐฑ๋งŒ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
WritableReview ์ปดํฌ๋„ŒํŠธ
Projects/Presentation/Sources/MyPage/Components/BookmarkSectionView.swift, Projects/Presentation/Sources/WritableReview/AddQuestion/AddQuestionViewModel.swift, Projects/Presentation/Sources/WritableReview/AddReview/AddReviewViewController.swift, Projects/Presentation/Sources/WritableReview/BottomSheet/Component/*.swift
BookmarkSectionView์™€ WritableReview ํ™”๋ฉด๋“ค์€ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ช…, ์ปฌ๋ ‰์…˜๋ทฐ ์‹œ๊ทธ๋‹ˆ์ฒ˜, ์„ ํƒ ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๊ณต๋ฐฑ๋งŒ ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Estimated code review effort

๐ŸŽฏ 4 (Complex) | โฑ๏ธ ~60 minutes

Possibly related PRs

  • Team-return/JOBIS-DSM-iOS-v2#376: Projects/Presentation/Sources/MyPage/MyPageReactor.swift์˜ profileImageSelected Rx ์‹œํ€€์‹ฑ ๋ณ€๊ฒฝ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ์˜์—ญ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
  • Team-return/JOBIS-DSM-iOS-v2#380: Projects/Presentation/Sources/BugReport/BugReportReactor.swift์˜ ์™„๋ฃŒ Mutation ์ฒด์ธ ๋ณ€๊ฒฝ๊ณผ ์ง์ ‘ ๊ฐ™์€ ๋ฆฌ์•กํ„ฐ ์˜์—ญ์— ์žˆ์Šต๋‹ˆ๋‹ค.

Suggested reviewers

  • circle0802

Poem

(_/)
(โ€ขใ……โ€ข) ํ† ๋ผ๊ฐ€ ๊นก์ถฉ, andThen์„ ๋ฐŸ๊ณ ,
/ใฅ ๋ฝ€์–€ ๊ตด ์†์— ํ๋ฆ„์„ ์ •๋ฆฌํ–ˆ๋„ค.
๋ฒ„๊ทธ ๋ฆฌํฌํŠธ๋Š” ๋‹ค์‹œ ๋ฌธ์„ ์—ด๊ณ ,
์ž‘์€ ํ™”๋ฉด๋“ค๋งˆ๋‹ค ๋ณ„๋น›์ด ๋ฐ˜์ง์ด๋„ค. โœจ

๐Ÿšฅ Pre-merge checks | โœ… 4 | โŒ 1

โŒ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage โš ๏ธ Warning Docstring coverage is 2.17% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
โœ… Passed checks (4 passed)
Check name Status Explanation
Description Check โœ… Passed Check skipped - CodeRabbitโ€™s high-level summary is enabled.
Title check โœ… Passed SwiftLint ๊ฒฝ๊ณ  ์ •๋ฆฌ์™€ Completable ์ฒด์ธ dead-code ์ˆ˜์ •์ด๋ผ๋Š” ์‹ค์ œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž˜ ์š”์•ฝํ•œ ์ œ๋ชฉ์ž…๋‹ˆ๋‹ค.
Linked Issues check โœ… Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check โœ… Passed Check skipped because no linked issues were found for this pull request.

โœ๏ธ Tip: You can configure your own custom pre-merge checks in the settings.

โœจ Finishing Touches
๐Ÿ“ Generate docstrings
  • Create stacked PR
  • Commit on current branch
๐Ÿงช Generate unit tests (beta)

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

Comment @coderabbitai help to get the list of available commands.

@leejh08 leejh08 self-assigned this Jun 25, 2026
@leejh08 leejh08 added โ™ป๏ธrefactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ํ•  ๊ฒฝ์šฐ โšก๏ธperformance ์„ฑ๋Šฅ์„ ๊ฐœ์„  ํ•  ๊ฒฝ์šฐ labels Jun 25, 2026

@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: 1

๐Ÿงน Nitpick comments (2)
Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift (1)

78-83: ๐Ÿฉบ Stability & Availability | ๐Ÿ”ต Trivial

ํ† ๊ธ€ ์•ก์…˜์— ์—๋Ÿฌ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€ ๊ถŒ์žฅ

SubscribeNotificationUseCase ์™€ SubscribeAllNotificationUseCase ๋Š” Completable ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ํ˜„์žฌ .andThen(.just(...)) ์ฒด์ธ์—๋Š” ์—๋Ÿฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋ˆ„๋ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹คํŒจ ์‹œ ์ŠคํŠธ๋ฆผ์ด ์—๋Ÿฌ ์ƒํƒœ๋กœ ์ข…๋ฃŒ๋˜์–ด ํ† ๊ธ€ ๊ธฐ๋Šฅ ์ž์ฒด๋ฅผ ์ด์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹คํŒจ ์‹œ ์ ์ ˆํ•œ ์ƒํƒœ ๋ณต์›์ด๋‚˜ ์—๋Ÿฌ ์•Œ๋ฆผ์„ ์œ„ํ•ด catch ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ์ฝ”๋“œ
            .andThen(.just(.toggleNotificationState(notificationType)))

        case .toggleAllNotifications:
            let newState = !currentState.isAllNotificationEnabled
            return subscribeAllNotificationUseCase.execute()
                .andThen(.just(.setAllNotificationStates(newState)))
๐Ÿค– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift`
around lines 78 - 83, `NotificationSettingReactor`์˜ `toggleNotificationState`์™€
`toggleAllNotifications` ๋ถ„๊ธฐ์—์„œ
`SubscribeNotificationUseCase`/`SubscribeAllNotificationUseCase`์˜ `Completable`
์‹คํŒจ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ „ํŒŒ๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•˜์„ธ์š”. ๊ฐ `execute()` ๋’ค์˜ `.andThen(.just(...))` ์ฒด์ธ์— `catch`๋ฅผ ์ถ”๊ฐ€ํ•ด
์—๋Ÿฌ๋ฅผ ํก์ˆ˜ํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด `currentState`๋กœ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ ์•Œ๋ฆผ์šฉ Action์œผ๋กœ ์ „ํ™˜ํ•˜๋„๋ก
`NotificationSettingReactor` ๋‚ด๋ถ€ ํ๋ฆ„์„ ์ˆ˜์ •ํ•˜์„ธ์š”.
Projects/Presentation/Sources/Recruitment/RecruitmentReactor.swift (1)

101-105: ๐Ÿฉบ Stability & Availability | ๐Ÿ”ต Trivial

๋ถ๋งˆํฌ ์‹คํŒจ ์‹œ mutation ์ŠคํŠธ๋ฆผ ์ข…๋ฃŒ ์œ„ํ—˜์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

bookmarkUseCase.execute ๊ฐ€ Completable ์ด๋ฏ€๋กœ ๊ธฐ์กด flatMap { _ in .empty() } ์ฝ”๋“œ๋Š” dead-code ์˜€์œผ๋ฉฐ, .andThen(.empty()) ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์€ ์„ฑ๊ณต ๊ฒฝ๋กœ์˜ ๋™์ž‘๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด๋‹น ์ฝ”๋“œ๋Š” .catch ์ฒ˜๋ฆฌ๊ฐ€ ์—†์–ด, ๋ถ๋งˆํฌ ์‹คํŒจ ์‹œ ์ „์ฒด mutation ์ŠคํŠธ๋ฆผ์ด ์—๋Ÿฌ๋กœ ์ข…๋ฃŒ๋˜์–ด ์ดํ›„ ์•ก์…˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (RxSwift ๊ธฐ๋ฐ˜ ReactorKit ์˜ ๋™์ž‘ ๋ฐฉ์‹).

ํ˜„์žฌ RecruitmentDetailReactor (Line 73) ๋Š” .catch { _ in .empty() } ๋ฅผ ์ ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ํก์ˆ˜ํ•˜์ง€๋งŒ, RecruitmentReactor (Line 104), WinterInternReactor (Line 93), SearchRecruitmentReactor (Line 74) ๋Š” ์ด๋ฅผ ๋ˆ„๋ฝํ•˜๊ณ  ์žˆ์–ด ํŒจํ„ด์ด ๋ถˆ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ •๋ฆฌ PR ์ธ ๋งŒํผ ์ผ๊ด€๋œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

โ™ป๏ธ ์—๋Ÿฌ ๋ฌด์‹œ๊ฐ€ ์˜๋„๋ผ๋ฉด
-                bookmarkUseCase.execute(id: id).andThen(.empty())
+                bookmarkUseCase.execute(id: id)
+                    .andThen(.empty())
+                    .catch { _ in .empty() }
๐Ÿค– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Presentation/Sources/Recruitment/RecruitmentReactor.swift` around
lines 101 - 105, `RecruitmentReactor`โ€™s `.bookmarkButtonDidTap` mutation chain
can terminate the ReactorKit stream if `bookmarkUseCase.execute(id:)` fails
because it currently only uses `andThen(.empty())` without error handling.
Update the `bookmarkButtonDidTap` branch to absorb errors the same way as
`RecruitmentDetailReactor` by adding a `.catch { _ in .empty() }` after the
`Completable` chain, so a bookmark failure does not stop subsequent actions from
being processed. Keep the fix aligned with the existing bookmark handling
patterns used across the reactor implementations.
๐Ÿค– Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Projects/Presentation/Sources/MyPage/MyPageReactor.swift`:
- Around line 91-97: In MyPageReactorโ€™s profile image flow, the current
Completable.zip call runs uploadImageToS3UseCase.execute and
changeProfileImageUseCase.execute in parallel, so replace it with a sequential
chain that only invokes changeProfileImageUseCase after uploadImageToS3UseCase
completes successfully. Use the existing execute(url:) and
execute(presignedURL:data:) calls in MyPageReactor to preserve the intended
order and ensure the backend update happens only after the S3 upload is
confirmed.

---

Nitpick comments:
In
`@Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift`:
- Around line 78-83: `NotificationSettingReactor`์˜ `toggleNotificationState`์™€
`toggleAllNotifications` ๋ถ„๊ธฐ์—์„œ
`SubscribeNotificationUseCase`/`SubscribeAllNotificationUseCase`์˜ `Completable`
์‹คํŒจ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ „ํŒŒ๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•˜์„ธ์š”. ๊ฐ `execute()` ๋’ค์˜ `.andThen(.just(...))` ์ฒด์ธ์— `catch`๋ฅผ ์ถ”๊ฐ€ํ•ด
์—๋Ÿฌ๋ฅผ ํก์ˆ˜ํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด `currentState`๋กœ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ ์•Œ๋ฆผ์šฉ Action์œผ๋กœ ์ „ํ™˜ํ•˜๋„๋ก
`NotificationSettingReactor` ๋‚ด๋ถ€ ํ๋ฆ„์„ ์ˆ˜์ •ํ•˜์„ธ์š”.

In `@Projects/Presentation/Sources/Recruitment/RecruitmentReactor.swift`:
- Around line 101-105: `RecruitmentReactor`โ€™s `.bookmarkButtonDidTap` mutation
chain can terminate the ReactorKit stream if `bookmarkUseCase.execute(id:)`
fails because it currently only uses `andThen(.empty())` without error handling.
Update the `bookmarkButtonDidTap` branch to absorb errors the same way as
`RecruitmentDetailReactor` by adding a `.catch { _ in .empty() }` after the
`Completable` chain, so a bookmark failure does not stop subsequent actions from
being processed. Keep the fix aligned with the existing bookmark handling
patterns used across the reactor implementations.
๐Ÿช„ Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

โ„น๏ธ Review info
โš™๏ธ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3d8ed638-3bb7-4b9b-a140-5a795cd7bce2

๐Ÿ“ฅ Commits

Reviewing files that changed from the base of the PR and between 4e6f09d and e7cd66f.

๐Ÿ“’ Files selected for processing (46)
  • Projects/Domain/Sources/Entities/RecentCompany/RecentCompanyEntity.swift
  • Projects/Domain/Sources/UseCases/Companies/FetchRecentCompanyListUseCase.swift
  • Projects/Flow/Sources/Home/HomeFlow.swift
  • Projects/Flow/Sources/MyPage/BugReport/BugReportListFlow.swift
  • Projects/Flow/Sources/Recruitment/RecruitmentFlow.swift
  • Projects/Flow/Sources/Signup/GenderSettingFlow.swift
  • Projects/Flow/Sources/Signup/PrivacyFlow.swift
  • Projects/Flow/Sources/Signup/ProfileSettingFlow.swift
  • Projects/Flow/Sources/WinterIntern/WinterInternDetailFlow.swift
  • Projects/Flow/Sources/WinterIntern/WinterInternFlow.swift
  • Projects/Modules/DesignSystem/Sources/Dropdown/JobisDropdownView.swift
  • Projects/Presentation/Sources/Base/BaseCollectionViewCell.swift
  • Projects/Presentation/Sources/BugList/BugReportListViewController.swift
  • Projects/Presentation/Sources/BugList/BugReportListViewModel.swift
  • Projects/Presentation/Sources/BugList/Component/Cell/BugReportListTableViewCell.swift
  • Projects/Presentation/Sources/BugReport/BugReportReactor.swift
  • Projects/Presentation/Sources/Company/CompanyViewController.swift
  • Projects/Presentation/Sources/DI/Assembly/AuthPresentationAssembly.swift
  • Projects/Presentation/Sources/DI/Assembly/MainPresentationAssembly.swift
  • Projects/Presentation/Sources/EasterEgg/EasterEggViewController.swift
  • Projects/Presentation/Sources/Home/Alarm/AlarmReactor.swift
  • Projects/Presentation/Sources/Home/Components/Cell/RecentCompanyCollectionViewCell.swift
  • Projects/Presentation/Sources/Home/EmployStatus/Components/ClassCategory.swift
  • Projects/Presentation/Sources/InterestField/Components/Cell/MajorCollectionViewCell.swift
  • Projects/Presentation/Sources/InterestField/InterestFieldReactor.swift
  • Projects/Presentation/Sources/InterestField/InterestFieldViewController.swift
  • Projects/Presentation/Sources/MyPage/Components/BookmarkSectionView.swift
  • Projects/Presentation/Sources/MyPage/MyPageReactor.swift
  • Projects/Presentation/Sources/NotificationSetting/NotificationSettingReactor.swift
  • Projects/Presentation/Sources/Onboarding/OnboardingReactor.swift
  • Projects/Presentation/Sources/Recruitment/RecruitmentReactor.swift
  • Projects/Presentation/Sources/Recruitment/RecruitmentViewController.swift
  • Projects/Presentation/Sources/RecruitmentDetail/RecruitmentDetailReactor.swift
  • Projects/Presentation/Sources/RecruitmentDetail/RecruitmentDetailViewController.swift
  • Projects/Presentation/Sources/ReviewFilter/Cell/ReviewTechStackView.swift
  • Projects/Presentation/Sources/ReviewFilter/ReviewFilterViewController.swift
  • Projects/Presentation/Sources/SearchRecruitment/SearchRecruitmentReactor.swift
  • Projects/Presentation/Sources/Signup/VerifyEmail/VerifyEmailReactor.swift
  • Projects/Presentation/Sources/WinterIntern/WinterInternReactor.swift
  • Projects/Presentation/Sources/WinterInternDetail/WinterInternDetailReactor.swift
  • Projects/Presentation/Sources/WinterInternDetail/WinterInternDetailViewController.swift
  • Projects/Presentation/Sources/WritableReview/AddQuestion/AddQuestionViewModel.swift
  • Projects/Presentation/Sources/WritableReview/AddReview/AddReviewViewController.swift
  • Projects/Presentation/Sources/WritableReview/BottomSheet/Component/AddReviewView.swift
  • Projects/Presentation/Sources/WritableReview/BottomSheet/Component/AreaReviewView.swift
  • Projects/Presentation/Sources/WritableReview/BottomSheet/Component/TechCodeStackView.swift
๐Ÿ’ค Files with no reviewable changes (5)
  • Projects/Presentation/Sources/MyPage/Components/BookmarkSectionView.swift
  • Projects/Presentation/Sources/WritableReview/AddReview/AddReviewViewController.swift
  • Projects/Presentation/Sources/Base/BaseCollectionViewCell.swift
  • Projects/Presentation/Sources/Company/CompanyViewController.swift
  • Projects/Presentation/Sources/EasterEgg/EasterEggViewController.swift

Comment on lines +91 to 97
return Completable.zip(
self.uploadImageToS3UseCase.execute(
presignedURL: url.presignedUrl,
data: file.file
)
.asObservable(),
),
self.changeProfileImageUseCase.execute(url: url.filePath)
.asObservable()
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๐Ÿ—„๏ธ Data Integrity & Integration | ๐ŸŸ  Major

S3 ์—…๋กœ๋“œ ์™„๋ฃŒ ํ›„ ํ”„๋กœํ•„ URL ๋ณ€๊ฒฝ ๋กœ์ง์˜ ์ˆœ์„œ ๋ณด์žฅ ํ•„์š”

Completable.zip ์€ ๋‘ ์•„์‹œ์•ˆ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, S3 ์—…๋กœ๋“œ๊ฐ€ ์™„์ „ํžˆ ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ๋ฐฑ์—”๋“œ ํ”„๋กœํ•„ ๋ณ€๊ฒฝ ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ƒ์„ฑ๋œ URL ์ด ์‹คํŒจ ์ƒํƒœ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

uploadImageToS3UseCase ์˜ ์„ฑ๊ณต์ด ํ™•์ •๋œ ํ›„ changeProfileImageUseCase ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ˆœ์ฐจ์  ์ฒด์ด๋‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ ์ˆ˜์ •
-                return Completable.zip(
-                    self.uploadImageToS3UseCase.execute(
-                        presignedURL: url.presignedUrl,
-                        data: file.file
-                    ),
-                    self.changeProfileImageUseCase.execute(url: url.filePath)
-                )
+                return self.uploadImageToS3UseCase.execute(
+                    presignedURL: url.presignedUrl,
+                    data: file.file
+                )
+                .andThen(self.changeProfileImageUseCase.execute(url: url.filePath))
                 .andThen(Observable.concat([
๐Ÿ“ 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
return Completable.zip(
self.uploadImageToS3UseCase.execute(
presignedURL: url.presignedUrl,
data: file.file
)
.asObservable(),
),
self.changeProfileImageUseCase.execute(url: url.filePath)
.asObservable()
)
return self.uploadImageToS3UseCase.execute(
presignedURL: url.presignedUrl,
data: file.file
)
.andThen(self.changeProfileImageUseCase.execute(url: url.filePath))
.andThen(Observable.concat([
๐Ÿค– Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Presentation/Sources/MyPage/MyPageReactor.swift` around lines 91 -
97, In MyPageReactorโ€™s profile image flow, the current Completable.zip call runs
uploadImageToS3UseCase.execute and changeProfileImageUseCase.execute in
parallel, so replace it with a sequential chain that only invokes
changeProfileImageUseCase after uploadImageToS3UseCase completes successfully.
Use the existing execute(url:) and execute(presignedURL:data:) calls in
MyPageReactor to preserve the intended order and ensure the backend update
happens only after the S3 upload is confirmed.

@leejh08 leejh08 merged commit 1eecbdf into main Jun 25, 2026
3 checks passed
@leejh08 leejh08 deleted the feature/(#439)-swiftlint_warning_cleanup branch June 25, 2026 15:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

โšก๏ธperformance ์„ฑ๋Šฅ์„ ๊ฐœ์„  ํ•  ๊ฒฝ์šฐ โ™ป๏ธrefactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ํ•  ๊ฒฝ์šฐ

Projects

None yet

Development

Successfully merging this pull request may close these issues.

SwiftLint ๊ฒฝ๊ณ  160๊ฑด ์ด์ƒ ์ •๋ฆฌ

1 participant