Skip to content

feat: AtchaV2 설정 화면 + 계정 API 연동 (로그아웃 알람 정리·주소 변경·버전 체크·FCM 배선) - #362

Merged
YuGeonHui merged 4 commits into
env/devfrom
feat/v2-settings-account
Sep 24, 2026
Merged

YuGeonHui merged 4 commits into
env/devfrom
feat/v2-settings-account

Conversation

@YuGeonHui

Copy link
Copy Markdown
Collaborator

요약

계정 API(유저 정보·홈주소·탈퇴·로그아웃)는 UseCase까지만 있고 쓰는 화면이 없었습니다. 이 PR은 설정 화면(SettingsFeature) 을 새로 만들어 이 API들을 연결하고, 레거시에서 넘어온 로그아웃 후 알람 방치 버그를 고칩니다. 함께 서비스 지역 확인, 앱 버전 체크, FCM 토큰 갱신 전달 배선을 추가합니다.

변경 사항

1. 세션 종료 시 알람 정리 (버그 수정)

  • 레거시와 V2 모두 로그아웃·탈퇴 뒤에도 AlarmKit 알람, Live Activity, 세션 스냅샷이 남아 로그인 화면에서 알람이 울렸습니다.
  • 로그아웃·탈퇴·강제 만료는 모두 AppCoordinator.handleSessionExpiry로 모입니다. 여기서 AlarmSessionTeardown이 로컬 상태를 비웁니다(멱등).
  • 로그아웃은 토큰이 살아 있을 때 서버 알람 취소를 먼저 시도합니다(베스트 에포트).

2. SettingsFeature 신설 (홈 상단 톱니바퀴로 진입)

  • 메뉴: 우리집 설정(GET /members/me 주소 표시), 개인정보 처리방침, 피드백(레거시 링크), 현재 버전(업데이트 여부 표시), 로그아웃, 계정 탈퇴
  • 계정 탈퇴: 레거시 사유 7종을 그대로 옮겼습니다.
    • "기타"는 자유 입력이고, 공백만 입력하면 제출할 수 없습니다.
    • 확인 팝업을 거칩니다.
    • 실패하면 토스트를 띄우고 세션을 유지하므로 다시 시도할 수 있습니다.
  • 우리집 설정: 키워드 검색과 현재 위치(역지오코딩) 두 경로를 지원합니다. 새 API GET /locations/is-service-region을 통과해야 PATCH /members/me/home-address를 보냅니다.
  • 알림 빈도: 노출하지 않습니다. 레거시에서도 이 API는 호출된 적이 없습니다.
  • 의존: Home은 SettingsFeatureInterface만 의존하고, AtchaData는 import하지 않습니다.

3. 앱 버전 체크

  • 스플래시와 병렬로 GET /app/version을 호출합니다.
    • 헤더 X-Platform: iOS, 토큰 없이 호출합니다(public path).
    • 1.5초 안에 답이 없거나 실패하면 체크를 건너뜁니다. 레거시에서는 조회에 실패하면 스플래시가 멈췄습니다.
  • 서버에 더 새 버전이 있으면 "업데이트 / 나중에" 권장 팝업을 띄웁니다. 강제 업데이트는 서버가 최소 지원 버전을 주기 전까지 판정할 수 없습니다.

4. FCM 토큰 갱신 전달 (배선만)

  • 토큰 갱신 콜백과 로그인 직후에 SyncPushTokenUseCase를 호출합니다. 중복 전송을 막고, 로그아웃 시 reset합니다.
  • 서버 API가 확정되지 않아 지금은 UnconfirmedPushTokenRepository(no-op + 로그)를 주입했습니다. 경로가 확정되면 저장소 구현만 교체하면 됩니다.

설계 판단 (mobile-app-architecture 기준)

결정 선택 재검토 조건
Repository 신규 최소화(AppVersionRepository·PushTokenRepository만) —
UseCase 규칙이 있는 것만 신설: 지역 확인 + PATCH, 버전 비교, 토큰 중복 방지 —
프로필 캐시 없음(설정 진입 시 1회 GET) 설정 외 소비처가 생길 때
재시도 PATCH/DELETE 재시도 없음(멱등키 없음), 버튼 in-flight 비활성 멱등키 도입 시

테스트

  • 빌드: AtchaV2 Debug·Stage·Release 3구성 모두 성공
  • 단위 테스트 전부 통과
    • Domain 95건(신규 포함)
    • AtchaData 56건
    • SettingsFeature 12건(신규)
    • HomeFeature 66건
    • AtchaV2Tests 16건
  • SettingsFeature Example 타입 체크 통과
  • ⚠️ 시뮬레이터 UI 검수는 미수행 — 강제 로그인이라 실계정 없이 홈에 진입할 수 없습니다. 실기기 확인이 필요합니다.
    • 톱니바퀴 → 설정 진입 / 주소 표시
    • 주소 검색 변경 → "집 주소가 변경되었어요" / 지역 밖 → 레거시 토스트
    • 알람 등록 상태에서 로그아웃 → 로그인 시트 복귀 + 알람·LA 소멸
    • 계정 탈퇴(테스트 계정으로만)

서버 확인 필요 (로드맵 질문 #2, #10~13)

  • FCM 토큰 갱신 API 경로
  • /app/version 응답 형식: 최소 지원 버전 필드를 줄 수 있는지
  • is-service-region이 envelope result: Bool인지
  • V2가 레거시 App Store 앱(id6747877903)을 잇는지
  • 탈퇴 응답 유실 후 재호출 시 서버 응답

🤖 Generated with Claude Code

YuGeonHui and others added 4 commits September 24, 2026 12:01
- AlarmSessionTeardown 포트 + LogoutUseCase가 세션 종료 전 서버 알람 취소 선행
- UpdateHomeAddressUseCase: 서비스 지역 확인 통과 후에만 PATCH (outOfServiceRegion)
- CheckAppUpdateUseCase: 점 구분 숫자 비교, 권장 업데이트만 판정
- SyncPushTokenUseCase: 프로세스 내 중복 전송 방지 + 로그아웃 시 reset

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- GET /locations/is-service-region (PlaceEndpoint.serviceRegion → Bool)
- GET /app/version (X-Platform: iOS, 레거시는 버전 문자열 result)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- 설정: 우리집 주소(GET /members/me)·약관·피드백·버전(업데이트 여부)·로그아웃·계정 탈퇴
- 계정 탈퇴: 레거시 사유 7종(기타 자유입력, 공백 금지)·확인 팝업·실패 시 재시도
- 우리집 설정: 키워드 검색 + 현재 위치 역지오코딩, 지역 밖 레거시 토스트
- Home은 SettingsFeatureInterface만 의존, DSIcon.settings24 추가
- Swift Testing 12건 + Example 앱(스텁 UseCase)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- 로그아웃·탈퇴·강제 만료 공통 합류점(handleSessionExpiry)에서 AlarmKit·LA·스냅샷·동기화 상태 정리
  (레거시의 로그아웃 후 알람 방치 버그 미이식)
- 스플래시와 병렬 버전 체크: 1.5초 예산·실패 시 통과, /app/version public path
- FCM 토큰 갱신·로그인 직후 동기화 배선 — 서버 API 미확정이라 no-op 저장소 주입
- CLAUDE.md·로드맵 서버 질문(#10~13) 갱신

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@YuGeonHui
YuGeonHui merged commit 5e0b187 into env/dev Sep 24, 2026
1 check passed
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