Skip to content

refactor(afternote): 추모 미디어 업로드 경로 통합 — Outcome 타입 제거, 사진·영상 구현 1개로 (closes 938) [base: develop] - #1005

Merged
OnlyReadOneBook merged 2 commits into
developfrom
refactor/938
Aug 24, 2026
Merged

OnlyReadOneBook merged 2 commits into
developfrom
refactor/938

Conversation

@OnlyReadOneBook

Copy link
Copy Markdown
Collaborator

Closes #938

추모 미디어 업로드 경로가 사진·영상으로 타입 이름만 다른 동일한 코드 두 벌로 갈라져 있었고, 각 *UploadOutcome 의 3상태 중 Existing · FreshlyUploaded 는 유일한 소비처에서 같은 처리를 받았다. #258 이 BE 실코드로 영상 URL 영구성을 확정해 PATCH 전용 분기가 사라진 뒤 구분이 무의미해졌는데 타입만 남아 있었다.

변경

항목 내용
신설 MediaKind enum · MemorialMediaUploadRepository(resolve(input, kind): Result<String?>) · MemorialMediaUploadRepositoryImpl
삭제 PhotoUploadOutcome · VideoUploadOutcome · 인터페이스 2개 · Impl 2개
수정 UseCase 의 urlOrNull() 2개 제거 · DI 바인딩 2 → 1 · 낡은 KDoc 정리
  • Result<String?> 로 대체한 근거 — Empty + url 을 가진 두 상태는 String? 과 동형이고, 실패는 Result 가 이미 표현한다. 두 축(성공/실패, 값 있음/없음)이 직교하므로 성공 축에 sealed 계층이 필요하지 않다.
  • DIRECTORY_AFTERNOTES 이전 — 삭제되는 MemorialPhotoUploadRepositoryImpl.kt 에 있던 internal const 다. 썸네일 구현이 계속 참조하므로 통합 Impl 로 옮겼다.
  • 입력단 MediaInput 3상태는 유지 — Local 은 업로드하고 Remote 는 통과시켜 동작이 실제로 갈린다. 출력단만 갈리지 않았다.
  • UseCase KDoc 의 BE 계약 서술 제거 — S3 URL 영구성 · POST/PATCH 동일 규칙 설명을 지웠다. 정본은 Swagger·BE 이고 FE 에 복제하면 낡아 거짓이 된다. 근거는 커밋 메시지에 남겼다.

리뷰어에게

이슈 작업 목록에 없던 androidTest 3종을 함께 이관했다 — AfternoteAuthorAndroidTest · AfternoteAuthorImplementedCoverageAndroidTest · AfternoteAuthorExtendedAndroidTest. 이 파일들은 이슈가 기준으로 삼은 커밋 104462fd 에는 없었고 그 뒤 develop 에 들어왔다. 지금은 androidTest 가 PR 게이트 밖이지만 #949 가 :app:compileDebugAndroidTestKotlin 을 필수 게이트에 넣으므로, 빼놓으면 그 시점에 깨진다.

후속(이 PR 범위 밖) — 미디어 삭제 신호가 이 타입에 없다. 미첨부와 삭제가 둘 다 None → null → 필드 생략으로 뭉개진다. BE AfternotePlaylist.update() 가 null 가드를 두어 생략된 필드를 유지하므로 현재 계약으로는 지울 수단 자체가 없다. 편집 화면에 제거 UI 가 없어 도달 불가 경로이고 Outcome.Empty 시절과 동일한 상태이므로 그대로 뒀다. 삭제 기능을 붙일 때 BE 계약과 함께 정할 일이다.

검증

  • :feature:afternote:domain:test — 6/6 통과 (ResolveMemorialMediaForSaveUseCaseTest, Fake 2개 → kind 별 호출을 기록하는 1개로 재작성. short-circuit·cause 보존 단언 유지)
  • :feature:afternote:data:compileDebugKotlin · :app:compileDebugUnitTestKotlin — 통과
  • :app:compileDebugAndroidTestKotlin — 실패하나 44건 전부 develop 기존 드리프트와 완전 일치. develop 을 별도 worktree 로 뽑아 같은 태스크를 돌린 뒤 에러 집합(줄번호 제거)을 대조해 확인했다. 본 변경이 만든 새 에러 0건, 없앤 것도 0건 — androidTest 도메인 API 드리프트 44건+런타임 7건 수정, PR 컴파일 게이트 추가 #949 가 고치는 그 44건이다.
  • ktlintFormat 통과, pre-commit ktlint 훅 통과
  • 시각 검증 skip — 브랜치 diff 에 Compose 본문·디자인 토큰·리소스 변경이 0건이다(domain·data·androidTest 만). screenshotTest 커버를 지나지 않아 baseline 사이클 불필요.

사진·영상이 타입 이름만 다른 동일한 코드 두 벌로 갈라져 있었고, 각 Outcome 의 3상태 중
Existing·FreshlyUploaded 는 유일한 소비처에서 같은 처리를 받았다. #258 이 BE 실코드로 영상 URL
영구성을 확정해 PATCH 전용 분기가 사라진 뒤 구분이 무의미해졌는데 타입만 남아 있었다.

- MediaKind enum 신설, MemorialMediaUploadRepository 로 인터페이스 2개 통합
- MemorialMediaUploadRepositoryImpl 로 구현 2개 통합. DIRECTORY_AFTERNOTES 를 함께 이전 —
  삭제되는 파일에 있던 internal const 로, 썸네일 구현이 계속 참조한다
- PhotoUploadOutcome · VideoUploadOutcome 삭제 → Result<String?> 로 대체.
  Empty + url 보유 상태는 String? 과 동형이고 실패는 Result 가 이미 표현한다
- ResolveMemorialMediaForSaveUseCase 의 urlOrNull() 2개 삭제, DI 바인딩 2 → 1
- MediaInput 도입 때 갱신 누락됐던 KDoc 정리. UseCase KDoc 의 BE 계약 서술(S3 URL 영구성,
  POST/PATCH 동일 규칙)은 제거 — 정본은 Swagger·BE 이고 FE 에 복제하면 낡아 거짓이 된다
- androidTest 3종을 새 API 로 이관. 이슈 작업 목록에 없던 소비처로, 기준 커밋 104462f 에는
  없었고 그 뒤 develop 에 들어온 파일들이다

입력단 MediaInput 3상태는 유지한다 — Local 은 업로드하고 Remote 는 통과시켜 동작이 실제로 갈린다.

검증: :feature:afternote:domain:test 6/6 통과, :app:compileDebugUnitTestKotlin 통과.
:app:compileDebugAndroidTestKotlin 은 실패하나 44건 전부 develop 기존 드리프트와 완전 일치하며
(#949 가 고치는 그 44건) 본 변경이 만든 새 에러는 0건이다.
@OnlyReadOneBook
OnlyReadOneBook merged commit ca9b749 into develop Aug 24, 2026
13 checks passed
@OnlyReadOneBook
OnlyReadOneBook deleted the refactor/938 branch August 24, 2026 09:17
@github-actions

Copy link
Copy Markdown
Contributor

🚀 QA 배포 권장

QA 포인트

이 판단은 배포를 자동 실행하지 않습니다. deploy일 때 Release Distribution을 수동 실행하세요.

OnlyReadOneBook added a commit that referenced this pull request Aug 24, 2026
#1005(추모 미디어 업로드 경로 통합)가 먼저 develop 에 들어가 사진 전용
MemorialPhotoUpload* 가 MemorialMediaUpload* 로 바뀌었고, 이 브랜치는
AuthorReceiverRepository 를 지우고 UserRepository 로 갈아끼우는 쪽이라
DI 모듈 import 가 양쪽에서 갈렸다. 남는 쪽(MediaUpload)만 두고 지워진
쪽(PhotoUpload·AuthorReceiver) 은 모두 뺀다.

androidTest editorViewModel() 헬퍼는 develop 의 itemId(Long) 형태를 취한다 —
#949 가 String→Long 드리프트를 고친 결과이고 같은 파일의 다른 호출부도
Long 이다. 수신자 주입만 이 브랜치의 FakeUserRepository 로 남긴다.

:app:compileDebugUnitTestKotlin 통과. androidTest 오류 21건은 develop 에서
그대로 물려받은 것으로 오류 집합이 develop 과 동일하다.
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.

추모 미디어 업로드 경로 통합 — Outcome 타입 제거, 사진·영상 중복 구현 1개로

2 participants