Skip to content

[Chore/#29] 수정사항 반영#34

Merged
jyvnee merged 6 commits intodevelopfrom
chore/#29-correction
Jan 14, 2026
Merged

[Chore/#29] 수정사항 반영#34
jyvnee merged 6 commits intodevelopfrom
chore/#29-correction

Conversation

@jyvnee
Copy link
Copy Markdown
Contributor

@jyvnee jyvnee commented Jan 14, 2026

Related issue 🛠️

Work Description ✏️

  • 컬러 시스템 수정
  • 버튼 공통 string 추출
  • enum class 위치 변경

Screenshot 📸

버튼 공통 string 추출

image

Uncompleted Tasks 😅

N/A

To Reviewers 📢

여러분 string 추출할 때 어디서 쓰는지 주석 처리 꼭 해주세용!!!

그리고 뷰모델 core/base 에 있는 BaseViewModel 상속받아야 하는데 생성할 때 UiState, UiIntent, Uieffect 안 넘겨주면 오류나서 일단 hiltviewmodel 상속받도록 했습니당. 각자 뷰모델 짤 때 꼭 BaseViewModel로 바꿔주세요!!!

+) 버튼 공통 컴포넌트에 enum class 위에 있으면 좋을 것 같아서 위치 이동 했습니다

Summary by CodeRabbit

릴리스 노트

  • Refactor

    • 버튼 컴포넌트 구조 개선으로 코드 유지보수성 향상
    • 헤더 탭 렌더링 로직 최적화 및 테마 기반 색상 적용
  • New Features

    • 버튼 관련 새로운 문자열 리소스 추가 (Next, Skip, Start, Reset, Done, Continue, Select All)
  • Chores

    • 의존성 주입 프레임워크 통합으로 애플리케이션 아키텍처 개선

✏️ Tip: You can customize this high-level summary in your review settings.

@jyvnee jyvnee requested a review from a team January 14, 2026 13:49
@jyvnee jyvnee self-assigned this Jan 14, 2026
@jyvnee jyvnee added ❤️‍🩹 Chore 작은 수정(타입변수, 패키지구조 변경 등) ✨ 지현 labels Jan 14, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Jan 14, 2026

📝 Walkthrough

Walkthrough

여러 버튼 컴포넌트 파일에서 enum 타입 정의를 중복 제거하고 파일 상단으로 통합하며, PotiHeaderSection에서 탭 렌더링 로직을 분리하고 테마 컬러를 적용했습니다. MainActivity에 Dagger Hilt 의존성 주입을 활성화하고 문자열 리소스를 추가했습니다.

Changes

Cohort / File(s) Summary
버튼 컴포넌트 Enum 통합
PotiActionButton.kt, PotiChipButton.kt, PotiDeleteButton.kt, PotiModalButton.kt
각 파일에서 버튼 타입 enum(ActionButtonType, ChipButtonType, DeleteButtonType, ModalButtonType)을 파일 상단으로 이동하고 하단의 중복 정의 제거. 각 enum에 getBackgroundColor(), getContentColor() 헬퍼 메서드 포함
헤더 섹션 리팩토링
PotiHeaderSection.kt
탭 렌더링 로직을 PotiHeaderSectionTab 헬퍼 함수로 분리. 하드코딩된 색상(0xFFDCDCDC)을 PotiTheme.colors.gray300로 교체하여 테마 기반 컬러 적용. Color 임포트 제거
의존성 주입 설정
MainActivity.kt
@AndroidEntryPoint 어노테이션 추가하여 Dagger Hilt 의존성 주입 활성화
리소스 추가
strings.xml
액션 버튼 관련 문자열 리소스 7개 추가 (next, skip, start, reset, done, continue, select_all)
패키지 선언
Contracts.kt
새 파일 생성 - com.poti.android.presentation.history.list.model 패키지만 포함

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • [Feat/#10] 버튼 공통 컴포넌트 구현 #15: 동일한 버튼 타입 enum들(ActionButtonType, ModalButtonType, ChipButtonType, DeleteButtonType)을 원래 도입한 PR로, 본 PR이 이들을 구조적으로 정리하고 통합하는 직접적인 관련이 있습니다.
  • [Feat/#9] Navigation component #21: PotiActionButton.kt의 ActionButtonType 통합 변경이 해당 PR에서 사용하는 PotiActionButton 및 새로운 컴포넌트들에 직접 영향을 미칩니다.

Suggested labels

🔎 UI

Suggested reviewers

  • cmj7271
  • doyeon0307

추가 검토 의견 📋

안녕하세요! Modern Android Development 관점에서 몇 가지 긍정적인 점들을 공유드립니다.

좋은 점:

  • 단일 책임 원칙: Enum에 색상 로직을 캡슐화하여 버튼 컴포넌트의 책임을 명확히 했습니다.
  • 테마 시스템 활용: PotiHeaderSection에서 하드코딩된 색상을 PotiTheme로 교체하여 다이나믹 테마 지원이 가능해졌습니다.
  • 코드 정리: 중복된 enum 정의를 제거하여 유지보수성을 개선했습니다.
  • Hilt 통합: MainActivity에 @AndroidEntryPoint를 적용하여 의존성 주입을 표준화했습니다.

확인할 점:

  • 🔍 PotiHeaderSection.kt의 ongoingCountendedCount 파라미터가 정확한 상태로 전달되는지 확인 부탁드립니다.
  • 🔍 Contracts.kt 파일이 향후 모델 정의로 채워질 예정인지 확인이 필요합니다.

리팩토링 작업 고생하셨습니다! 👍

🚥 Pre-merge checks | ✅ 1 | ❌ 4
❌ Failed checks (3 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning PotiHeaderSection 색상 수정 목표는 완료되었으나, BaseViewModel 적용과 기기대응 확장함수 적용 목표는 이 PR에서 다루어지지 않았습니다. BaseViewModel 적용 작업을 완료하거나, 이 PR에서는 PotiHeaderSection 수정만 포함하고 나머지 작업은 별도 PR로 분리해주세요.
Out of Scope Changes check ⚠️ Warning MainActivity에 @AndroidEntryPoint 어노테이션이 추가되었는데, 이는 linked issue #29의 목표에 명시되지 않은 변경사항입니다. MainActivity의 DI 설정 변경이 issue #29와 직접 관련이 있는지 확인하거나, 해당 변경사항을 별도 작업 항목으로 분리해주세요.
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.
Title check ❓ Inconclusive 제목이 작업 내용을 직접 명시하지 않고 '수정사항 반영'이라는 모호한 표현만 사용하여 구체성이 부족합니다. 제목을 '버튼 컴포넌트 색상 시스템 및 문자열 정리'와 같이 구체적인 변경 사항을 포함하도록 수정해주세요.
✅ Passed checks (1 passed)
Check name Status Explanation
Description check ✅ Passed PR 설명은 대부분의 필수 섹션을 포함하고 있으며, 작업 내용과 스크린샷, 리뷰어 노트가 잘 정리되어 있습니다.

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

✨ Finishing touches
  • 📝 Generate docstrings

🧹 Recent nitpick comments
app/src/main/res/values/strings.xml (1)

13-20: LGTM! 버튼 공통 문자열이 잘 추출되었습니다.

action_button_* 네이밍 컨벤션을 일관되게 사용하고 있어 좋습니다. 하드코딩된 문자열 대신 리소스를 사용하는 것은 Compose 권장 사항을 잘 따르고 있습니다.

PR 노트에 언급된 대로 각 문자열이 어디에서 사용되는지 주석으로 표시하면 유지보수에 도움이 될 것 같습니다. 예를 들어:

<!-- 온보딩 화면에서 사용 -->
<string name="action_button_next">다음</string>
app/src/main/java/com/poti/android/core/designsystem/component/button/PotiActionButton.kt (1)

70-70: DEACTIVE 타입 체크 로직을 enum으로 이동하는 것을 고려해 보세요.

현재 DEACTIVE_MAINDEACTIVE_SUB 체크가 컴포저블 내부에 있는데, 이 로직을 ActionButtonType enum에 isClickable 프로퍼티로 캡슐화하면 응집도가 높아지고 재사용성이 향상됩니다.

♻️ 선택적 리팩토링 제안

enum class에 다음 프로퍼티를 추가:

enum class ActionButtonType {
    // ... existing members ...
    
    val isClickable: Boolean
        get() = this != DEACTIVE_MAIN && this != DEACTIVE_SUB
}

그리고 컴포저블에서:

-    val isButtonEnabled = enabled && type != ActionButtonType.DEACTIVE_MAIN && type != ActionButtonType.DEACTIVE_SUB
+    val isButtonEnabled = enabled && type.isClickable
app/src/main/java/com/poti/android/core/designsystem/component/navigation/PotiHeaderSection.kt (1)

60-66: 콜백 시그니처 단순화를 권장합니다.

현재 onTabSelected: (PotiHeaderTabType) -> Unit으로 선언되어 있지만, PotiHeaderSectionTab은 이미 tabType을 파라미터로 받고 있어 콜백에서 다시 전달할 필요가 없습니다. 이로 인해 Line 63에서 매 리컴포지션마다 새로운 람다 인스턴스가 생성됩니다.

onClick: () -> Unit으로 단순화하면 람다 할당을 줄이고 코드도 간결해집니다.

♻️ 콜백 단순화 제안
 `@Composable`
 private fun PotiHeaderSectionTab(
     tabType: PotiHeaderTabType,
     selectedTab: PotiHeaderTabType,
-    onTabSelected: (PotiHeaderTabType) -> Unit,
+    onClick: () -> Unit,
     ongoingCount: Int,
     endedCount: Int,
     modifier: Modifier = Modifier,
 ) {
     // ...
     Column(
         modifier = modifier
             .padding(vertical = 8.dp)
-            .noRippleClickable { onTabSelected(tabType) },
+            .noRippleClickable(onClick = onClick),
         // ...
     )
 }

호출부:

 PotiHeaderSectionTab(
     tabType = tabType,
     selectedTab = selectedTab,
-    onTabSelected = { onTabSelected(tabType) },
+    onClick = { onTabSelected(tabType) },
     ongoingCount = ongoingCount,
     endedCount = endedCount,
 )

Also applies to: 72-79


📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 33318ea and 76e3aa9.

📒 Files selected for processing (8)
  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiActionButton.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiChipButton.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiDeleteButton.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiModalButton.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/navigation/PotiHeaderSection.kt
  • app/src/main/java/com/poti/android/presentation/history/list/model/Contracts.kt
  • app/src/main/java/com/poti/android/presentation/main/MainActivity.kt
  • app/src/main/res/values/strings.xml
🧰 Additional context used
📓 Path-based instructions (1)
**/*.kt

⚙️ CodeRabbit configuration file

**/*.kt: 코드를 리뷰할 때 다음 Kotlin 및 Jetpack Compose 모범 사례를 중점적으로 확인:

  1. Jetpack Compose 성능 및 UI 최적화:

    • Recomposition 방지: 불필요한 리컴포지션을 유발하는 코드를 지적해줘. 특히 LazyColumn 등 리스트에서 key 파라미터가 누락되었는지 확인해줘.
    • 스마트한 계산: 계산 비용이 높은 로직은 rememberderivedStateOf로 감싸져 있는지 확인해줘.
    • 안정성(Stability): List나 일반 클래스를 State로 사용할 때, 불필요한 리컴포지션을 막기 위해 @Immutable이나 @Stable 어노테이션 사용을 제안해줘.
    • Modifier 규칙: Modifier는 항상 컴포저블 함수의 첫 번째 선택적 파라미터로 받아야 하며, 재사용성을 위해 외부에서 주입받아야 해.
    • 리소스 사용: 하드코딩된 값(색상, 크기, 문자열) 대신 Theme, Dimens, strings.xml 리소스를 사용하는지 체크해줘.
    • 접근성 예외: Icon이나 Image 컴포저블의 contentDescriptionnull인 경우는 장식용(Decorative) 이미지로 간주하고 지적하지 마.
  2. MVI (Model-View-Intent) 아키텍처 및 상태 관리:

    • 단방향 데이터 흐름(UDF): UI는 상태를 직접 변경할 수 없고, 반드시 Intent(또는 Event)를 통해 ViewModel로 요청을 보내야 해.
    • 불변 상태(Immutable State): UiState는 반드시 data class + val 프로퍼티로 구성되어야 하며, 상태 업데이트 시 .copy()를 사용해야 해.
    • Side Effect 분리: 네비게이션, Toast 같은 일회성 이벤트는 UiState가 아닌 Channel이나 SharedFlow로 처리하여 화면 회전 시 재발생하지 않도록 해야 해.
    • 안전한 수집: UI에서 Flow 수집 시 collectAsStateWithLifecycle()을 사용하여 생명주기를 준수하는지 확인해줘.
    • 상태 노출: ViewModel 내부에서 StateFlowSharedFlow를 올바르게 노출하고 있는지 확인해줘.
    • 호이스팅(Hoisting): 상태나 UI 이벤트 처리가 적절하게 호이스팅되었는지 확인해줘. UI 로직과 비즈니스 로직을 분리하고, UI가 로직을 직접 수행하지 않도록 확인해줘.
  3. Clean Architecture (Dependency Rule) 준수:

    • Domain 순수성: Domain 레이어(domain 패키지)는 절대로 안드로이드 의존성(android.*, R 클래스 등)을 가져서는 안 돼. 순수 Kotlin 코드인지 엄격히 확인해줘.
    • 데이터 노출 금지: Data 레이어의 DTO(@Entity, @SerializedName)가 UI나 Domain 레이어로 바로 노출되면 안 돼. 반드시 Mapper를 통해 변환했는지 확인해줘.
    • 계층 간 의존성: UI -> Domain <- Data 방향이 올바른지, UI가 Data 레이어를 직접 참조하고 있진 않은지 감시해줘.
  4. Kotlin & Coroutines 안전성:

    • Scope 사용: GlobalScope 사용을 금지하고, viewModelScopelifecycleScope 사용을 권장해줘.
    • Dispatcher 주입: Dispatchers.IO 등을 하드코딩하지 말고, 테스트 용이성을 위해 생성자를 통해 주입(Injection)받도록 제안해줘.
    • 예외 처리: Coroutine 실행 시 runCatching이나 CoroutineExceptionHandler 등을 통해 예외 처리가 누락되지 않았는지 확인해줘.
    • Null-Safety: 불필요한 !! 연산자 사용을 지적...

Files:

  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiModalButton.kt
  • app/src/main/java/com/poti/android/presentation/history/list/model/Contracts.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiActionButton.kt
  • app/src/main/java/com/poti/android/presentation/main/MainActivity.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiChipButton.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/button/PotiDeleteButton.kt
  • app/src/main/java/com/poti/android/core/designsystem/component/navigation/PotiHeaderSection.kt
⏰ 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: PR CI Check (Lint & Build)
🔇 Additional comments (11)
app/src/main/java/com/poti/android/core/designsystem/component/button/PotiDeleteButton.kt (2)

23-34: LGTM! Enum 클래스 위치 이동이 잘 되었습니다.

DeleteButtonType enum을 파일 상단으로 이동하여 다른 버튼 컴포넌트들(PotiActionButton, PotiChipButton, PotiModalButton)과 일관된 패턴을 유지하고 있습니다. 코드 가독성과 유지보수성이 향상되었습니다.


36-56: LGTM! 컴포저블 구현이 적절합니다.

PotiTheme.colors를 통한 테마 색상 사용과 Modifier 파라미터 배치가 Compose 권장 사항을 잘 따르고 있습니다. contentDescription = null은 장식용 아이콘으로 적절하게 처리되었습니다.

app/src/main/java/com/poti/android/presentation/history/list/model/Contracts.kt (1)

1-3: 빈 파일이 커밋되었습니다. 의도된 것인지 확인이 필요합니다.

Contracts.kt 파일에 package 선언만 있고 실제 코드가 없습니다. MVI 패턴에서 일반적으로 Contracts.ktUiState, Intent, SideEffect 등을 정의하는 파일인데, 현재 비어 있습니다.

의도적으로 추후 작업을 위해 생성한 파일이라면 TODO 주석을 추가하시거나, 불필요한 파일이라면 제거해 주세요.

app/src/main/java/com/poti/android/core/designsystem/component/button/PotiChipButton.kt (2)

25-45: LGTM! Enum 클래스 위치 이동 및 구현이 적절합니다.

ChipButtonType enum이 파일 상단으로 이동되어 일관된 코드 구조를 유지하고 있습니다. getBackgroundColorgetContentColor 메서드를 통해 타입별 색상 로직이 캡슐화되어 있어 좋습니다.


47-79: LGTM! 컴포저블 구현이 Compose 권장 사항을 잘 따르고 있습니다.

MutableInteractionSourceremember로 올바르게 감싸져 있고, collectIsPressedAsState()를 통한 press 상태 추적이 적절합니다. PotiTheme.colors를 통한 테마 색상 사용도 좋습니다.

app/src/main/java/com/poti/android/presentation/main/MainActivity.kt (1)

9-11: Hilt DI 설정이 완벽하게 구성되었네요.

@AndroidEntryPoint 어노테이션이 MainActivity에 올바르게 추가되었으며, PotiApplication 클래스에도 @HiltAndroidApp 어노테이션이 적용되어 있어서 Hilt의 전체 설정이 제대로 이루어졌습니다. 이를 통해 Activity 내에서 의존성 주입이 안전하게 동작할 수 있습니다. Modern Android Development 권장 사항에 따라 올바르게 구현되었습니다.

app/src/main/java/com/poti/android/core/designsystem/component/button/PotiModalButton.kt (2)

25-48: LGTM! enum class를 파일 상단으로 통합한 좋은 리팩토링입니다.

ModalButtonType enum에 색상 로직을 캡슐화하여 단일 책임 원칙(SRP)을 잘 따르고 있습니다. PotiColors를 파라미터로 받아 테마 기반 색상을 사용하는 것도 Modern Android Development 권장 사항에 부합합니다.


50-84: 컴포저블 구현이 잘 되어 있습니다.

Modifier가 첫 번째 선택적 파라미터로 올바르게 배치되어 있고, remember를 사용하여 MutableInteractionSource를 캐싱하고 있어 불필요한 재생성을 방지하고 있습니다. 테마 색상도 PotiTheme.colors를 통해 적절히 사용되고 있습니다.

app/src/main/java/com/poti/android/core/designsystem/component/button/PotiActionButton.kt (1)

25-55: LGTM! ActionButtonType enum 통합이 잘 되었습니다.

6가지 버튼 타입에 대한 색상 로직이 enum 내부에 깔끔하게 캡슐화되어 있습니다. DEACTIVE_MAINDEACTIVE_SUB 타입의 경우 isPressed 상태와 관계없이 고정 색상을 반환하는 것이 비활성 버튼의 의도에 맞게 구현되어 있습니다.

app/src/main/java/com/poti/android/core/designsystem/component/navigation/PotiHeaderSection.kt (2)

47-47: LGTM! 하드코딩된 색상을 테마 색상으로 변경한 좋은 개선입니다.

Color(0xFFDCDCDC) 대신 PotiTheme.colors.gray300을 사용하여 테마 일관성을 유지하고 있습니다. Modern Android Development에서 권장하는 테마 기반 스타일링 방식입니다.


80-106: 탭 렌더링 로직이 잘 분리되었습니다.

isSelected 상태에 따른 색상 분기와 count 계산이 명확하게 구현되어 있습니다. PotiTheme.colorsPotiTheme.typography를 사용하여 디자인 시스템 일관성을 유지하고 있는 점이 좋습니다.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


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

@github-actions
Copy link
Copy Markdown

github-actions bot commented Jan 14, 2026

Ktlint check passed.

Run: https://github.com/team-poti/POTI-ANDROID/actions/runs/20996546709

Copy link
Copy Markdown
Contributor

@sonyerim sonyerim left a comment

Choose a reason for hiding this comment

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

+) 버튼 공통 컴포넌트에 enum class 위에 있으면 좋을 것 같아서 위치 이동 했습니다

머지하고 이거 거슬렸는데 감사합니당

Copy link
Copy Markdown
Contributor

@doyeon0307 doyeon0307 left a comment

Choose a reason for hiding this comment

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

넵 확인했습니다!! 고생하셨습니당

@jyvnee jyvnee merged commit 79355dc into develop Jan 14, 2026
2 checks passed
@github-project-automation github-project-automation bot moved this from To-do to Done in POTI-ANDROID Jan 14, 2026
@jyvnee jyvnee deleted the chore/#29-correction branch January 14, 2026 14:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ 지현 ❤️‍🩹 Chore 작은 수정(타입변수, 패키지구조 변경 등)

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

[Chore] 수정사항 반영

3 participants