Skip to content

fix(onboarding): 아이디 찾기 인증번호 발송·확인이 무잠금이라 연타가 요청을 두 번 낸다 #1864

Closed

Description

@OnlyReadOneBook

작업 유형

bug — 버그·오동작

주 담당 모듈

onboarding — 온보딩

개요

FindIdViewModel 의 두 함수가 상태 플래그만으로 중복 호출을 막으려 한다.

  • requestVerificationCode() — if (!state.isSendCodeEnabled) return
  • verifyCode() — if (!state.isVerifyEnabled) return

두 가드 모두 viewModelScope.launch 밖에서 상태를 캡처해 읽는다. launch 본문은 다음 루프에 돌므로 isSendingCode·isVerifying 이 상태에 반영되기 전에 두 번째 호출이 같은 false 를 읽고 통과한다. 실기기의 Dispatchers.Main 에서 빠른 두 탭이면 열리는 창이고, 버튼과 IME 제출이 각각 독립 경로라 「버튼 → 키보드 Done」 순서로도 열린다.

중복 요청이 낭비로 끝나지 않는다.

  • verifyCode → auth/email/find 는 BE EmailService.verifyAndDeleteCode 로 인증번호를 검증하며 지운다. 두 번째 요청은 코드가 이미 없어 1207 로 실패하고, 첫 요청이 성공했는데도 사용자에게는 "인증번호가 일치하지 않습니다" 가 인라인으로 뜬다.
  • requestVerificationCode → auth/find/send/code 는 코드를 새로 발급한다. 앞서 안내한 인증번호가 조용히 무효가 된다.

완료 조건

  • 진행 중인 Job 을 보고 막는다 — SignUpViewModel.signUpJob 과 같은 방식(if (job?.isActive == true) return 을 상태 캡처보다 먼저).
  • StandardTestDispatcher 로 「플래그 반영 전」 창을 재현하는 테스트를 붙인다. UnconfinedTestDispatcher 로는 이 결함이 통과한다 — launch 본문이 즉시 돌아 플래그가 이미 반영되기 때문이다.

자식 이슈

No response

참고

  • fix(onboarding): 프로필 완료 제출이 무잠금 — 회원가입 중복 호출·자동 로그인 실패 후 재가입 #710 이 회원가입에서 같은 결함을 고치며 SignUpViewModel.signUpJob 을 도입했다. 그 이슈의 범위가 프로필 완료 제출이라 아이디 찾기는 손대지 않았고, 같은 구조가 그대로 남았다.
  • 비밀번호 찾기 — 이메일 인증 후 비밀번호 재설정 #457 이 비밀번호 찾기 쪽 같은 결함을 988ec94a1 로 닫았다 — sendCodeJob·resetJob 두 개를 두고, 가드를 뺀 채 돌려 새 테스트 2건이 실패하는 것을 먼저 확인했다. 이 이슈는 같은 처방을 아이디 찾기에 적용하는 것이라 그 커밋을 그대로 참고하면 된다.
  • 기존 테스트가 있어도 안심할 수 없다. 비밀번호 찾기에는 제출이 진행 중이면 재호출이 재설정을 다시 부르지 않는다 가 이미 있었는데 UnconfinedTestDispatcher 라 결함이 있는 코드에서도 통과했다. 아이디 찾기 테스트도 같은 이유로 이 창을 못 보고 있을 수 있다.

Activity

  1. github-actions commented on Sep 3, 2026

    @github-actions
    Contributor

    bug 이슈는 사이드바 Fields > Priority 로 심각도를 지정해야 합니다. 판정 기준:

    • Urgent: 치명 — 크래시·데이터 소실·보안 무력화·핵심 경로 차단·가짜 성공
    • High: 심각 — 실패·틀린 값의 정상 위장, 핵심 기능 무동작
    • Medium: 불편 — 우회로가 있는 오동작·틀린 표시, 핵심 흐름은 유지
    • Low: 경미 — 문구·정렬·마감 품질 흠, 기능 영향 없음

    값이 비어 있어도 이슈를 닫지는 않습니다. 이 안내는 이슈당 한 번만 답니다.

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

    @github-actions
    Contributor

    이 이슈를 맡은 PR 은 #1982 다 (base refactor/1802-onboarding-mvi).

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

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

  4. Sadturtleman commented on Sep 11, 2026

    @Sadturtleman
    Collaborator

    고친 브랜치를 올려 뒀는데 모듈 담당 가드가 제 PR 을 막습니다 — @1hyok 이 가져가시면 그대로 쓸 수 있습니다.

    브랜치에 담긴 것

    • sendCodeJob·verifyJob 두 개를 두고 if (job?.isActive == true) return 을 상태 캡처보다 먼저 놓았습니다. 완료 조건에 적힌 SignUpViewModel.signUpJob·비밀번호 찾기 — 이메일 인증 후 비밀번호 재설정 #457 의 988ec94a1 과 같은 처방입니다.
    • 기존 isSendCodeEnabled·isVerifyEnabled 는 그대로 뒀습니다 — 쿨다운·이메일 형식·코드 길이는 Job 이 말하지 않는 조건입니다.
    • FindIdViewModelTest 3건을 새로 뒀습니다. StandardTestDispatcher 로 「플래그 반영 전」 창을 재현합니다.

    가드 제거 후 실패 확인

    이슈가 요구한 대로 가드 두 줄을 지우고 먼저 돌렸습니다.

    FindIdViewModelTest > 인증번호 확인 연타는 상태가 반영되기 전에도 조회를 한 번만 부른다 FAILED
    FindIdViewModelTest > 인증번호 발송 연타는 상태가 반영되기 전에도 요청을 한 번만 낸다 FAILED
    3 tests completed, 2 failed
    

    가드를 되살리면 3건 모두 초록이고, :feature:onboarding:presentation:testDebugUnitTest · ktlintCheck 도 통과합니다.

    base 를 #1825 로 잡은 이유

    #1825 가 FindIdViewModel 을 MVI 로 통째 다시 쓰는데 그 판에도 결함이 그대로 남아 있습니다 — requestVerificationCode()·verifyCode() 가 여전히 launch 밖에서 currentState 만 읽습니다. develop 에 고치면 #1825 리베이스에서 조용히 사라질 자리라 최종 형태 위에 얹었습니다.

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

    @github-actions
    Contributor

    이 이슈를 맡은 PR 은 #2101 다 (base refactor/1802-onboarding-mvi).

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

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

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

Metadata

Metadata

Assignees

Labels

area:onboarding온보딩 기능 영역bugSomething isn't working

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions