Skip to content

feat: AtchaV2 Phase 5 — SearchFeature 신규 (장소 검색 + 막차 결과 + 경로 선택 반환) - #343

Merged
YuGeonHui merged 7 commits into
env/devfrom
feat/v2-phase5-search-feature
Aug 22, 2026
Merged

feat: AtchaV2 Phase 5 — SearchFeature 신규 (장소 검색 + 막차 결과 + 경로 선택 반환)#343
YuGeonHui merged 7 commits into
env/devfrom
feat/v2-phase5-search-feature

Conversation

@YuGeonHui

Copy link
Copy Markdown
Collaborator

개요

AtchaV2 Phase 5 — SearchFeature 신규. 장소 검색 → 막차 결과 → 경로 선택 반환까지의 수직 슬라이스입니다.

주요 변경

  • Project.feature(name: "Search") 4타겟 신설 + Workspace 등록
  • Interface: SearchCoordinatorBuildable (onRouteSelected 콜백)
  • 검색 화면: 출발/도착 슬롯(DSTextField) + 디바운스 키워드 검색 (이전 Task cancel)
  • 최근 검색: 선택 적용 · 개별 삭제 (RecentSearchesUseCase)
  • 막차 결과: DSRouteCard 강조 + 더보기 확장(DSListCell), serviceEnded/noRoute는 DSEmptyState
  • TransportBadgeMapper: TransportLegDSTransportBadge.Kind 휴리스틱 매핑

검증

  • ViewModel 테스트 11종 (Swift Testing)
  • Example 앱 스텁 시연 (3가지 빈 상태 데모 포함)

⛓️ 스택 PR: #342 머지 후 머지해주세요. (이 PR이 스택의 마지막입니다)

🤖 Generated with Claude Code

YuGeonHui and others added 7 commits August 22, 2026 13:11
- Domain: Place/LastRoute/AlarmInfo 엔티티, LastRouteSearchResult 정규화 enum,
  Repository·디바이스 포트 6종, UseCase 7종 (등록 순서·정규화 정책 포함)
- AtchaData: Route/Place/Alarm 엔드포인트, APIResponse envelope 해체 헬퍼,
  레거시 실측 DTO 이식(toEntity, KST 고정 파싱, mode unknown 폴백), RepositoryImpl 3종
- 테스트: Domain 정책 8개 + AtchaData 인라인 픽스처 28개 (Swift Testing)
- 미확정 입력 #3(빈 목록=serviceEnded 가정)·#4(클라 삭제 후 등록)는 TODO로 격리

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- CoreStorage 레이어 모듈 신설 (KeyValueStore 프로토콜 + Codable 헬퍼,
  UserDefaultsKeyValueStore, KeychainStore — 레거시 키체인+메모리 캐시
  패턴을 Mutex 기반 Sendable-clean으로 재작성)
- AtchaData에 RecentSearchRepositoryImpl (최대 10개, 중복 시 최신 갱신,
  최신순, 삭제 지원) + RecentSearchRecordDTO
- 테스트는 인메모리 KeyValueStore 스텁 (실 UserDefaults 미사용)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- CoreAuth 모듈 신설(.nonisolated, CoreNetwork+CoreStorage 의존)
- TokenStore: 키체인 기반 액세스/리프레시 토큰 보관(레거시 키 계약 유지)
- AuthSessionManager(actor): 익명 부트스트랩 + GET /auth/reissue 리프레시
  (토큰 회전) + 401 복구 체인, single-flight
- AuthenticatedNetworkClient: Bearer 부착 → 401 시 복구 1회 → 재시도,
  공개 경로 suffix 주입, 복구 불능 시 원 401 전파 (AtchaData/Feature 무변경)
- App: 데코레이터 주입(AppDIContainer), 스플래시 단계(AppCoordinator +
  SplashViewController), base URL 실호스트 반영(atcha.p-e.kr / atcha.online)
- 익명 발급 엔드포인트는 스펙 미정(미확정 입력 #2) — 프로토콜+스텁, 실호출 보류
- 테스트 30개(Swift Testing): 401 체인·동시 401 리프레시 1회·공개 경로 예외

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…갤러리)

- 토큰 2계층화: DSPalette(primitive — grey 11단·lime 4단·red·교통 노선 30종)
  → DSColor(semantic 중첩 네임스페이스). 폴백 hex = 에셋 동일값으로
  호스트리스 테스트에서도 결정적
- DSResourceBundle: fatalError 없는 번들 파인더 (Tuist Bundle.module 대체)
- DSTypography 11 프리셋(Pretendard 임베드 + CTFontManager 런타임 등록,
  실패 시 시스템 폰트 폴백) + DSRadius/DSIconSize/DSSpacing 확장
- 컴포넌트: DSButton(4스타일×3사이즈, 구 API 호환), DSTextField(포커스 보더),
  DSListCell, DSTransportBadge, DSRouteCard, DSBanner, DSToast(액션 지원),
  DSEmptyState, DSNavigationBar, DSSectionHeader, DSSeparator
- 브랜드 에셋 이식(새 네이밍 ic*/illust*), 레거시 ds* colorset 3종 제거
  (flat API는 deprecated 별칭으로 유지 — HomeFeature 무변경)
- Project.layer에 example 파라미터 추가 → DesignSystemExample 갤러리 앱
- 테스트 53개(13 suites) 전부 통과, Debug/Stage 빌드 통과

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Project.feature(name: "Search") 4타겟 신설 + Workspace 등록
- Interface: SearchCoordinatorBuildable (onRouteSelected 콜백)
- 검색 화면: 출발/도착 슬롯(DSTextField) + 디바운스 키워드 검색(이전 Task cancel)
- 최근 검색: 선택 적용·개별 삭제 (RecentSearchesUseCase)
- 막차 결과: DSRouteCard 강조 + 더보기 확장(DSListCell), serviceEnded/noRoute는 DSEmptyState
- TransportBadgeMapper: TransportLeg → DSTransportBadge.Kind 휴리스틱 매핑
- ViewModel 테스트 11종(Swift Testing) + Example 앱 스텁 시연(3가지 빈 상태 데모 포함)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@YuGeonHui
YuGeonHui merged commit d1b5bf3 into env/dev Aug 22, 2026
1 check passed
@YuGeonHui
YuGeonHui deleted the feat/v2-phase5-search-feature branch August 22, 2026 11:44
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