Skip to content

Conversation

@dydals3440
Copy link
Contributor

개요

Mobile 앱의 유지보수성 및 확장성 향상을 위해 기존 아키텍처를 Presentation, Domain, Data 레이어 패턴에 따라 재구성하는 대규모 리팩토링을 진행했습니다.

변경 유형

  • 리팩토링 (refactor)

영향 범위

  • Mobile (apps/mobile)

변경 내용

  • 디렉토리 구조를 presentations, services, repositories, models 등으로 명확히 분리
  • 기존 core/dibootstrap/providers로 재구성하여 의존성 주입 개선
  • useQueryqueryOptionsmutationOptions를 도입하여 데이터 페칭 로직 중앙화
  • Service, Mapper, Repository, Policy의 역할을 코드에 명확히 적용

테스트

  • 기능 변경이 아닌 아키텍처 리팩토링으로, 기존 테스트의 통과를 보장해야 합니다.
  • pnpm --filter mobile test

체크리스트

  • 코드가 프로젝트 스타일 가이드를 따릅니다
  • 모든 테스트가 통과합니다 (pnpm test)
  • 타입 체크가 통과합니다 (pnpm typecheck)
  • 린트가 통과합니다 (pnpm lint)

관련 이슈

Closes #55

@dydals3440 dydals3440 added type: refactor 🧹 코드 개선 - 기능 변경 없이 가독성과 유지보수성을 높여 기술 부채를 해결하는 작업 scope: mobile 📱 모바일 - Expo 기반 모바일 앱 UI/UX 및 클라이언트 로직 관련 status: needs review 🔍 리뷰 대기 - 작업 완료 후 병목 제거를 위해 팀원의 빠른 피드백이 필요한 상태 labels Jan 22, 2026
@dydals3440 dydals3440 self-assigned this Jan 22, 2026
@dydals3440 dydals3440 requested a review from hijjoy January 22, 2026 13:30
@gemini-code-assist
Copy link

Summary of Changes

Hello @dydals3440, 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!

이 Pull Request는 모바일 앱의 아키텍처를 Presentation, Domain, Data 레이어 패턴에 따라 대규모로 재구성하는 리팩토링을 수행했습니다. 이를 통해 앱의 유지보수성과 확장성을 향상시키고, 의존성 주입, 인증 흐름, 데이터 페칭 로직을 더욱 체계적으로 관리할 수 있도록 기반을 마련했습니다. 기존의 분산된 로직들을 중앙화된 프로바이더와 서비스 계층으로 통합하여 개발 효율성을 높이는 데 기여합니다.

Highlights

  • 레이어드 아키텍처 도입: 모바일 앱의 아키텍처를 Presentation, Domain, Data 레이어 패턴으로 재구성하여 코드의 응집도를 높이고 유지보수성 및 확장성을 크게 향상시켰습니다.
  • 의존성 주입(DI) 시스템 개선: 기존의 core/di 모듈을 bootstrap/providers로 재편하고 DIProvider를 도입하여 애플리케이션 전반의 의존성 관리를 중앙화하고 표준화했습니다.
  • 중앙화된 인증 및 데이터 페칭 로직: AuthProvider를 통해 전역 인증 상태를 관리하고, TanStack Query의 queryOptionsmutationOptions를 활용하여 데이터 페칭 로직을 중앙에서 정의하고 관리하도록 변경했습니다.
  • HTTP 클라이언트 및 스토리지 추상화: ky 라이브러리를 기반으로 하는 KyHttpClient를 도입하여 HTTP 요청을 추상화하고, SecureStorage를 통해 안전한 로컬 스토리지 접근을 표준화했습니다. 인증 및 비인증 요청을 위한 별도의 클라이언트 인스턴스를 생성합니다.
  • 코드 스타일 및 구조 개선: 함수 컴포넌트 선언 방식을 통일하고, 여러 컴포넌트에서 사용되던 로직 및 UI 요소를 분리하여 재사용성을 높였습니다. 불필요한 테스트 유틸리티 및 이전 아키텍처 관련 파일들을 제거하여 코드베이스를 간소화했습니다.
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

@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

이 PR은 Presentation, Domain, Data 레이어 아키텍처를 도입하여 모바일 앱의 구조를 개선하는 대규모 리팩토링을 수행합니다. 전반적으로 코드 구조가 크게 향상되었으며, 특히 의존성 주입(DI), queryOptions/mutationOptions를 사용한 데이터 페칭 로직 중앙화, 그리고 Domain/Service/Repository/Mapper의 역할 분리가 인상적입니다.

다만, 몇 가지 중요한 우려 사항이 있습니다. 첫째, 인증 토큰 갱신 로직에서 여러 요청이 동시에 401 오류를 반환할 때 발생할 수 있는 경쟁 상태(race condition)에 대한 처리가 누락되었습니다. 이는 심각한 인증 문제를 유발할 수 있습니다. 둘째, 리팩토링 과정에서 인증 기능과 관련된 많은 테스트 파일들이 삭제되었습니다. 대규모 리팩토링의 안정성을 보장하기 위해서는 테스트 코드를 제거하는 대신 새로운 아키텍처에 맞게 수정하고 유지하는 것이 매우 중요합니다. PR 설명에 '모든 테스트가 통과합니다'라고 되어 있지만, 실제로는 테스트 커버리지가 크게 감소한 것으로 보입니다. 이 부분에 대한 확인이 필요합니다.

이러한 점들을 수정하면 더욱 완성도 높은 코드가 될 것입니다. 아래에 구체적인 리뷰 의견을 남겼으니 확인 부탁드립니다.

@dydals3440
Copy link
Contributor Author

dydals3440 commented Jan 22, 2026

@hijjoy

기존 구조가 너무 과한 것 같아서, 아키텍처 구조를 조금 더 직관적으로 정리해봤습니다!

  • repository: 서버 요청/응답 처리 + API 스펙에 대한 검증 역할
  • service: 비즈니스 로직 처리
  • presentation: UI, React Hook 영역

mapper의 위치를 어디에 두는 게 좋을지 고민을 많이 했는데, repository는 서버에서 데이터를 가져오는 책임에 집중하고,
프론트엔드에서 사용하는 model(ViewModel)로의 변환은 service 레이어에서 처리하는 게 더 자연스럽다고 판단해서 mapper를 service 쪽에 두었습니다.

이렇게 하면 repository는 순수한 데이터 소스 역할에 집중할 수 있고 service가 실제로 “어떤 데이터가 화면/비즈니스에 쓰일지”를 명확히 책임지는 구조가 되지 않을까 싶네요!

공부를 하다보니, repository 영역의 핵심인 서버 응답 검증을 기존에 하지 않고 있다고 생각이 들어서 리팩토링을 해보았습니다!

- auth-client.ts: 토큰 리프레시 시 경쟁 상태(race condition) 방지 로직 추가
- auth.repository.impl.ts: 로그아웃 시 API 호출 후 토큰 삭제하도록 순서 수정
- auth-provider.tsx: 디버그용 console.log 제거
@dydals3440 dydals3440 merged commit a960d81 into main Jan 23, 2026
3 checks passed
@dydals3440 dydals3440 deleted the refactor/mobile-architecture-layers branch January 23, 2026 02:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope: mobile 📱 모바일 - Expo 기반 모바일 앱 UI/UX 및 클라이언트 로직 관련 status: needs review 🔍 리뷰 대기 - 작업 완료 후 병목 제거를 위해 팀원의 빠른 피드백이 필요한 상태 type: refactor 🧹 코드 개선 - 기능 변경 없이 가독성과 유지보수성을 높여 기술 부채를 해결하는 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature]: Mobile 앱 아키텍처 리팩토링 및 구조 개선

3 participants