Skip to content

[#146] 뷰모델의 State 구조체가 Equatable을 채택하도록 개선한다#174

Merged
opficdev merged 1 commit intodevelopfrom
refactor/#146-Equatable
Mar 3, 2026
Merged

[#146] 뷰모델의 State 구조체가 Equatable을 채택하도록 개선한다#174
opficdev merged 1 commit intodevelopfrom
refactor/#146-Equatable

Conversation

@opficdev
Copy link
Copy Markdown
Owner

@opficdev opficdev commented Mar 3, 2026

@opficdev opficdev self-assigned this Mar 3, 2026
@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 뷰모델의 State 구조체에 Equatable 프로토콜을 채택하고, 이를 통해 상태 업데이트 로직을 최적화하여 애플리케이션의 성능과 효율성을 향상시키는 것을 목표로 합니다. State의 실제 변경이 있을 때만 뷰가 갱신되도록 하여 불필요한 렌더링을 줄이고, 내부 관리 속성을 State에서 분리하여 더욱 명확한 상태 관리를 가능하게 합니다.

Highlights

  • Equatable 프로토콜 채택: 여러 뷰모델의 State 구조체와 TodoQuery 구조체에 Equatable 프로토콜을 채택하여, 인스턴스 간의 동등성 비교가 가능하도록 개선했습니다.
  • 뷰모델 상태 업데이트 최적화: Equatable 채택을 활용하여 뷰모델의 state가 실제로 변경되었을 때만 업데이트하도록 로직을 수정하여 불필요한 UI 갱신을 방지했습니다.
  • 내부 상태 관리 개선: PushNotificationListViewModelTodoListViewModel에서 pendingTasknextCursor와 같은 내부 관리 속성들을 State 구조체에서 뷰모델의 private 인스턴스 변수로 이동하여, State 변경으로 인한 불필요한 뷰 갱신을 줄였습니다.
Changelog
  • DevLog/Domain/Entity/TodoQuery.swift
    • TodoQuery 구조체에 Equatable 프로토콜을 추가했습니다.
  • DevLog/Presentation/ViewModel/AccountViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/LoginViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/ProfileViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • State에서 pendingTask 속성을 제거하고 뷰모델의 private 인스턴스 변수로 이동했습니다.
    • pendingTask 관련 로직을 업데이트했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/PushNotificationSettingsViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/RootViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/SearchViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/SettingViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/TodoDetailViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/TodoEditorViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • hasDueDate 계산 속성의 return 키워드를 제거하여 구문을 간소화했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/TodoListViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • State에서 nextCursorpendingTask 속성을 제거하고 뷰모델의 private 인스턴스 변수로 이동했습니다.
    • nextCursorpendingTask 관련 로직을 업데이트했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
  • DevLog/Presentation/ViewModel/TodoManageViewModel.swift
    • State 구조체에 Equatable 프로토콜을 추가했습니다.
    • 상태 변경 시에만 self.state를 업데이트하도록 로직을 수정했습니다.
Activity
  • 이 PR은 이슈 #146을 닫았습니다.
  • 현재까지 이 PR에 대한 추가적인 인간 활동(댓글, 리뷰 등)은 없습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

이번 풀 리퀘스트는 뷰모델의 State 구조체에 Equatable 프로토콜을 채택하고, 상태 변경 시 이전 상태와 비교하여 실제 변경이 있을 때만 업데이트하도록 개선했습니다. 이는 불필요한 UI 업데이트를 방지하여 성능을 최적화하고, 상태 관리의 정확성을 높이는 좋은 접근 방식입니다. 또한, PushNotificationListViewModelTodoListViewModel에서 pendingTasknextCursor와 같은 내부적인 상태 관리 변수들을 State 구조체에서 분리하여 뷰모델 자체의 private 프로퍼티로 옮긴 점은 뷰모델의 책임과 State의 역할을 명확히 구분하는 훌륭한 리팩토링입니다. 전반적으로 코드의 품질과 효율성을 향상시키는 변경사항입니다.

I am having trouble creating individual review comments. Click here to see my feedback.

DevLog/Domain/Entity/TodoQuery.swift (10)

medium

TodoQuery 구조체에 Equatable을 채택하여 State 구조체들이 자동으로 Equatable을 준수할 수 있도록 한 점은 훌륭합니다. 이는 뷰모델의 상태 비교 로직을 간결하게 유지하는 데 도움이 됩니다.

DevLog/Presentation/ViewModel/AccountViewModel.swift (12)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/AccountViewModel.swift (90)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/LoginViewModel.swift (15)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/LoginViewModel.swift (79)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/ProfileViewModel.swift (12)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/ProfileViewModel.swift (188)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (12)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (21)

medium

pendingTaskState에서 제거하고 뷰모델의 private 프로퍼티로 옮긴 것은 State의 역할을 UI 관련 상태로 명확히 하고, 뷰모델의 내부 로직을 분리하는 좋은 리팩토링입니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (59)

medium

pendingTask를 뷰모델의 private 프로퍼티로 선언하여 State와 내부 로직을 분리한 점은 훌륭합니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (102)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (161)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (166)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (178)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (180)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (221)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (224)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (225)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationListViewModel.swift (248)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/PushNotificationSettingsViewModel.swift (12)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/PushNotificationSettingsViewModel.swift (102)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/RootViewModel.swift (13)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/RootViewModel.swift (92)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/SearchViewModel.swift (13)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/SearchViewModel.swift (127)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/SettingViewModel.swift (13)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/SettingViewModel.swift (98)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/TodoDetailViewModel.swift (12)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/TodoDetailViewModel.swift (73)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/TodoEditorViewModel.swift (13)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/TodoEditorViewModel.swift (114)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (12)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (28-29)

medium

nextCursorpendingTaskState에서 제거하고 뷰모델의 private 프로퍼티로 옮긴 것은 State의 역할을 UI 관련 상태로 명확히 하고, 뷰모델의 내부 로직을 분리하는 좋은 리팩토링입니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (83-84)

medium

pendingTasknextCursor를 뷰모델의 private 프로퍼티로 선언하여 State와 내부 로직을 분리한 점은 훌륭합니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (132)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (157)

medium

state.nextCursor 대신 nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (242)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (247)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (255)

medium

state.nextCursor 대신 self.nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (259)

medium

state.nextCursor 대신 self.nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (263)

medium

state.nextCursor 대신 self.nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (267)

medium

state.nextCursor 대신 self.nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (271)

medium

state.nextCursor 대신 self.nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (288)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (292)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (302)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (305)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (310)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (357)

medium

state.pendingTask 대신 pendingTask를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (363)

medium

state.nextCursor 대신 self.nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoListViewModel.swift (366)

medium

state.nextCursor 대신 self.nextCursor를 직접 참조하도록 변경하여 State와 내부 로직을 명확히 분리한 점이 좋습니다.

DevLog/Presentation/ViewModel/TodoManageViewModel.swift (12)

medium

State 구조체에 Equatable을 채택하여 상태 변경 시 불필요한 업데이트를 방지하는 것은 성능 최적화에 기여합니다.

DevLog/Presentation/ViewModel/TodoManageViewModel.swift (41)

medium

self.state != state 조건을 추가하여 실제 상태 변화가 있을 때만 state를 업데이트하도록 개선한 점은 Observable 객체의 효율적인 사용을 위한 좋은 패턴입니다.

@opficdev opficdev merged commit 9056ee5 into develop Mar 3, 2026
1 check passed
@opficdev opficdev deleted the refactor/#146-Equatable branch March 3, 2026 14:05
@opficdev opficdev restored the refactor/#146-Equatable branch March 3, 2026 14:55
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.

뷰모델의 State에 Equtable을 일괄 채택한다

1 participant