Skip to content

Conversation

@chanho0908
Copy link
Member

@chanho0908 chanho0908 commented Feb 10, 2026

이슈 번호

#80

리뷰/머지 희망 기한 (선택)

작업내용

  • 로그인 화면 디자인 적용

결과물

image

리뷰어에게 추가로 요구하는 사항 (선택)

- 로그인 화면 UI를 구현했습니다.
- 로고, 캐릭터 이미지, 타이틀 문구를 추가했습니다.
@chanho0908 chanho0908 self-assigned this Feb 10, 2026
@chanho0908 chanho0908 added the Feature Extra attention is needed label Feb 10, 2026
@chanho0908 chanho0908 linked an issue Feb 10, 2026 that may be closed by this pull request
@coderabbitai
Copy link

coderabbitai bot commented Feb 10, 2026

📝 Walkthrough

Walkthrough

이 변경은 로그인 화면 관련 리소스와 UI 컴포넌트의 추가·수정입니다. 두 개의 벡터 drawable(ic_app_logo.xml, ic_keepi_singing.xml)이 core/design-system에 추가되었고, LoginScreen 컴포저블이 Box 기반에서 Scaffold 기반으로 레이아웃을 변경하여 innerPadding을 적용하도록 리팩토링되었습니다. LoginButton에 외부 Modifier 파라미터가 추가되어 호출자에서 레이아웃 수정이 가능해졌으며, 로그인 타이틀 문자열 리소스(login_title_message)가 feature/login의 values에 추가되었습니다.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

상세 리뷰 코멘트

긍정적인 측면 ✨

  • Scaffold 도입은 시스템 인셋 처리와 구조화된 레이아웃에 유리합니다. (왜 좋은가: 상단/하단 요소 관리가 쉬워짐)
    → 유지보수성과 확장성 측면에서 올바른 방향입니다.
  • LoginButton에 Modifier 파라미터를 추가한 것은 컴포저블 재사용성을 높입니다. (왜 좋은가: 호출자가 레이아웃/스타일을 제어 가능)
  • 벡터 drawable을 리소스로 추가해 해상도 독립적 이미지를 제공한 점은 적절합니다.

검토가 필요한 부분 🔍

  1. LoginScreen의 배경색 하드코딩
  • 왜 문제가 되는가: 현재 흰색(.background(Color.White))으로 고정하면 다크 모드나 테마 변경 시 일관성 문제 발생.
  • 어떻게 개선할 수 있는가: MaterialTheme.colorScheme.background 또는 theme 토큰으로 대체하세요.
    예:
    modifier = Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)
  • 질문: 앱 전반의 테마 정책에 따라 다크 모드 지원 계획이 있나요?
  1. ic_keepi_singing.xml 복잡도 및 퍼포먼스
  • 왜 문제가 되는가: 긴 벡터 경로(242줄)는 렌더링 비용과 유지보수성에 영향.
  • 어떻게 개선할 수 있는가: 디자이너와 협의해 벡터 경로를 단순화하거나, 애니메이션/확대가 필요 없다면 WebP/PNG로 대체를 고려하세요. 또한 SVGO 유사 도구로 path 최적화 가능.
  • 질문: 이 리소스가 벡터여야 하는 특별한 이유(확대/애니메이션 등)가 있나요?
  1. 여백 및 Spacer 사용의 일관성
  • 왜 문제가 되는가: 코드에 고정된 매직 넘버(Spacer 높이, padding 등)가 흩어져 있으면 디자인 일관성 저해.
  • 어떻게 개선할 수 있는가: 디자인 토큰(Dimen, Spacing)이나 Theme 기반 값을 사용하도록 통일하세요.
    예: Spacer(modifier = Modifier.height(Dimens.spaceLarge))
  1. LoginButton modifier 병합 방식
  • 왜 문제가 되는가: 외부 modifier를 그대로 대체하면 내부에서 적용하던 기본 modifier가 누락될 수 있음.
  • 어떻게 개선할 수 있는가: caller로부터 받은 modifier를 내부 기본 modifier와 chain으로 합치세요.
    예: modifier = modifier.then(defaultModifier) 또는 기본 후에 modifier.then(...)
  • 질문: 현재 구현에서 내부 기본 modifier(예: padding, clickable 등)를 유지하고 있나요?
  1. 문자열 리소스 다국어 대응
  • 왜 문제가 되는가: values/strings.xml에 한국어만 추가되어 있으면 다국어 앱에서 누락 발생.
  • 어떻게 개선할 수 있는가: 필요한 타겟 언어에 대해 번역 파일(values-xx/strings.xml)을 추가하거나, 추후 번역 요청 프로세스를 문서화하세요.
  • 질문: 릴리스 전에 번역 파이프라인(예: PO/번역 툴)을 적용할 계획이 있나요?

제안 사항 💡

  • 복잡한 벡터 파일은 PR 코멘트에 디자인 소스(Figma, SVG 원본)나 최적화 방법을 첨부하면 리뷰가 빨라집니다.
  • LoginButton에 기본 스타일을 유지하면서 외부 modifier를 적용하는 형태(예: modifier = Modifier.then(externalModifier))로 구현하면 통합성이 높아집니다.
  • 테마 컬러와 spacing 토큰을 활용해 UI 일관성을 확보하세요.

필요하면 해당 파일들에 대해 구체적인 코드 스니펫 변경 제안을 바로 작성해 드리겠습니다.

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목 '로그인 화면 디자인 적용'은 변경사항의 주요 내용을 명확하게 설명합니다.
Description check ✅ Passed PR 설명은 이슈 번호(#80), 작업 내용(로그인 화면 디자인 적용), 그리고 결과물 스크린샷을 포함하여 변경사항과 관련된 충분한 정보를 제공합니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 #80-login-design

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
feature/login/src/main/java/com/twix/login/LoginScreen.kt (1)

104-112: 주석 처리된 코드 정리가 필요합니다

LoginType.entries.forEach 반복문이 주석 처리되어 있고 현재 LoginType.GOOGLE만 하드코딩되어 있습니다. 의도적인 변경이라면 주석 처리된 코드를 제거하는 것이 좋고, 추후 다른 로그인 타입을 지원할 계획이라면 TODO 주석으로 명시해 두는 것이 코드 가독성과 유지보수 측면에서 더 바람직합니다.

-            // LoginType.entries.forEach { type ->
             LoginButton(
                 type = LoginType.GOOGLE,
                 onClickLogin = onClickLogin,
                 modifier =
                     Modifier
                         .padding(horizontal = 20.dp),
             )
-            // }
+            // TODO: 다른 로그인 타입 지원 시 LoginType.entries.forEach 활용

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: 2

🤖 Fix all issues with AI agents
In `@feature/login/src/main/java/com/twix/login/LoginScreen.kt`:
- Around line 99-104: Image composable is passing modifier = Modifier which is
redundant and may leave the image unconstrained; either remove the modifier
parameter entirely from the Image(...) call (since Modifier is default) or
replace it with a size/constraint modifier (e.g., Modifier.size/width/height or
Modifier.fillMaxWidth with aspectRatio) to limit the intrinsic 390x420dp
drawable; locate the Image(...) that uses
ImageVector.vectorResource(...com.twix.designsystem.R.drawable.ic_keepi_singing)
and update the modifier accordingly.
- Around line 66-117: The Column content can overflow on small screens; update
the composable by making the parent Column scrollable (add
Modifier.verticalScroll(rememberScrollState())) or convert the large Spacers to
flexible space using Modifier.weight(1f) so elements (e.g., LoginButton) aren’t
pushed off-screen, and constrain the ic_keepi_singing Image by applying a
responsive modifier (e.g., sizeIn/maxHeight or fillMaxWidth with aspectRatio) so
its intrinsic 390x420dp won’t force overflow; locate these changes around the
Column, the Spacer usages, the Image referencing
com.twix.designsystem.R.drawable.ic_keepi_singing, and the LoginButton
invocation.
🧹 Nitpick comments (4)
core/design-system/src/main/res/drawable/ic_app_logo.xml (1)

1-29: Dark Mode 지원 관련 고려 사항

로고의 fillColor#171717로 하드코딩되어 있습니다. 현재 LoginScreen에서 CommonColor.White 배경을 명시적으로 설정하고 있어 당장은 문제가 되지 않지만, 향후 Dark Mode를 지원하게 되면 어두운 배경 위에서 로고가 보이지 않을 수 있습니다.

필요한 경우 색상 리소스(@color/...)나 테마 속성(?attr/...)을 활용하여 테마에 따라 색상이 변경되도록 하는 방법도 있습니다.

As per coding guidelines, 디자인 시스템 리뷰 가이드: "Dark Mode 지원 여부"

core/design-system/src/main/res/drawable/ic_keepi_singing.xml (1)

1-242: 복잡한 벡터 드로어블의 성능 고려

이 벡터 드로어블은 390x420dp 크기에 약 40개 이상의 복잡한 베지에 곡선 path를 포함하고 있습니다. Android에서 복잡한 벡터 드로어블은 매 프레임마다 Canvas에 그려지므로, 저사양 기기에서 렌더링 비용이 발생할 수 있습니다.

로그인 화면이라 리스트처럼 반복 렌더링되는 것은 아니므로 당장 큰 문제는 아니지만, 만약 성능 이슈가 관찰된다면 WebP 비트맵 이미지로 대체하는 것을 고려해볼 수 있습니다. Android 공식 문서에서도 복잡한 일러스트레이션의 경우 비트맵을 권장합니다.

feature/login/src/main/java/com/twix/login/LoginScreen.kt (2)

78-84: 앱 로고에 contentDescription 추가를 권장합니다.

ic_app_logo는 앱의 브랜딩 요소로, 스크린 리더 사용자에게 앱 이름을 전달하는 것이 접근성 관점에서 좋습니다. 순수 장식 요소인 ic_keepi_singingnull로 두는 것이 맞지만, 로고는 의미가 있는 이미지입니다.

예시
             Image(
                 imageVector = ImageVector.vectorResource(com.twix.designsystem.R.drawable.ic_app_logo),
-                contentDescription = null,
+                contentDescription = stringResource(R.string.app_name),
                 modifier =
                     Modifier
                         .padding(start = 24.dp),
             )

As per coding guidelines, 디자인 시스템 리뷰 가이드: "접근성(Accessibility) 고려 여부"


106-114: 주석 처리된 코드 정리 제안

LoginType.entries.forEach 반복문이 주석 처리되어 있고 LoginButton.kt에도 KAKAO 관련 TODO가 있는 것으로 보아, 카카오 로그인은 추후 구현 예정인 것으로 보입니다. 주석 처리된 코드가 길게 남아 있으면 가독성을 해칠 수 있으니, 카카오 로그인 구현 시 다시 추가하는 것이 깔끔할 것 같습니다. 다만 곧 구현 예정이라면 현 상태도 괜찮습니다.

Comment on lines 66 to 117
Scaffold(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center,
) {
) { innerPadding ->
Column(
modifier =
Modifier
.fillMaxWidth()
.padding(horizontal = 20.dp),
verticalArrangement = Arrangement.spacedBy(12.dp),
.padding(innerPadding)
.fillMaxSize()
.background(CommonColor.White),
) {
Spacer(Modifier.height(35.dp))

Image(
imageVector = ImageVector.vectorResource(com.twix.designsystem.R.drawable.ic_app_logo),
contentDescription = null,
modifier =
Modifier
.padding(start = 24.dp),
)

Spacer(Modifier.height(24.dp))

AppText(
text = stringResource(R.string.login_title_message),
style = AppTextStyle.H3,
color = GrayColor.C500,
modifier =
Modifier
.padding(start = 24.dp),
)

Spacer(Modifier.height(27.dp))

Image(
imageVector = ImageVector.vectorResource(com.twix.designsystem.R.drawable.ic_keepi_singing),
contentDescription = null,
modifier =
Modifier,
)

// LoginType.entries.forEach { type ->
LoginButton(type = LoginType.GOOGLE, onClickLogin = onClickLogin)
LoginButton(
type = LoginType.GOOGLE,
onClickLogin = onClickLogin,
modifier =
Modifier
.padding(horizontal = 20.dp),
)
// }

Spacer(Modifier.height(27.dp))
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

다양한 화면 크기에서 레이아웃 오버플로우 가능성

현재 Column에 고정 높이의 Spacer들과 내재 크기 390x420dpic_keepi_singing 이미지가 포함되어 있습니다. 작은 화면의 기기에서는 전체 콘텐츠가 화면을 초과하여 LoginButton이 잘리거나 보이지 않을 수 있습니다.

개선 방향으로 두 가지를 제안드립니다:

  1. ColumnverticalScroll을 추가하거나, SpacerModifier.weight(1f)를 활용하여 유연한 레이아웃을 구성
  2. 이미지에 크기 제약을 추가하여 화면 비율에 맞게 조절
예시: weight를 활용한 유연한 레이아웃
         ) {
             Spacer(Modifier.height(35.dp))
 
             Image(
                 imageVector = ImageVector.vectorResource(com.twix.designsystem.R.drawable.ic_app_logo),
                 contentDescription = null,
                 modifier =
                     Modifier
                         .padding(start = 24.dp),
             )
 
             Spacer(Modifier.height(24.dp))
 
             AppText(
                 text = stringResource(R.string.login_title_message),
                 style = AppTextStyle.H3,
                 color = GrayColor.C500,
                 modifier =
                     Modifier
                         .padding(start = 24.dp),
             )
 
-            Spacer(Modifier.height(27.dp))
+            Spacer(Modifier.weight(1f))
 
             Image(
                 imageVector = ImageVector.vectorResource(com.twix.designsystem.R.drawable.ic_keepi_singing),
                 contentDescription = null,
-                modifier =
-                Modifier,
+                modifier = Modifier.fillMaxWidth(),
             )
 
             LoginButton(
                 type = LoginType.GOOGLE,
                 onClickLogin = onClickLogin,
                 modifier =
                     Modifier
                         .padding(horizontal = 20.dp),
             )
 
             Spacer(Modifier.height(27.dp))
         }
🤖 Prompt for AI Agents
In `@feature/login/src/main/java/com/twix/login/LoginScreen.kt` around lines 66 -
117, The Column content can overflow on small screens; update the composable by
making the parent Column scrollable (add
Modifier.verticalScroll(rememberScrollState())) or convert the large Spacers to
flexible space using Modifier.weight(1f) so elements (e.g., LoginButton) aren’t
pushed off-screen, and constrain the ic_keepi_singing Image by applying a
responsive modifier (e.g., sizeIn/maxHeight or fillMaxWidth with aspectRatio) so
its intrinsic 390x420dp won’t force overflow; locate these changes around the
Column, the Spacer usages, the Image referencing
com.twix.designsystem.R.drawable.ic_keepi_singing, and the LoginButton
invocation.

@chanho0908 chanho0908 requested a review from dogmania February 10, 2026 09:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Feature Extra attention is needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

로그인 화면 디자인 적용

1 participant