Skip to content

refactor(receiver): 수신자 서버 거절 예외 4종을 ReceiverFailure.ServerRejection 하나로 압축 (#934 4-A) [base: develop] - #1054

Merged
1hyok merged 2 commits into
developfrom
refactor/934-2-receiver
Aug 25, 2026
Merged

1hyok merged 2 commits into
developfrom
refactor/934-2-receiver

Conversation

@1hyok

@1hyok 1hyok commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

#934 의 4-A 단계만 담는다. 1·2단계는 #1051, 4-B(애프터노트)는 별도 PR — 이슈는 닫지 않는다.

무엇을

ReceiverServerRejectionException(sealed 루트) + 하위 3종(MasterKey·EmailAuth·DeliveryVerification) → ReceiverFailure.ServerRejection 하나. 파일 4개 → 1개.

왜 하위 타입을 지우나

나눠 둔 명분은 KDoc 상 "사유 code 별 분기를 넣을 때 when 이 누락을 잡아준다" 였는데, 셋을 갈라 보는 프로덕션 코드가 없었다. 소비처는 상위 타입만 보고, data 계층은 셋을 만들기만 했다. 어느 endpoint 가 거절했는지는 stack trace 에 남으므로 타입으로 나눌 이유가 없다. 구분이 실제로 필요해지면 그때 필드를 더한다.

묶기만 하지 않았다

toErrorPayload 와 shouldReportInReceiverFlow 는 단일 타입 캐스팅(as? / is)이라 sealed 이득이 0 이었다. 루트로 좁혀 when 을 exhaustive 하게 만들어, 수신자 실패 유형이 늘면 두 소비처가 컴파일 에러로 잡힌다.

판정 기준은 그대로다 — 4xx 대역·code allowlist·문구 유무 모두 손대지 않았으므로 화면 문구와 텔레메트리 기록 대상이 변하지 않는다.

회귀 가드

노출 게이트는 사용자가 보는 스낵바 문구를 직접 좌우한다(#651 이 고친 회귀). ErrorPayloadTest 6케이스·ReceiverFlowReportingTest 4케이스를 케이스 그대로 이행했다 — 5xx 문구 제외, 미등재 code 폴백, 문구 없는 4xx 폴백 등 조합이 전부 살아 있다.

주석 정리 동반

대상 처리
USER_DISPLAYABLE_SERVER_CODES 의 code 별 의미 나열 제거 — BE 소유이고 한 번 틀려 #654 로 정정한 자리다. "신규 code 는 문구 확인 후 등재" 규약만 남김
ErrorPayload KDoc 의 통일은 #446 소관 제거 — 오참조다. 실제 소관은 #604(그 본문이 #446 과 층이 다름을 명시)
status 만 보고 code 를 안 보면… 판정 근거 진입점 → 실제로 판정하는 함수 자리로 이동
shouldReportInReceiverFlow KDoc 판정표 제거 — 코드와 중복. 근거 3문단은 1문단으로 압축
AfternoteFailureStage 하단 이전 이력(#615) 제거

남긴 것: Crashlytics 8건 보관 한도(+공식 문서 링크), 마스터 키를 대신 획득하지 않는 이유(#454), 업로드 진행 중 잠금(#711), @Valid 실패가 리터럴 code=400 으로 온다는 실측(#600).

검증

게이트 결과
:app:compileDebugUnitTestKotlin green
:app:compileDebugAndroidTestKotlin (#949 신설) green
전 모듈 ktlintCheck green
:feature:receiver:data · :feature:receiver:presentation · :feature:afternote:presentation testDebugUnitTest green

시각 검증 해당 없음 — 리소스·Compose 변경 0(바뀐 presentation 파일은 상태 data class 와 ViewModel). baseline 사이클 미실행.

리뷰어에게

…하나로 압축

sealed 루트 ReceiverServerRejectionException 과 하위 3종(MasterKey·EmailAuth·
DeliveryVerification)을 ReceiverFailure.ServerRejection 하나로 줄인다.

하위 타입을 나눈 명분은 KDoc 상 "사유 code 별 분기를 넣을 때 when 이 누락을 잡아준다" 였으나,
셋을 갈라 보는 프로덕션 코드가 없었다 — 소비처는 상위 타입만 보고 data 계층은 셋을 만들기만
했다. 어느 endpoint 가 거절했는지는 stack trace 에 남는다.

소비처는 루트로 좁혀 when 을 exhaustive 하게 만들었다. toErrorPayload 와
shouldReportInReceiverFlow 가 단일 타입 캐스팅이라 sealed 이득이 0 이었던 것을, 수신자 실패
유형이 늘면 두 곳이 컴파일 에러로 잡히게 했다. 판정 기준(4xx 대역·code allowlist·문구 유무)은
그대로라 동작은 변하지 않는다.

토스트·스낵바 문구를 좌우하는 노출 게이트를 건드리므로 ErrorPayloadTest 6케이스와
ReceiverFlowReportingTest 4케이스를 그대로 이행해 회귀 가드를 유지했다.

함께 수신자 열람 인증 화면의 주석을 정리했다. USER_DISPLAYABLE_SERVER_CODES 의 code 별 의미
나열은 BE 소유라 걷었다 — 한 번 틀려 #654 로 정정한 자리다. ErrorPayload KDoc 의 통일 소관
표기(#446)는 오참조라 제거했고(실제 소관은 #604), 판정 근거 주석은 실제로 판정하는 함수
자리로 옮겼다. AfternoteFailureReporting 의 판정표는 코드와 중복이라 걷고 근거만 압축했다.
@github-actions github-actions Bot added the conflict base 와 충돌 — CI 가 트리거되지 않는다. base 를 병합하면 자동으로 떨어진다 label Aug 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

이 PR 은 develop 와 충돌 상태이고, 그래서 CI 가 돌지 않는다.

pull_request 워크플로는 base 와 head 를 합친 가상 머지 커밋(refs/pull/<N>/merge)에서
실행되는데, 충돌이면 GitHub 이 그 ref 를 만들지 못해 워크플로가 트리거조차 되지 않는다.
체크가 실패하는 것이 아니라 아예 생성되지 않으므로, 새 커밋을 올려도 no checks reported
인 채 최신 커밋이 한 번도 검증되지 않은 상태로 남는다 (#1028).

develop 를 병합해 충돌을 풀면 검증이 다시 돈다. 해소되면 이 라벨은 자동으로 떨어진다.

…eiver

# Conflicts:
#	feature/afternote/presentation/src/main/kotlin/com/afternote/feature/afternote/presentation/reporting/AfternoteFailureReporting.kt
@1hyok
1hyok merged commit 703862b into develop Aug 25, 2026
13 checks passed
@1hyok
1hyok deleted the refactor/934-2-receiver branch August 25, 2026 04:00
1hyok added a commit that referenced this pull request Aug 25, 2026
AppAndReceiverCompletionAndroidTest 의 import 블록에서 충돌했다. #1054 가
ReceiverEmailAuthException 을 ReceiverFailure 로 접었고(#934), 이 브랜치는 같은
자리에서 MindRecordReceiverRepository import 를 픽스처로 바꿨다. 양쪽을 합쳐
FakeMindRecordReceiverRepository + ReceiverFailure 를 남긴다. 본문의 사용처는
자동 병합으로 develop 쪽 변경이 그대로 들어왔다.

검증: :koverXmlReportCi :konsist:test :build-logic:test
:app:compileDebugAndroidTestKotlin 전 모듈 ktlintCheck 통과.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

conflict base 와 충돌 — CI 가 트리거되지 않는다. base 를 병합하면 자동으로 떨어진다

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants