Skip to content

[Feature/#9] 전화번호 인증 UI를 구현합니다.#13

Merged
wjdrjs00 merged 2 commits intodevelopfrom
feature/9-signup-phone-auth-ui
Oct 20, 2025
Merged

[Feature/#9] 전화번호 인증 UI를 구현합니다.#13
wjdrjs00 merged 2 commits intodevelopfrom
feature/9-signup-phone-auth-ui

Conversation

@wjdrjs00
Copy link
Collaborator

@wjdrjs00 wjdrjs00 commented Oct 20, 2025

Related issue 🛠

Work Description ✏️

  • 회원가입 flow 중 "전화번호 인증 UI"를 구현했습니다.
    • UI 구현 작업만을 진행했습니다. (비즈니스 로직 작업은 추후 명세가 확정되는 시점에 작업 진행 예정)

Screenshot 📸

스크린샷 2025-10-21 02 05 55

Uncompleted Tasks 😅

  • 추후 화면 고도화 대응하기 (구체사항은 노션 참고)

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 회원가입 흐름에 휴대폰 인증 화면 추가
    • 디자인 시스템에 검은색 버튼 색상 옵션 추가
  • UI 개선

    • 텍스트 필드 세로 간격 조정으로 더 나은 레이아웃 제공

- maBlackButtonColors 추가
- MaTextField 패딩 간격 수정
@wjdrjs00 wjdrjs00 self-assigned this Oct 20, 2025
@coderabbitai
Copy link

coderabbitai bot commented Oct 20, 2025

Walkthrough

디자인 시스템에 검은색 버튼 색상 프리셋을 추가하고, 텍스트 필드의 수직 패딩을 조정하며, 전화번호 인증 UI 화면을 새로 구현했습니다. 세 가지 별개의 UI 컴포넌트 개선 작업입니다.

Changes

Cohort / File(s) 요약
버튼 색상 프리셋 확장
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/button/MaButton.kt
MaButtonDefaultsmaBlackButtonColors() 메서드 추가. 검은 배경과 흰 컨텐츠로 구성된 새 버튼 색상 옵션 제공
텍스트 필드 간격 조정
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/textfield/MaTextField.kt
Row 컨테이너의 수직 패딩을 12.dp에서 16.dp로 증가하여 내부 수직 간격 조정
전화번호 인증 화면 구현
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt
공개 SignUpPhoneAuthScreen 컴포저블과 비공개 SignUpPhoneAuthScreenContent 추가. 전화번호 입력, 인증번호 입력, 다음 버튼을 포함한 가입 흐름 UI 구현

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant SignUpPhoneAuthScreen
    participant FormField
    participant MoaButton

    User->>SignUpPhoneAuthScreen: 화면 진입
    SignUpPhoneAuthScreen->>SignUpPhoneAuthScreenContent: 렌더링
    
    SignUpPhoneAuthScreenContent->>SignUpPhoneAuthScreenContent: phoneNumber 상태 초기화
    SignUpPhoneAuthScreenContent->>SignUpPhoneAuthScreenContent: authNumber 상태 초기화
    
    SignUpPhoneAuthScreenContent->>FormField: 전화번호 입력 필드 생성
    SignUpPhoneAuthScreenContent->>MoaButton: 인증 버튼 추가
    SignUpPhoneAuthScreenContent->>FormField: 인증번호 입력 필드 생성
    
    User->>FormField: 전화번호 입력
    FormField->>SignUpPhoneAuthScreenContent: phoneNumber 업데이트
    
    User->>MoaButton: 인증 버튼 클릭
    Note over MoaButton: 인증 요청 (미구현)
    
    User->>FormField: 인증번호 입력
    FormField->>SignUpPhoneAuthScreenContent: authNumber 업데이트
    
    User->>MoaButton: 다음 버튼 클릭
    Note over MoaButton: 다음 단계 진행
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 분

Possibly related PRs

Poem

🐰 검은 버튼 하나 추가되고,
텍스트는 숨 한 번 더 쉬고,
전화 인증 화면 반짝반짝,
온보딩의 길이 한 걸음 더 나아가네!
디자인 시스템, 우리 함께 자라가요~ ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Out of Scope Changes Check ❓ Inconclusive PR에는 SignUpPhoneAuthScreen 외에 MaButton.kt에 maBlackButtonColors() 메서드 추가와 MaTextField.kt의 수직 패딩 조정(12.dp → 16.dp)이 포함되어 있습니다. 이러한 디자인 시스템 변경사항들이 새로운 전화번호 인증 화면의 UI 구현에 필요한 지원 변경사항인지, 아니면 별도의 개선사항인지 PR 설명에서 명시적으로 언급되지 않았습니다. 따라서 이 변경사항들이 이슈 #9의 요구사항과 직접적인 연관성을 가지는지 불명확합니다. 디자인 시스템에 추가된 변경사항들이 SignUpPhoneAuthScreen 구현에 실제로 필요한 것인지 확인이 필요합니다. MaTextField 패딩 조정과 MaButton 색상 추가가 새로운 화면의 설계에 필수적인지, 아니면 별도의 스타일링 개선인지 PR 설명에서 명확히 해주시면 좋겠습니다.
✅ Passed checks (3 passed)
Check name Status Explanation
Title Check ✅ Passed PR 제목 "[Feature/#9] 전화번호 인증 UI를 구현합니다."는 변경사항의 주요 내용을 명확하게 설명하고 있습니다. 제목은 연결된 이슈 #9의 목표인 전화번호 인증 UI 구현과 정확히 일치하며, 구체적이고 이해하기 쉬운 표현으로 되어 있습니다. 개발자가 커밋 이력을 훑어볼 때 이 PR의 주요 변경사항을 즉시 파악할 수 있습니다.
Linked Issues Check ✅ Passed PR의 주요 변경사항인 SignUpPhoneAuthScreen 구현은 이슈 #9의 "전화번호 인증 UI를 구현합니다"라는 목표를 정확히 충족합니다. 새로운 Compose 기반 UI 컴포넌트가 추가되었으며, 휴대폰 번호 입력, 인증 번호 입력, 다음 버튼 등 전화번호 인증 흐름에 필요한 UI 요소들이 모두 구현되었습니다. 설명에서 언급한 대로 비즈니스 로직은 추후 진행될 예정이며, 현재는 순수 UI 구현에 집중한 상태입니다.
Description Check ✅ Passed PR 설명은 저장소의 템플릿 구조를 잘 따르고 있습니다. 필수 섹션인 "Related issue", "Work Description", "Screenshot", "Uncompleted Tasks"가 모두 제공되었으며, 각 섹션이 적절히 작성되어 있습니다. 작업 내용은 명확하게 UI 구현만 진행되었음을 설명하고 있고, 스크린샷도 포함되어 있으며, 향후 작업 항목도 명시되어 있습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/9-signup-phone-auth-ui

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt (1)

83-83: 불필요한 파라미터를 제거하세요.

enabled = trueMaButton의 기본값이므로 명시할 필요가 없습니다.

                         MaButton(
                             onClick = {},
-                            enabled = true,
                             colors = MaButtonDefaults.maBlackButtonColors(),
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bd6cb7c and 4c13fd7.

📒 Files selected for processing (3)
  • core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/button/MaButton.kt (1 hunks)
  • core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/textfield/MaTextField.kt (1 hunks)
  • feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt (4)
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/product/topbar/MaTopAppBar.kt (1)
  • MaTopAppBar (20-52)
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/product/layout/FormField.kt (1)
  • FormField (18-37)
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/textfield/MaTextField.kt (1)
  • MaTextField (32-99)
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/button/MaButton.kt (1)
  • MaButton (30-68)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Run Unit Tests
🔇 Additional comments (3)
core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/textfield/MaTextField.kt (1)

81-81: 수직 패딩 조정이 적절합니다.

텍스트 필드의 수직 패딩을 12.dp에서 16.dp로 증가시켜 더 나은 수직 리듬과 터치 영역을 제공합니다.

core/designsystem/src/main/kotlin/com/moa/app/designsystem/component/core/button/MaButton.kt (1)

85-94: 검은색 버튼 색상 프리셋 추가가 적절합니다.

기존 maButtonColors()와 동일한 패턴을 따르며, disabled 상태에 coolGray95를 사용하는 것이 적절합니다. 디자인 시스템의 일관성을 유지하면서 새로운 색상 옵션을 제공합니다.

feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt (1)

31-33: 화면 구조가 적절합니다.

Public 진입점과 private 구현을 분리하는 패턴이 적절하며, 추후 비즈니스 로직 통합 시 유연성을 제공합니다.

Comment on lines +63 to +96
FormField(
isError = true,
errorMessage = "어쩌구"
) {
MaTextField(
value = phoneNumber,
onValueChange = { newValue -> phoneNumber = newValue },
isError = true,
maxLines = 1,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone),
placeholder = {
Text(
text = "예) 010-1234-5678",
color = MoaTheme.colors.coolGray60,
style = MoaTheme.typography.body1Medium,
)
},
trailingContent = {
MaButton(
onClick = {},
enabled = true,
colors = MaButtonDefaults.maBlackButtonColors(),
shape = RoundedCornerShape(8.dp)
) {
Text(
text = "인증",
style = MoaTheme.typography.body2Bold,
color = MoaTheme.colors.white,
modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp)
)
}
}
)
}
Copy link

@coderabbitai coderabbitai bot Oct 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

하드코딩된 에러 상태를 제거해야 합니다.

isError = trueerrorMessage = "어쩌구"가 하드코딩되어 있습니다. UI 구현 단계라는 점을 고려하더라도, 프로덕션 코드에 테스트용 하드코딩이 남아있으면 안 됩니다.

다음 중 하나를 선택하세요:

  • 실제 상태 변수와 연결 (권장)
  • Preview에서만 하드코딩된 값 사용
  • 기본값을 falsenull로 설정
             FormField(
-                isError = true,
-                errorMessage = "어쩌구"
+                isError = false,
+                errorMessage = null
             ) {
                 MaTextField(
                     value = phoneNumber,
                     onValueChange = { newValue -> phoneNumber = newValue },
-                    isError = true,
+                    isError = false,
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
FormField(
isError = true,
errorMessage = "어쩌구"
) {
MaTextField(
value = phoneNumber,
onValueChange = { newValue -> phoneNumber = newValue },
isError = true,
maxLines = 1,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone),
placeholder = {
Text(
text = "예) 010-1234-5678",
color = MoaTheme.colors.coolGray60,
style = MoaTheme.typography.body1Medium,
)
},
trailingContent = {
MaButton(
onClick = {},
enabled = true,
colors = MaButtonDefaults.maBlackButtonColors(),
shape = RoundedCornerShape(8.dp)
) {
Text(
text = "인증",
style = MoaTheme.typography.body2Bold,
color = MoaTheme.colors.white,
modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp)
)
}
}
)
}
FormField(
isError = false,
errorMessage = null
) {
MaTextField(
value = phoneNumber,
onValueChange = { newValue -> phoneNumber = newValue },
isError = false,
maxLines = 1,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone),
placeholder = {
Text(
text = "예) 010-1234-5678",
color = MoaTheme.colors.coolGray60,
style = MoaTheme.typography.body1Medium,
)
},
trailingContent = {
MaButton(
onClick = {},
enabled = true,
colors = MaButtonDefaults.maBlackButtonColors(),
shape = RoundedCornerShape(8.dp)
) {
Text(
text = "인증",
style = MoaTheme.typography.body2Bold,
color = MoaTheme.colors.white,
modifier = Modifier.padding(horizontal = 12.dp, vertical = 4.dp)
)
}
}
)
}
🤖 Prompt for AI Agents
In
feature/onboarding/src/main/kotlin/com/moa/app/feature/onboarding/signup/SignUpPhoneAuthScreen.kt
around lines 63-96, the FormField and MaTextField are hardcoding error state
(isError = true, errorMessage = "어쩌구"); replace these hardcoded values with a
real state-driven implementation (e.g., add a phoneError: String? and
phoneIsError: Boolean state, bind errorMessage = phoneError and isError =
phoneIsError), or if this is only for preview move the hardcoded values into the
@Preview composable, otherwise set defaults to isError = false and errorMessage
= null and wire validation logic to update those states when the phone input
changes.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

프로덕션 코드에 테스트용 하드코딩이 남아 있으면 안된다는 말에는 동의 but 해당 플젝은 사플이고, 고도화 전의 ui 단계라 상관없을듯

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wjdrjs00 이해했습니다! 사이드 프로젝트의 초기 UI 구현 단계라는 점을 고려하면 충분히 합리적인 판단이네요. 나중에 비즈니스 로직을 구현하실 때 실제 상태와 연결하시면 될 것 같습니다. 👍

@wjdrjs00 wjdrjs00 merged commit 801637b into develop Oct 20, 2025
4 checks passed
@wjdrjs00 wjdrjs00 deleted the feature/9-signup-phone-auth-ui branch October 20, 2025 17:19
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.

[Feature] 전화번호 인증 UI를 구현합니다.

1 participant