Skip to content

refactor(afternote): 테스트 전용 접근으로 넓어진 presentation·mapper visibility 축소 #1673

Closed
1 of 1 issue completed

Description

@OnlyReadOneBook

작업 유형

refactor — 동작 변경 없는 구조·책임·경계 개선

주 담당 모듈

afternote — 애프터노트

개요

기준: origin/develop dcd8a8ec92fcdf98a87b937bdd1ab16bdca7a0a3.

최초 조사에서 프로덕션 외부 사용이 없는데 테스트가 직접 접근해 public·internal로 남은 애프터노트 선언 18개를 확인했다. 아래 목록은 최초 인벤토리이며 분리한 항목은 담당 이슈의 현재 범위로 처리한다. 프로덕션 호출 범위에 맞춰 private로 줄이고 테스트는 public owner 동작이나 private preview wrapper를 통해 검증한다.

확정 후보:

  • data: AfternoteRequestMapper.kt:93 MemorialSongPayload.toDto.
  • detail: AfternoteDetailRoute.kt:61 DeleteInProgressOverlay, MemorialDetailScreen.kt:62 MEMORIAL_VIDEO_CARD_TEST_TAG.
  • editor: AfternoteEditorContent.kt:47 EditorContent, AfternoteEditorScreen.kt:191 editorContentSignature, AfternoteEditorViewModel.kt:648 Throwable.toAfternoteEditorError.
  • editor mapping/state: EditorReceiverMapping.kt:6 Receiver.toAfternoteEditorReceiver, AfternoteEditorState.kt:181 editorMessagesSaver, AfternoteEditorState.kt:110 replaceEditorMessages(), AfternoteEditorFormMapper.kt:113 buildMemorialWritePayload().
  • memorial: MemorialVideoUpload.kt:52 MEMORIAL_VIDEO_ADD_TEST_TAG.
  • selection: EditorServiceSelectionSheet.kt:133 EditorServiceSelectionSheetContent, 246 filterEditorServiceOptions, 259 serviceSelectionSheetTitleResOrNull.
  • home/list: AfternoteTypeFilterRow.kt:34 AFTERNOTE_CATEGORY_MORE_INDICATOR_TEST_TAG, ReceiverAfternoteHomeViewModel.kt:61 AfterNoteListItem.toUiModel, AfternoteDisplayRes.kt:43 getIconResForType.
  • AfternoteNavGraphTheme.kt:13 AfternoteLightTheme는 프로덕션 사용이 0건이고 screenshotTest만 사용한다. src/main에서 제거해 screenshotTest 내부 private wrapper로 이동한다.

완료 기준:

  • 프로덕션 사용이 같은 파일뿐인 선언은 private, 사용 0건인 AfternoteLightTheme는 테스트 소스셋으로 이동한다.
  • 테스트는 create/update payload, editor prefill·저장, 화면 semantics 같은 공개 owner 계약을 검증한다.
  • 테스트 tag·screenshot Content 접근을 위해 프로덕션 visibility를 유지하지 않는다.
  • presentation/data 관련 JVM·Compose·screenshot 테스트, 컴파일, ktlint를 통과한다.

자식 이슈

No response

참고

프로덕션에서 다른 파일이 실제 소비하는 rememberMemorialMediaSourceState와 그 반환 타입은 제외했다.

분리 범위의 현재 처리

  • 편집기 EditorContent, EditorServiceSelectionSheetContent, editorContentSignature, Throwable.toAfternoteEditorError 네 건은 #1817로 분리한 뒤 refactor(afternote): 편집기 ViewModel과 직접 소비 경계를 MVI로 전환한다 #1804 편집기 MVI 안에서 private 전환과 실제 화면·Save Intent 검증을 함께 완료한다. 이 이슈에서 다시 구현하지 않는다.
  • DeleteInProgressOverlay는 #1968의 상세 MVI 전환과 같은 변경에서 완료한다. 별도 후속 #1817은 철회했으며 이 이슈에서 중복 구현하지 않는다.

Activity

  1. added
    refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업
    area:afternote애프터노트 기능 영역
    on Aug 31, 2026
  2. OnlyReadOneBook commented on Sep 3, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    MVI 전환(#1811) 착수에 맞춰 이 이슈에서 화면 seam 5건을 #1817 로 분리했습니다.

    MVI 전환은 화면을 Screen(stateful) / Content(internal stateless) 2단으로 가르고 Content 를 테스트·프리뷰 진입점으로 열어 둡니다. 지금 private 로 조이면 #1804 전환 때 다시 열어야 해서, 같은 파일을 두 번 고치고 리뷰도 두 번 돕니다.

    이관: EditorContent · EditorServiceSelectionSheetContent · DeleteInProgressOverlay · editorContentSignature · Throwable.toAfternoteEditorError

    이 이슈에 남는 것 (선행 없이 진행 가능): data mapper · TEST_TAG 2종 · editorMessagesSaver · replaceEditorMessages() · buildMemorialWritePayload() · Receiver.toAfternoteEditorReceiver · filterEditorServiceOptions · serviceSelectionSheetTitleResOrNull

  3. OnlyReadOneBook commented on Sep 13, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    상태 정리: develop 13건 해소, 남은 5건은 열린 스택 안에 있습니다

    본문의 18건을 develop(93e983fe1)과 refactor/1968-afternote-mvi HEAD(ee53fe85c, PR #2021) 양쪽에서 대조했습니다. 새로 구현할 것은 없고, 남은 5건은 이미 작성된 PR 이 머지되면 함께 사라집니다.

    develop 에서 이미 해소된 13건

    MemorialSongPayload.toDto, Receiver.toAfternoteEditorReceiver, editorMessagesSaver, replaceEditorMessages, buildMemorialWritePayload, filterEditorServiceOptions, AfternoteType.serviceSelectionSheetTitleResOrNull, AfterNoteListItem.toUiModel, getIconResForType 는 private 이고, MEMORIAL_VIDEO_CARD_TEST_TAG·MEMORIAL_VIDEO_ADD_TEST_TAG·AFTERNOTE_CATEGORY_MORE_INDICATOR_TEST_TAG 는 참조 0건으로 삭제됐습니다. AfternoteLightTheme 은 아래에 따로 적습니다.

    귀속은 #1844(25083f46e)입니다. konsist 베이스라인 10건 제거에 더해, 베이스라인에 없던 3건(toDto·replaceEditorMessages·buildMemorialWritePayload)까지 같이 처리했습니다. 이 3건이 베이스라인에 없던 이유는 analyzer 가 최상위 선언만 수집하는데 이들은 멤버이기 때문입니다.

    develop 에 남은 5건

    develop 의 ISSUE_1673_AFTERNOTE 집합이 그대로 이 5건입니다.

    심볼 develop 해소하는 커밋
    DeleteInProgressOverlay internal (detail/AfternoteDetailRoute.kt:60) #2021 ee53fe85c 가 AfternoteDetailContent.kt:145 로 옮기며 private 화
    EditorContent internal #1972 f6e902831
    editorContentSignature internal #1972 f6e902831
    Throwable.toAfternoteEditorError internal #1972 f6e902831
    EditorServiceSelectionSheetContent internal #1972 f6e902831

    본문의 「4 pending #1972 / 1 pending #2021」은 두 갈래로 갈라져 있지 않습니다. git merge-base --is-ancestor f6e902831 bebdcbe42 가 YES 라 #1972 의 4건은 이미 #2021 의 base 브랜치 안에 있고, #2021 은 나머지 1건과 함께 ISSUE_1673_AFTERNOTE 집합 자체를 지웁니다(그 HEAD 에서 ISSUE_1673 검색 0건). VisibilityBaseline.checkExact 는 신규 위반과 stale 항목을 양쪽 다 실패시키므로, 집합을 통째로 지운 커밋이 초록이라는 것이 afternote 잔여 위반 0의 근거입니다. 즉 이 이슈는 #2021 스택이 develop 에 들어오는 시점에 저절로 완결됩니다.

    AfternoteLightTheme 은 역행이 아닙니다

    #1844 가 src/main 에서 지웠지만 Nav3 머지 7d7c7afba(#1698)가 internal 로 되살렸습니다. 지금은 AfternoteNavHost.kt:63,86,96,109 와 ReceivedAfternoteNavHost.kt:11,41,49,63 에서 실제로 호출합니다. 같은 모듈의 다른 파일이 쓰는 선언이므로 internal 이 규칙상 맞는 층이고, 테스트 때문에 넓어진 가시성이 아닙니다. 원래 18건 목록에서 이 항목만 판정을 바꿔 적습니다.

    #2021 에 Closes #1673 을 달지 않는 이유

    1. refactor(afternote): 편집기 외 ViewModel 8개 MVI 전환 (#1968) #2021 의 제목 대표 이슈는 refactor(afternote): 편집기 외 기존 ViewModel 8개의 MVI 전환 #1968 입니다. refactor(afternote): 테스트 전용 접근으로 넓어진 presentation·mapper visibility 축소 #1673 의 잔여분은 세 PR 에 걸쳐 해소됐지 refactor(afternote): 편집기 외 ViewModel 8개 MVI 전환 (#1968) #2021 단독 성과가 아닙니다.
    2. merge-order-guard 는 closing 이슈의 열린 blocked_by 를 게이팅 집합에 넣습니다. 키워드를 더하면 이미 실패 중인 가드에 블로커만 추가됩니다.
    3. refactor(afternote): 편집기 외 ViewModel 8개 MVI 전환 (#1968) #2021 의 base 는 refactor/1804-editor-mvi 라 기본 브랜치 머지가 아니어서 auto-close 가 동작하지 않습니다.

    그래서 이 이슈는 열어 둡니다. 새 구현이나 cleanup 커밋을 만들 근거는 없고, #2021 스택이 develop 에 들어온 뒤 konsist 집합이 실제로 비는 것을 확인하고 닫는 것이 맞습니다.

    범위 밖 관찰 하나

    ISSUE_1672_CORE 의 PROFILE_ICON_TEST_TAG(core/ui/.../HomeTopBar.kt:24)는 여전히 feature 테스트가 참조합니다. konsist 주석은 소비 모듈을 feature:afternote, feature:receiver 로 적었지만 실제 두 번째는 feature:home 입니다(ReceiverHomeHeaderTest.kt). 소유가 #1672 라 여기서는 건드리지 않았습니다.

  4. OnlyReadOneBook commented on Sep 20, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    2026-09-20 최신 리비전에서 최초 인벤토리 18건을 다시 대조했습니다. 새로 구현할 선언은 없습니다.

    기준 현재 기준 충족 남은 테스트 전용 노출
    develop f69332d995a2e9890605b3c8075c427b2dd0cc8c 13 5
    PR #1972 fbf549703310991691a10a146788575aeb9d90ef 17 1
    PR #2021 b13a7026e312c037edfd223b089b50817faee640 18 0

    #1972가 EditorContent, EditorServiceSelectionSheetContent, editorContentSignature, Throwable.toAfternoteEditorError 네 건을 private으로 바꿉니다. #2021은 마지막 DeleteInProgressOverlay를 AfternoteDetailContent.kt 내부 private으로 옮기며 #1972를 실제 조상으로 포함합니다. 테스트는 화면 owner·ViewModel 저장 동작을 통해 검증합니다. 두 PR의 코드를 중복 구현하지 않습니다.

    본문의 AfternoteLightTheme 전제는 정정이 필요합니다. 현재 두 NavHost의 실제 프로덕션 호출은 7곳이며 같은 모듈의 다른 파일에서 소비하므로 internal이 최소 범위입니다. 8곳이라고 적었던 이전 기록은 import 한 줄까지 센 참조 수였습니다. screenshotTest 참조는 0건입니다. 테스트 소스셋으로 옮기면 실제 내비게이션이 컴파일되지 않습니다.

    #2021의 위 정확한 HEAD에서 :konsist:test --tests '*ProductionVisibilityKonsistTest'를 실행해 9건 모두 통과했습니다. 본래 13건은 develop에서 해소됐고, 분리한 5건까지 develop 도달을 확인하려면 #1972와 #2021 및 실제 선행 PR들의 병합을 확인해야 합니다. 현재 두 PR은 OPEN이므로 전체 18건의 develop 반영 완료로 보고하지 않습니다.

  5. added
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Sep 21, 2026
  6. github-actions commented on Sep 21, 2026

    @github-actions
    Contributor

    이 이슈를 맡은 PR 은 #2021 다 (base refactor/1804-editor-mvi).

    base 가 기본 브랜치(develop)가 아니라서 GitHub 은 이 이슈의 Development 칸에
    아무것도 표시하지 않는다. 본문에 Closes #N 이 있어도 마찬가지다 — 그 링크는 기본 브랜치를
    target 하는 PR 에서만 만들어진다.

    PR 이 닫히거나 머지되면 이 이슈의 pr-open 라벨은 다음 리컨사일에서 떨어진다.

  7. removed
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Oct 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

area:afternote애프터노트 기능 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions