Skip to content

refactor(afternote): 추억 노트 상세의 no-op 콜백 디폴트를 걷고 가드 목록을 좁힌다 (#1388) - #1544

Merged
OnlyReadOneBook merged 1 commit into
developfrom
refactor/1388-afternote-noop-cleanup
Aug 30, 2026
Merged

OnlyReadOneBook merged 1 commit into
developfrom
refactor/1388-afternote-noop-cleanup

Conversation

@OnlyReadOneBook

Copy link
Copy Markdown
Collaborator

#1388 의 가드(NoOpCallbackDefaultKonsistTest)와 컨벤션 문서는 이미 섰고, 가드가 관대 판정하던 legacy 목록에서 내 담당 몫을 걷어낸다.

청소 — afternote 잔여 2건

MemorialDetailScreen 의 onEditClick·onDeleteConfirm 이 no-op 디폴트를 달고 있었다.

onEditClick: () -> Unit = {},      // 배선 누락이 조용히 no-op
onDeleteConfirm: () -> Unit = {},

실호출부는 전부 실값을 넘긴다 — AfternoteNavGraphDetail 의 카테고리 분기 4곳(L290·302·314·327)이 onEditClick = { … } · onDeleteConfirm = { onDeleteConfirm(state.detailId) } 를 준다. 선택성이 실재하지 않으므로 컨벤션의 「화면 컴포저블은 디폴트 전면 제거」 처분을 그대로 적용했다.

자리 처분
선언 2건 = {} 제거 → required
프리뷰 2곳 onDeleteConfirm = {} 명시 (onEditClick 은 이미 명시돼 있었다)
screenshotTest 2곳 둘 다 명시
unit test 3곳 둘 다 명시

isEditable: Boolean 은 그대로 뒀다. 컨벤션이 「플래그 + no-op 콜백 짝은 nullable 핸들러로 합친다」 고 하지만, 이 플래그는 콜백 유무가 아니라 데이터 상태(수정 가능한 항목인가)를 나르고 실호출부가 값을 계산해 넘긴다 — 미배선을 숨기는 구조가 아니다.

가드 목록 축소 — 두 갈래를 뺐다

갈래 근거
AFTERNOTE (MemorialDetailScreen.kt) 제외 사유가 「PR #1336 이 같은 파일을 만지는 중」 이었는데 그 PR 이 0829 머지돼 사유가 소멸했다. 이 PR 이 청소했다
RECEIVER 3건 전건 해소됐다 — ReceiverHomeActions.kt 는 위반 0건이고, ContentSection.kt·ReceiverAfternoteScreen.kt 는 파일 자체가 사라졌다(#1421·#1424 계열)

남은 legacy 는 mindrecord·home(#1540) · timeletter(#1541) 몫이다. 오늘 #1388 을 담당 모듈별로 분할하면서 신설한 이슈들이고, 각 담당자가 청소하며 목록에서 빼면 된다.

목록이 실제 잔여와 일치하게 돼 「해소된 항목은 경고로 알린다」 테스트가 더 이상 경고를 내지 않는다 (검증 로그로 확인).

곁들여 — 재측정 결과가 이슈 본문과 크게 달랐다

이슈 본문의 0828 실측(108건)과 현행이 어긋나 재측정했고, 그 결과를 #1388 본문에 반영했다.

모듈 0828 현행
mindrecord 33 47 +14 신규 유입 — 주 원인은 69f63a22f(screenshotTest용 Content 경계 분리)
timeletter 34 34
home 3 3
afternote 24 2 이 PR 이 청소
receiver 14 0 이미 해소

청소보다 유입이 빠른 모듈이 있다는 것이 실측으로 드러나, 가드가 이 이슈의 본체가 됐다.

검증

항목 결과
:konsist:test --tests "*NoOpCallbackDefault*" ✅
:feature:afternote:presentation:compileDebugUnitTestKotlin ✅
:feature:afternote:presentation:compileDebugScreenshotTestKotlin ✅
:feature:afternote:presentation:ktlintCheck · :konsist:ktlintCheck ✅
legacy 목록 스테일 경고 ✅ 0건 (목록 = 실제 잔여)

스크린샷 baseline 재생성은 필요 없다 — {} 명시는 디폴트와 렌더링이 동일하다(컨벤션 문서에 명시된 성질이고, compileDebugScreenshotTestKotlin 통과로 시그니처 정합도 확인).

QA·시안 대조: 해당 없음. 콜백 시그니처와 테스트 인자만 바뀌고 프로덕션 호출부의 전달값은 그대로라 화면 동작·렌더 결과가 바뀌는 지점이 없다.

Refs #1388

Closes 가 아닌 이유 — #1388 은 자식 이슈 #1540·#1541 이 청소를 마친 뒤 가드 상한을 0 으로 내리는 것이 마지막 완료 조건이라 아직 닫히지 않는다.

CI Test Plan

{
  "androidTest": {
    "mode": "none",
    "reason": "컴포저블 파라미터의 기본값 제거와 프리뷰·screenshotTest·unit test 호출부의 인자 명시, 그리고 konsist 테스트의 예외 목록 축소뿐이다. 프로덕션 호출부(AfternoteNavGraphDetail)가 넘기는 값은 그대로라 런타임 동작이 바뀌지 않고, navigation 그래프·AndroidManifest·MainActivity·androidTest 소스셋·빌드 하네스 중 어느 것도 건드리지 않는다."
  }
}

`MemorialDetailScreen` 의 `onEditClick`·`onDeleteConfirm` 이 no-op 디폴트를 달고 있어
배선을 빠뜨려도 컴파일이 통과했다. 실호출부(`AfternoteNavGraphDetail` 카테고리 분기 4곳)는
전부 실값을 넘기고 있어 선택성이 실재하지 않으므로, 컨벤션의 「화면 컴포저블은 디폴트
전면 제거」 처분을 그대로 적용한다.

- 선언 2건을 required 로 바꾸고, 프리뷰 2 · screenshotTest 2 · unit test 3 곳에 `{}` 를 명시했다.
  `{}` 명시는 디폴트와 렌더링이 동일해 스크린샷 baseline 은 유지된다.
- `NoOpCallbackDefaultKonsistTest` 의 `LEGACY_NO_OP_DEFAULT_FILES` 에서 두 갈래를 뺐다.
  - AFTERNOTE — 제외 사유였던 PR #1336 이 0829 머지돼 사유가 소멸했고, 이 커밋이 청소했다.
  - RECEIVER 3건 — 전건 해소됐다. `ReceiverHomeActions.kt` 는 위반 0건이고
    `ContentSection.kt`·`ReceiverAfternoteScreen.kt` 는 파일 자체가 사라졌다.

남은 legacy 는 mindrecord·home(#1540) · timeletter(#1541) 몫이고, 목록이 실제 잔여와
일치해 「해소된 항목은 경고로 알린다」 테스트가 더 이상 경고를 내지 않는다.
@OnlyReadOneBook
OnlyReadOneBook added this pull request to the merge queue Aug 30, 2026
Merged via the queue into develop with commit f4033ca Aug 30, 2026
21 checks passed
@OnlyReadOneBook
OnlyReadOneBook deleted the refactor/1388-afternote-noop-cleanup branch August 30, 2026 02:28
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.

2 participants