You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
feat(afternote): 수정 모드에서 서버 영정사진·추모 영상을 지울 수 있게 한다 — BE 삭제 계약 확장 반영 #1597
수정 모드에서 서버에 이미 저장된 영정사진·추모 영상을 앱에서 지울 수 없다. 미디어 시트의 «삭제» 는 이 폼에서 새로 붙인 로컬 첨부에만 열린다 — removableMemorialMediaTargets() 가 서버 미디어를 대상에서 뺀다.
그 가드의 근거는 계약 한계였다. KDoc 이 그대로 적고 있다.
수정(PATCH) 계약이 삭제를 표현하지 못한다 — BE AfternotePlaylist.update 는 null 필드를 "기존 값 유지" 로 해석하므로, 폼만 비워 두면 저장 후 서버 미디어가 되살아나는 거짓 삭제가 된다. (…) 서버 미디어 삭제는 BE 계약 확장 후 후속.
그 계약 확장이 들어왔다 — Afternote-BE origin/main72fee63(2026-08-30). PATCH 가 «필드 생략 = 유지» 와 «JSON null = 삭제(DB 참조 제거 + S3 객체 삭제)» 를 가른다. 근거가 사라졌으므로 가드도 사라져야 한다.
완료 조건:
수정 모드에서 서버 영정사진·서버 추모 영상 슬롯에도 «삭제» 가 열린다.
지우고 저장하면 서버 미디어가 실제로 제거된다 — 재진입해도 되살아나지 않는다.
removableMemorialMediaTargets() KDoc 에서 낡은 근거(«계약이 삭제를 표현하지 못한다»)를 지운다.
선행 계약을 dev 실서버로 확인했습니다 (2026-08-30 21:4x KST, QA823 계정).
presign → S3 PUT → PLAYLIST 생성 으로 관리 키를 하나 만들고 같은 노트에 세 갈래 PATCH 를 차례로 쏜 결과입니다.
보낸 바디
HTTP
저장 후 memorialPhotoUrl
서버가 내려준 permanent URL 되싣기
200
그대로 유지
종전 FE 바디 — 미디어 키 생략
200
그대로 유지 (거짓 삭제 재현)
명시적 "memorialPhotoUrl": null
200
null (삭제됨)
S3 객체까지 회수됩니다 — 삭제 직전 오브젝트 URL 이 200, 명시적 null PATCH 직후 같은 URL 이 403.
즉 이 이슈에 남은 것은 FE 화면 몫뿐입니다. 배선(#1596 / PR #1600)은 올라가 있고 CI 전부 초록입니다. 착수 조건은 이제 #1561(PR #1565) 머지 하나입니다 — 삭제가 picked/server 두 칸을 어떻게 비울지가 그 모양 위에서 정해지므로, 지금 손대면 같은 줄을 두 번 씁니다.
참고로 #1565 가 머지되면 「삭제 = picked 만 비우고 표시는 서버 값으로 복귀」가 되므로, 이 이슈의 작업은 서버 칸까지 비우는 갈래를 추가하는 것이 됩니다 — 그래야 저장 시 videoMediaInput(null) → MediaInput.None → 페이로드 null → 위 표 셋째 줄로 이어집니다.
Activity
OnlyReadOneBook commentedon Aug 30, 2026
선행 계약을 dev 실서버로 확인했습니다 (2026-08-30 21:4x KST, QA823 계정).
presign → S3 PUT → PLAYLIST 생성으로 관리 키를 하나 만들고 같은 노트에 세 갈래 PATCH 를 차례로 쏜 결과입니다.memorialPhotoUrl"memorialPhotoUrl": nullnull(삭제됨)S3 객체까지 회수됩니다 — 삭제 직전 오브젝트 URL 이 200, 명시적 null PATCH 직후 같은 URL 이 403.
즉 이 이슈에 남은 것은 FE 화면 몫뿐입니다. 배선(#1596 / PR #1600)은 올라가 있고 CI 전부 초록입니다. 착수 조건은 이제 #1561(PR #1565) 머지 하나입니다 — 삭제가
picked/server두 칸을 어떻게 비울지가 그 모양 위에서 정해지므로, 지금 손대면 같은 줄을 두 번 씁니다.참고로 #1565 가 머지되면 「삭제 = picked 만 비우고 표시는 서버 값으로 복귀」가 되므로, 이 이슈의 작업은 서버 칸까지 비우는 갈래를 추가하는 것이 됩니다 — 그래야 저장 시
videoMediaInput(null)→MediaInput.None→ 페이로드null→ 위 표 셋째 줄로 이어집니다.github-actions commentedon Aug 30, 2026
이 이슈를 맡은 PR 은 #1620 다 (base
fix/1596-explicit-null-media-patch).base 가 기본 브랜치(
develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에아무것도 표시하지 않는다. 본문에
Closes #N이 있어도 마찬가지다 — 그 링크는 기본 브랜치를target 하는 PR 에서만 만들어진다.
PR 이 닫히거나 머지되면 이 이슈의
pr-open라벨은 다음 리컨사일에서 떨어진다.Merge branch 'origin/refactor/1561-memorial-media-value-object' into …
refactor(afternote): 표시 영상 삭제를 «교체분 → 서버 원본 → 변화 없음» 세 갈래로 적는다 (#1597)
refactor(afternote): 이탈 가드 지문 조각을 userEnteredPart 에서 withoutThumbnail…
refactor(afternote): 사진 선택 변이의 «교체» 와 «교체 취소» 갈래를 하나로 합친다 (#1597)
test(afternote): 미디어 시트의 «사진 삭제» 변형 프리뷰를 더한다 (#1597)
docs(afternote): 사진 삭제 변이의 책임을 «표시된 층 하나 pop» 으로 적는다 (#1597)
feat(afternote): 미디어 삭제는 슬롯을 비운다 — 교체분과 서버 원본을 함께 걷고 서버 삭제는 저장이 한다 (#…
Merge branch 'develop' into feat/1118-memory-note-voice