Skip to content

refactor(receiver): 마스터 키 UUID 의 이름 3종과 fromRaw 의 숨은 와이어 관용 정리 #1554

Description

@OnlyReadOneBook

작업 유형

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

주 담당 모듈

receiver — 수신자 관리

개요

수신자 모듈에서 이름이 실제 가리키는 것을 말해 주지 않는 곳 두 갈래를 정리한다. #1537 리뷰 중에 나온 지적이다.

1. 같은 UUID 를 부르는 이름이 셋이다

수신자가 발신자에게 받는 열람용 UUID 하나를, 층마다 다르게 부른다.

층 이름 근거
사용자 대면 마스터 키 receiver_verify_master_key_title 등 문자열 리소스 — 제품 용어
FE 화면·라우트 MasterKey* MasterKeyScreen·MasterKeyViewModel·MasterKeyRoute
FE 도메인·저장소 authCode ReceiverRepository.authCodeFlow·currentAuthCode()
FE 도메인 모델 accessCode ReceivedRecordBox.accessCode (#1537 로 신설)
서버 와이어 authCode 와 accessCode 응답에 따라 갈림 (아래)

한 시그니처 안에서 둘이 만나기도 한다.

suspend fun verifyMasterKey(authCode: String): Result<ReceiverIdentity>   // 이름 2개
recordBoxes.firstOrNull { it.accessCode == authCode }                      // 이름 2개, 같은 값

서버가 두 이름을 쓰는 것은 사실이다 (BE main da26ab4 + 2026-08-30 dev 실측).

GET /users/receivers          → "authCode":   "683fec31-…"
GET /receiver-auth/record-boxes → "accessCode": "683fec31-…"   # 같은 값
헤더는 X-Auth-Code, 컨트롤러 파라미터명은 authCode

ReceivedRecordBoxResponse.from() 이 receiver.getAuthCode() 를 accessCode 자리에 넣는다. 즉 와이어에서 이미 갈려 있고, 서버가 이름을 바꾸는 것은 깨지는 변경이라 기대하기 어렵다. 그러니 FE 가 경계(DTO)에서 한 번 흡수하고 안쪽 이름은 하나로 두는 것이 맞다. DTO 는 서버가 부르는 대로 두되, 도메인부터는 통일한다.

통일할 이름은 masterKey 로 정했다 (0830 일혁 확정). 사용자에게 보이는 말이 「마스터 키」이므로 화면 문구·화면 클래스(MasterKeyScreen)·코드가 한 단어로 모인다. authCode 는 변경 반경이 작다는 이점이 있지만, 그 이름은 서버 와이어에만 남기고 앱 안에서는 제품 용어를 쓴다.

범위 — 수신자 관점만, 발신자 쪽 authCode 는 건드리지 않는다

같은 UUID 라도 주체가 다른 두 갈래가 있고, 통일 대상은 앞쪽뿐이다.

갈래 무엇 위치 이번 범위
수신자 관점 수신자가 받아서 입력·저장·X-Auth-Code 로 보내는 키 feature/receiver (authCodeFlow·verifyMasterKey·ReceivedRecordBox.accessCode) ✅ masterKey 로 통일
발신자 관점 발신자가 수신자를 등록하고 돌려받는 키 core/model/user/UserModel.kt 의 Receiver·ReceiverDetail·ReceiverCreated ❌ 제외

발신자 쪽을 제외하는 이유는 둘이다.

  1. 코어 타입이라 남의 모듈을 끌고 온다 — Receiver.authCode 소비처가 setting(수신자 등록·편집)·timeletter·mindrecord·home 에 걸쳐 있다. 담당이 다른 모듈이라 이 이슈의 PR 에 넣지 않는다.
  2. 그쪽은 이름이 맞다 — 발신자 화면에서 이 값은 「마스터 키」로 불리지 않고, 서버 /users/receivers 응답 필드명도 authCode 다. 제품 용어가 「마스터 키」인 것은 수신자 화면 쪽이다.

즉 「마스터 키」라는 말이 쓰이는 곳에서만 이름을 그 말에 맞춘다.

2. DeliveryVerificationStatus.fromRaw 가 하는 일을 이름이 숨긴다

// feature/receiver/domain/.../ReceiverAuthModels.kt:50
fun fromRaw(value: String) = entries.firstOrNull { it.name.equals(value, ignoreCase = true) } ?: UNKNOWN

이 함수가 실제로 하는 것은 와이어 관용이다 — 대소문자를 무시하고, 모르는 값은 UNKNOWN 으로 흡수한다. 그런데

  • 이름의 Raw 는 그 문자열이 어디서 온 것인지 말하지 않는다.
  • 위치가 domain 모듈이다. 서버 문자열을 받아 주는 규칙이 도메인 타입에 붙어 있다.
  • UNKNOWN 은 상태라기보다 「서버가 예상 밖의 값을 보냈다」의 자리다.

결과적으로 서버가 상태를 하나 추가해도 앱은 조용히 UNKNOWN 으로 삼킨다. #1537 에서 DTO 의 보정형 기본값을 걷어낸 것과 같은 성격의 은폐인데, 이쪽은 도메인에 남아 있다.

이름만 fromWire/fromServerValue 로 바꿔도 출처는 드러난다. 다만 위치와 폴백 정책까지 볼지가 실제 판단이다 — 관용을 data 계층으로 내리면 도메인 enum 은 서버를 모르게 되고, 모르는 값을 만났을 때 삼킬지 드러낼지도 그 자리에서 정할 수 있다.

완료 조건

  • 마스터 키 UUID 의 FE 내부 이름을 masterKey 로 통일 (DTO 는 서버 필드명 authCode·accessCode 유지, 도메인·저장소·화면은 masterKey)
  • verifyMasterKey(authCode:) 처럼 한 시그니처에 두 이름이 섞인 곳 제거
  • fromRaw 의 이름이 출처를 밝히도록 변경, 또는 와이어 관용을 data 계층으로 이동
  • 모르는 상태 값을 UNKNOWN 으로 삼키는 정책을 유지할지 판단하고 근거를 남김
  • 통일된 이름을 KDoc 에 한 번 적어 다음 사람이 세 이름을 다시 헤매지 않게 함

참고

Activity

  1. added
    refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업
    area:receiver수신자 관리 기능 영역
    on Aug 30, 2026
  2. added
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    and removed
    pr-open이 이슈를 구현하는 PR 이 열려 있다 — base 가 기본 브랜치가 아니어도 드러낸다
    on Aug 30, 2026
  3. OnlyReadOneBook commented on Aug 30, 2026

    @OnlyReadOneBook
    CollaboratorAuthor

    1단계 — 마스터 키 이름 통일을 #1555 로 올렸다(스택: #1537 위).

    • DTO 는 서버 필드명(authCode·accessCode) 유지, 도메인·저장소·화면·테스트는 masterKey 로 통일
    • 발신자 갈래(core 의 Receiver.authCode)는 범위대로 제외
    • 저장 계약(DataStore 파일명·Preferences 키·X-Auth-Code)은 전부 보존 — 문자열 리터럴을 마스킹하고 코드 식별자에만 치환

    작업 중에 나온 것 — verifyEmailAuthCode(email, authCode) 의 authCode 는 마스터 키가 아니라 이메일로 오는 6자리 인증번호다. 일괄 치환이 이것까지 바꿔 컴파일이 깨져서 되돌렸다. 서버 요청 DTO 필드명도 authCode 라 그대로 두지만, 같은 이름이 두 개념에 쓰이는 혼선은 남아 있다.

    남은 것은 fromRaw 다. 이름만 fromWire 로 바꾸는 것은 절반이고, 관용을 data 로 내리려면 「모르는 상태 값을 삼킬지 드러낼지」라는 동작 판단이 따라온다 — 순수 rename 인 #1555 에 섞지 않았다.

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

    @github-actions
    Contributor

    이 이슈를 맡은 PR 은 #1557 다 (base refactor/1554-master-key-naming).

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

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

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

Metadata

Metadata

Labels

area:receiver수신자 관리 기능 영역refactor동작 변경 없이 코드 구조·책임·경계를 개선하는 작업

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions