docs(auth): 콘텐츠 설정 요구사항과 검증 결과를 기록한다

This commit is contained in:
Yu Sung
2026-10-13 11:37:26 +09:00
parent 61bfa46c11
commit 1b50f559bd
6 changed files with 894 additions and 0 deletions
@@ -0,0 +1,60 @@
# 개발 전용 인증 시뮬레이션 리뷰
## 1. 리뷰 정보
- 대상: P5-T1 개발 타깃 조건, 공통 인증 View, 모의 repository/세션 상태.
- 기준: `../prd.md` §11.0, `../plan-task.md` Phase5.
- 일자: 2026-10-12. 상태: P5 수정·검증 완료 / 독립 재검토 APPROVE.
## 2. 목적과 범위
SodaLive-dev만 SDK/인증 POST를 모의 처리하고 기존 성공 흐름을 재사용하는지, 일반 앱에 모의 코드가 제외되는지, 조회·계정 변경·후속 설정이 일관되는지 확인한다. 실제 서버 권한 부여는 범위 밖이다.
## 3. 검토 근거
- 실제 `AuthRepository`, `UserRepository`, `AuthVerificationMock`와 native Combine을 컴파일하고 transport/UserDefaults 의존성만 격리했다.
- 재현 파일: `/var/folders/yh/8xsbvpsj5wg2qnxzxdp11_gm0000gn/T/opencode/auth-verification-repository-check/CheckMockRaces.swift`.
- 기존 Foundation mock 체크와 저장소/VM 정상 흐름은 통과했으나 아래 두 순서 사례는 빠져 있었다.
## 4. 발견 사항 요약
| ID | 심각도 | 상태 | 내용 | Task |
|---|---|---|---|---|
| REV-P5-001 | High | 수정 완료 | 인증 전 GET의 늦은 응답이 활성 모의 상태를 되돌림 | P5-R1 |
| REV-P5-002 | Medium | 보류 / 이번 수정 제외 | repository 단독 역순 응답은 재현되지만 실제 UI 로딩 차단을 포함한 중첩 사용자 요청 미확정 | 후속 재현 시 재평가 |
## 5. 발견 사항 상세
### REV-P5-001
`selfMemberPublisher`가 요청 시점의 활성 mock Session을 캡처한다. 인증 전에는 nil이므로, 같은 로그인 세션에서 인증 완료 후 응답이 와도 overlay하지 않는다. App/Home VM은 정상 응답의 isAuth/선호를 그대로 저장하므로 최신 모의 상태가 되돌아갈 수 있다.
재현: GET A 시작 → 모의 인증 성공 → GET B 완료로 true/FEMALE 반영 → GET A 완료. 실행 결과 `auth=false, preference=ALL`, 기대 `true/FEMALE`.
### REV-P5-002
`updateContentPreference`는 응답마다 공유 snapshot을 갱신하며 요청 순서를 구분하지 않는다. 기존 ContentSettingsViewModel의 latestRequestToken은 그 뒤 UI 갱신만 차단하므로 공유 snapshot이 이미 이전 값으로 변한다.
재현: MALE 요청 A → FEMALE 요청 B → B 성공 → A 성공 → member GET. 실행 결과 `MALE`, 기대 최신 요청의 `FEMALE`.
## 6. plan·goal 전환
코드 변경 전에 `P5-R1`을 추가했다. 로그인 세션과 mock 활성 상태를 분리하고 preference 요청 순서를 추적하는 최소 수정 후 동일 재현과 real/mock 회귀 검사를 다시 실행한다.
## 7. 검증 및 판정
- 위 두 재현은 coordinator가 실제 변경 소스를 컴파일해 확인했다. 실서버를 호출하지 않았다.
- 독립 리뷰와 두 앱 전체 빌드는 진행 중이며 아직 최종 완료로 판단하지 않는다.
- 2026-10-12 독립 리뷰 후속: Oracle은 REV-P5-001을 실제 Main 회원조회/로컬 저장 경로의 확정 회귀로 판정했다. REV-P5-002는 기존 설정 UI의 LoadingView 차단 때문에 실제 중첩 사용자 요청을 확정하지 못했으므로, repository 단독 재현만으로 제품 결함을 확정한 이전 판정을 보류로 정정한다. 최소 변경 원칙에 따라 추가 preference 요청순서 상태는 구현하지 않는다.
- 두 Debug 앱 빌드 exit0, 네 가지 구성에서 mock flag는 dev Debug/Release에만 존재했다. 실제 standard 실행파일/debug dylib에 mock 심볼 없음, dev dylib에는 존재함을 확인했다. 아래 회귀 수정 후 필요한 검증을 재실행한다.
## 8. 수정 후 검증 및 종료 판정
- REV-P5-001: stable login Session과 optional 확정 preference를 분리했다. 인증 전 요청이 캡처한 동일 세대는 응답 시점의 최신 확정값을 사용한다. 명시적 nil·이전 계정·같은 token 재로그인 이전 세대는 보정하지 않는다.
- `AuthVerificationMockCheck.swift:34`에 late pre-confirmation GET 검사를 추가하고 assertion RED(exit132)→GREEN(exit0)을 확인했다. 기존 assertion 삭제/완화 없음. 임시 실제 repository/변경 없는 VM driver도 `A 시작→모의 인증→B 성공/로컬 저장→A 성공` 후 true/FEMALE 유지, 실제 인증 POST0회를 확인했다.
- Oracle 재검토는 **APPROVE**, 새로운 차단 결함 없음. 재검토가 남긴 수정 후 두 앱 빌드 조건도 coordinator 18:51 재실행 exit0으로 충족했다.
- 전체 `work/tests/check-*.sh`, dev/standard repository driver, Swift parsing, project plutil, diff check PASS. native UI는 수정하지 않아 기존 4test/0failure 증거를 유지한다.
- 실제 wrapper의 cover/inline 로딩→패널→확인/닫힘, 취소·재등장 guard는 iOS26 native host에서 검증했다. 인증 success와 member sync는 실제 VM/repository에 transport stubs를 연결한 격리 실행으로 검증했으며 실서버 인증으로 표현하지 않는다.
- 일반 `SodaLive` Debug/Release effective mockflag 없음. dev Debug/Release만 flag 있음. 실제 Debug Mach-O 표준 mocksymbol0, devmock 존재; Release는 전체 앱 빌드 미실행이며 설정/검사 바이너리만 검증했다.
- REV-P5-002는 실제 UI 경로 미확정이므로 보류 판정을 유지하며 추가 순서 추적을 만들지 않았다. 실제 사용자 경로로 재현되면 별도 회귀 Task로 진행한다.
- P5 앱 흐름 테스트 기능은 승인 가능하다. 기존 P3 실제 계정/서버 통합 공백은 별도이며, 개발 mock은 서버 보호 API 권한을 부여하지 않는다. LSP 도구는 미제공으로 실제 compiler/build 검증을 사용했다.