Skip to content

[REFAC] 직급 Enum 변경#26

Merged
Sangyoon98 merged 3 commits intodevfrom
SPM-396
Nov 6, 2025
Merged

[REFAC] 직급 Enum 변경#26
Sangyoon98 merged 3 commits intodevfrom
SPM-396

Conversation

@Sangyoon98
Copy link
Member

@Sangyoon98 Sangyoon98 commented Nov 5, 2025

📝 Summary

직급 Enum 변경

🙏 Question & PR point

📬 Reference

Summary by CodeRabbit

릴리스 노트

  • 새로운 기능

    • 에지투에지 디자인 적용으로 화면 활용도 향상
    • 회원가입 시 직급 선택을 드롭다운 형식으로 개선
    • 네트워크 안정성 향상을 위한 자동 재시도 기능 추가
  • 개선 사항

    • 사용자 프로필에 직급 정보 표시 개선
    • 로그아웃 프로세스 안정화

@coderabbitai
Copy link

coderabbitai bot commented Nov 5, 2025

Walkthrough

사용자 직급 시스템을 재설계하여 UserRole 열거형을 제거하고 새로운 UserPosition 열거형으로 대체하였습니다. 엣지-투-엣지 스타일링을 적용하고, 네트워크 복원력 개선을 위해 재시도 유틸을 추가하였으며, 가입 화면에 위치 드롭다운 선택기를 도입하였습니다.

Changes

Cohort / File(s) 변경 사항
엣지-투-엣지 스타일링 및 내비게이션
app/src/main/java/com/sampoom/android/MainActivity.kt, app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt
MainActivity에서 enableEdgeToEdge 설정 추가 및 navigationBarContrastEnforced 비활성화; AppNavHost에서 런타임 테마 사이드이펙트(LaunchedEffect) 제거
사용자 직급 모델 시스템
app/src/main/java/com/sampoom/android/core/model/UserPosition.kt, app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt
새로운 UserPosition enum(STAFF, SENIOR_STAFF, MANAGER, DIRECTOR, PRESIDENT, CHAIRMAN 등) 정의; 위치를 한글 문자열로 변환하는 유틸 함수 추가
인증 도메인 모델
app/src/main/java/com/sampoom/android/feature/auth/domain/model/User.kt
UserRole enum 제거; role: String, position: UserPosition으로 변경; startedAt, endedAt 필드 추가
인증 데이터 계층
app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt, app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt, app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt
사용자 역할/직급을 문자열과 enum으로 직렬화/역직렬화; 매퍼에서 UserPosition 변환 로직 적용; signUp/signIn에서 retry 래퍼 적용
가입 UI 및 상태 관리
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt, app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiEvent.kt, app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt, app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt
위치 선택 드롭다운 추가(ExposedDropdownMenuBox); PositionChanged 이벤트가 String에서 UserPosition으로 변경; SignUpUiState.position이 nullable UserPosition으로 변경; 위치 검증 로직 업데이트
공용 UI 컴포넌트
app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt
readOnly, singleLine 매개변수 추가
기타 UI 화면
app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt, app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt
직급 감지 및 표시를 UserPosition 기반으로 변경; SettingScreen에서 LaunchedEffect 제거 및 로그아웃 흐름 개선
네트워크 유틸
app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt
지수 백오프를 사용하는 새로운 retry 유틸 함수 추가(기본 5회 재시도)
리소스
app/src/main/res/values/strings.xml
필수 입력 필드 오류 메시지 리소스 추가

Sequence Diagram(s)

sequenceDiagram
    participant User as 사용자
    participant UI as SignUp화면
    participant ViewModel as SignUpViewModel
    participant Repo as AuthRepository
    participant Network as 네트워크 재시도

    User->>UI: 직급 선택 (드롭다운)
    UI->>ViewModel: PositionChanged(UserPosition)
    ViewModel->>ViewModel: position 상태 업데이트

    User->>UI: 가입 제출
    UI->>ViewModel: submit()
    ViewModel->>ViewModel: 유효성 검사<br/>(null 체크)
    alt 유효성 검사 실패
        ViewModel-->>UI: 에러 표시
    else 유효성 검사 성공
        ViewModel->>Repo: signUp(position: position.name)
        Repo->>Network: 첫 시도
        alt 네트워크 성공
            Network-->>Repo: 사용자 데이터
        else 네트워크 실패
            Network->>Network: 지수 백오프 대기<br/>(초기: 300ms)
            Network->>Network: 재시도 (최대 5회)
            alt 재시도 성공
                Network-->>Repo: 사용자 데이터
            else 모든 재시도 실패
                Network-->>Repo: 예외
            end
        end
        Repo->>Repo: 사용자 저장
        Repo-->>ViewModel: 결과
        ViewModel-->>UI: 가입 완료
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • 주의 필요 사항:
    • AuthRepositoryImpl의 retry 로직이 네트워크 복원력에 미치는 영향 검증
    • AuthPreferences의 사용자 역할/직급 역직렬화 로직의 안전성 확인 (특히 UserPosition.valueOf 폴백)
    • SignUpScreen 드롭다운 메뉴 포커스 및 상태 관리 검증
    • 데이터 모델 변경(UserRole 제거, UserPosition 도입)으로 인한 기존 사용자 데이터 호환성 확인

Possibly related PRs

Suggested labels

ready-to-merge

Suggested reviewers

  • Lee-Jong-Jin
  • CHOOSLA
  • yangjiseonn
  • vivivim
  • taemin3

Poem

🐰 직급을 드롭다운에 담고,
네트워크는 재시도로 강하고,
엣지-투-엣지 스타일 입히면,
앱은 더욱 우아해진다네!
사용자의 여정이 명확해지는 마법,
우리의 코드 숲에 봄이 왔네! 🌸

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 전체 변경사항의 핵심을 명확하게 반영합니다. UserRole 제거, UserPosition 추가, 직급 관련 UI/로직 변경 등 광범위한 리팩토링을 '[REFAC] 직급 Enum 변경'으로 정확히 요약했습니다.
✨ 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 SPM-396

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

@taemin3 taemin3 left a comment

Choose a reason for hiding this comment

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

확인했습니다

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

🧹 Nitpick comments (2)
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt (1)

69-73: 빈 else 블록을 제거하세요.

아무 동작도 하지 않는 빈 else 블록은 코드 가독성을 해치므로 제거하는 것이 좋습니다.

다음 diff를 적용하세요:

         is SignUpUiEvent.PasswordChanged -> {
             _state.value = _state.value.copy(password = e.password)
             validatePassword()
             if (_state.value.passwordCheck.isNotBlank()) {
                 validatePasswordCheck()
-            } else {
-
             }
         }
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (1)

196-196: 변수명 개선 제안

forEach의 변수명이 role이지만 실제로는 UserPosition 타입입니다. 명확성을 위해 변수명을 변경하는 것이 좋습니다.

-positionItems.forEach { role ->
+positionItems.forEach { position ->
     DropdownMenuItem(
-        text = { Text(positionToKorean(role)) },
+        text = { Text(positionToKorean(position)) },
         onClick = {
-            viewModel.onEvent(SignUpUiEvent.PositionChanged(role))
+            viewModel.onEvent(SignUpUiEvent.PositionChanged(position))
             positionMenuExpanded = false
             emailFocus.requestFocus()
         }
     )
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0e90005 and 5151246.

📒 Files selected for processing (17)
  • app/src/main/java/com/sampoom/android/MainActivity.kt (2 hunks)
  • app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/core/model/UserPosition.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (3 hunks)
  • app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt (2 hunks)
  • app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (3 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt (3 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/domain/model/User.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (5 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiEvent.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt (2 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt (3 hunks)
  • app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (2 hunks)
  • app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt (4 hunks)
  • app/src/main/res/values/strings.xml (1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-10-23T12:27:55.160Z
Learnt from: Sangyoon98
Repo: 33-Auto/Sampoom-Management-Android PR: 19
File: app/src/main/java/com/sampoom/android/feature/part/ui/PartListScreen.kt:81-81
Timestamp: 2025-10-23T12:27:55.160Z
Learning: In the Sampoom-Management-Android project, PullToRefreshBox's isRefreshing parameter is intentionally set to false across screens (PartListScreen, CartListScreen, OrderDetailScreen, OrderListScreen, OutboundListScreen) while the internal Indicator still uses the loading state from uiState. This is a deliberate pattern where loading state is managed separately and Pull-to-Refresh only activates on user action.

Applied to files:

  • app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt
  • app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt
📚 Learning: 2025-10-15T14:15:21.212Z
Learnt from: Sangyoon98
Repo: 33-Auto/Sampoom-Management-Android PR: 15
File: app/src/main/java/com/sampoom/android/feature/auth/domain/AuthValidator.kt:12-15
Timestamp: 2025-10-15T14:15:21.212Z
Learning: The email validation regex pattern in AuthValidator.kt (app/src/main/java/com/sampoom/android/feature/auth/domain/AuthValidator.kt) was decided after consultation with the backend team. The pattern "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+" is intentionally restrictive to match backend requirements.

Applied to files:

  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt
🧬 Code graph analysis (3)
app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt (1)
app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt (1)
  • positionToKorean (5-17)
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (2)
app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt (1)
  • CommonTextField (28-144)
app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt (1)
  • positionToKorean (5-17)
app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt (3)
app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt (1)
  • retry (5-23)
app/src/main/java/com/sampoom/android/feature/auth/data/remote/api/AuthApi.kt (1)
  • getProfile (36-37)
app/src/main/java/com/sampoom/android/feature/auth/domain/repository/AuthRepository.kt (1)
  • getProfile (20-20)
🪛 detekt (1.23.8)
app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt

[warning] 16-16: The caught exception is swallowed. The original exception could be lost.

(detekt.exceptions.SwallowedException)

🔇 Additional comments (21)
app/src/main/java/com/sampoom/android/MainActivity.kt (3)

3-10: LGTM! 필요한 import가 모두 올바르게 추가되었습니다.

Edge-to-edge 구현에 필요한 모든 import가 적절하게 추가되었으며, 모두 실제로 사용되고 있습니다.


29-31: LGTM! 네비게이션 바 대비 강제 설정이 올바르게 비활성화되었습니다.

API 레벨 체크가 정확하며 (API 29+), edge-to-edge 구현을 위해 시스템이 자동으로 스크림을 추가하는 것을 방지하는 표준 접근 방식입니다.


19-28: Edge-to-edge 구현이 올바르게 적용되었으며, window insets 처리도 적절히 구현되어 있습니다.

검증 결과, 주요 화면들에서 window insets를 올바르게 처리하고 있습니다:

  • OrderDetailScreen, SignUpScreen: navigationBarsPadding() 사용
  • LoginScreen, SignUpScreen: ScaffoldDefaults.contentWindowInsets 사용
  • CommonSnackBar: WindowInsets.statusBars 활용한 상태 바 패딩 처리

시스템 바의 투명화 설정이 모든 화면에서 적절하게 처리되고 있으므로, 콘텐츠 겹침 문제는 없습니다.

app/src/main/res/values/strings.xml (1)

131-131: LGTM!

필수 필드 검증을 위한 문자열 리소스가 적절하게 추가되었습니다.

app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiState.kt (1)

3-3: LGTM!

문자열 기반에서 UserPosition enum으로의 전환은 타입 안정성을 크게 향상시킵니다. nullable 타입에 맞게 검증 로직도 올바르게 업데이트되었습니다.

Also applies to: 9-9, 28-28

app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt (1)

1-17: LGTM!

UserPosition enum을 한글로 변환하는 유틸리티 함수가 잘 구현되었습니다. 모든 enum 값이 적절히 매핑되어 있고, null 처리도 적절합니다.

app/src/main/java/com/sampoom/android/feature/dashboard/ui/DashboardScreen.kt (1)

74-87: 관리자 권한 로직을 검증하세요.

현재 모든 UserPosition 값에 대해 isManager = true를 반환하고 있습니다. 이는 직급이 있는 모든 사용자가 관리자 권한을 가진다는 의미입니다. 이것이 의도된 동작인지 확인이 필요합니다.

만약 특정 직급만 관리자로 간주해야 한다면, when 표현식을 수정하여 해당 직급들만 true를 반환하도록 해야 합니다.

예시:

val isManager = when (user?.position) {
    UserPosition.MANAGER,
    UserPosition.DEPUTY_GENERAL_MANAGER,
    UserPosition.GENERAL_MANAGER,
    UserPosition.DIRECTOR,
    UserPosition.VICE_PRESIDENT,
    UserPosition.PRESIDENT,
    UserPosition.CHAIRMAN -> true
    else -> false
}
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpUiEvent.kt (1)

3-3: LGTM!

PositionChanged 이벤트가 UserPosition enum을 사용하도록 올바르게 업데이트되었습니다.

Also applies to: 8-8

app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpViewModel.kt (2)

97-101: LGTM!

nullable UserPosition 타입에 맞게 검증 로직이 올바르게 업데이트되었습니다. common_required_field 리소스를 사용한 에러 메시지 처리도 적절합니다.


154-154: force unwrap 사용이 안전합니다.

isValid 검증이 position != null을 확인하므로 Line 154의 position!!.name 사용은 안전합니다.

app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt (2)

177-177: LGTM!

positionToKorean 유틸리티 함수를 사용하여 직급을 한글로 표시하는 것이 적절합니다.


140-140: 로그아웃 플로우 변경을 확인하세요.

로그아웃 처리가 상태 변경 감지에서 다이얼로그 확인 버튼 클릭으로 이동했습니다. 이 변경이 의도된 것인지, 그리고 SettingViewModel의 로그아웃 로직이 제거되었는지 확인해주세요.

app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt (1)

51-52: 변경사항 확인: 직급 저장 방식 개선

role을 문자열로, position을 enum의 name 속성으로 저장하는 방식이 적절합니다. 이는 복호화 시 valueOf와의 호환성을 보장합니다.

app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt (1)

90-91: LGTM!

readOnlysingleLine 파라미터가 OutlinedTextField에 올바르게 바인딩되어 있습니다.

app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (2)

83-84: LGTM!

직급 드롭다운을 위한 UI 상태가 적절하게 정의되었습니다.


172-207: 직급 드롭다운 구현 확인

ExposedDropdownMenuBox를 사용한 직급 선택 UI가 잘 구현되었습니다. positionToKorean 유틸리티를 활용하여 사용자 친화적인 한글 표시를 제공하고 있습니다.

app/src/main/java/com/sampoom/android/feature/auth/domain/model/User.kt (1)

3-3: User 모델 업데이트 확인

다음 변경사항이 적절하게 적용되었습니다:

  • roleString 타입으로 변경
  • positionUserPosition enum으로 변경하여 타입 안전성 향상
  • startedAtendedAt 필드 추가로 사용자 근무 기간 추적 가능

Also applies to: 9-9, 13-13, 17-18

app/src/main/java/com/sampoom/android/feature/auth/data/repository/AuthRepositoryImpl.kt (1)

60-62: 프로필 조회에 재시도 로직 추가 확인

로그인 시 프로필 정보 조회에 재시도 로직을 추가하여 일시적인 서버 지연에 대한 복원력을 향상시켰습니다. 재시도 파라미터(5회, 300ms 초기 지연)가 적절합니다.

다만, DelayNetwork.ktretry 함수가 모든 예외를 무시하므로, 재시도할 수 없는 에러(예: 인증 실패, 잘못된 요청)에서도 불필요하게 재시도할 수 있습니다. DelayNetwork.kt의 예외 처리 개선이 필요합니다.

app/src/main/java/com/sampoom/android/core/model/UserPosition.kt (1)

3-14: UserPosition enum 정의 확인

직급 계층을 명확하게 표현하는 enum이 잘 정의되었습니다. 각 상수에 한글 주석을 추가하여 가독성을 높였으며, 타입 안전성을 제공하여 기존의 문자열 기반 직급 처리 방식보다 개선되었습니다.

app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (2)

8-22: LoginResponseDto 매핑 확인

로그인 응답을 User 모델로 매핑할 때 적절한 기본값을 설정하고 있습니다:

  • role을 빈 문자열로 설정
  • positionUserPosition.STAFF로 설정
  • 프로필 정보는 이후 getProfile 호출로 채워질 것으로 예상됩니다

24-38: GetProfileResponseDto 매핑 확인

프로필 응답을 User 모델로 매핑하는 로직이 올바르게 구현되었습니다. role은 문자열로, positiontoUserRole()을 통해 UserPosition으로 변환됩니다.

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (2)

67-67: 사용되지 않는 FocusRequester 제거 필요.

positionFocus는 직급 필드가 읽기 전용 드롭다운으로 변경되면서 더 이상 사용되지 않습니다. 155번 라인의 키보드 액션을 수정한 후 이 선언을 제거하세요.


155-155: 키보드 액션 수정 필요.

직급 필드가 읽기 전용 드롭다운으로 변경되어 포커스를 받을 수 없습니다. 지점 필드에서 Next 키를 누르면 직급 필드를 건너뛰고 이메일 필드로 직접 이동해야 합니다.

다음 diff를 적용하세요:

-                    keyboardActions = KeyboardActions(onNext = { positionFocus.requestFocus() })
+                    keyboardActions = KeyboardActions(onNext = { emailFocus.requestFocus() })
♻️ Duplicate comments (1)
app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (1)

47-51: 로깅 추가가 여전히 필요합니다.

이전 리뷰 코멘트에서 제안된 로깅이 아직 추가되지 않았습니다. IllegalArgumentException을 구체적으로 처리하도록 개선된 점은 좋지만, 서버에서 잘못된 직급 값을 받았을 때 디버깅을 위해 로깅이 필요합니다.

다음 diff를 적용하여 로깅을 추가하세요:

 private fun String.toUserPosition(): UserPosition = try {
     UserPosition.valueOf(this.uppercase())
 } catch (e: IllegalArgumentException) {
+    Log.w("AuthMappers", "Invalid position value received from server: $this", e)
     UserPosition.STAFF
 }

참고: android.util.Log import가 필요합니다.

🧹 Nitpick comments (2)
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (1)

162-196: 드롭다운 구현이 올바르게 작동합니다.

ExposedDropdownMenuBox 패턴이 정확하게 구현되었으며, 한글 라벨 표시, 선택 처리, 에러 검증이 모두 적절합니다.

선택사항: 드롭다운 표시 아이콘 추가 고려

표준 Material3 드롭다운은 trailing icon (▼)을 표시합니다. 현재 CommonTextFieldtrailingIcon 파라미터를 노출하지 않아 드롭다운 화살표가 표시되지 않을 수 있습니다. 향후 CommonTextField에 trailing icon 지원을 추가하고 ExposedDropdownMenuDefaults.TrailingIcon(expanded = positionMenuExpanded)을 전달하는 것을 고려해보세요.

app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt (1)

18-24: 재시도 시 로깅 추가를 권장합니다.

과거 리뷰 코멘트에서 제안된 예외 필터링이 올바르게 구현되었습니다. 다만, 재시도 가능한 예외를 처리할 때 빈 블록으로 처리하면 프로덕션 환경에서 디버깅과 모니터링이 어려워집니다.

재시도 발생 시 로그를 남기는 것을 권장합니다:

 } catch (t: Throwable) {
     when (t) {
         is SocketTimeoutException, is IOException -> {
-
+            // 재시도 시 로그 기록 (프로덕션 환경에서 모니터링 용이)
+            android.util.Log.w("DelayNetwork", "Retryable error occurred, attempt ${it + 1}/${times - 1}", t)
         }
         else -> throw t
     }
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5151246 and b7dd107.

📒 Files selected for processing (6)
  • app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt (0 hunks)
  • app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt (2 hunks)
  • app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt (1 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (3 hunks)
  • app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (5 hunks)
  • app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt (3 hunks)
💤 Files with no reviewable changes (1)
  • app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt
  • app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt
🧰 Additional context used
🧬 Code graph analysis (1)
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (2)
app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt (1)
  • CommonTextField (28-143)
app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt (1)
  • positionToKorean (5-17)
🔇 Additional comments (6)
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (2)

18-22: 드롭다운 구현에 필요한 import 추가가 적절합니다.

ExposedDropdownMenu 컴포넌트, 상태 관리, UserPosition enum, 한글 변환 함수 등 모든 필수 import가 올바르게 추가되었습니다.

Also applies to: 33-33, 35-35, 48-48, 51-51


83-84: 드롭다운 상태 관리가 올바르게 구현되었습니다.

UserPosition.entries를 사용한 항목 목록 생성과 메뉴 확장 상태 관리가 적절합니다.

app/src/main/java/com/sampoom/android/core/util/DelayNetwork.kt (1)

7-30: 재시도 로직이 올바르게 구현되었습니다.

재시도 함수의 구현이 정확합니다:

  • 지수 백오프가 정확히 적용됨
  • 재시도 가능한 예외만 필터링하여 처리 (SocketTimeoutException, IOException)
  • 최종 시도(line 29)에서 모든 예외를 올바르게 전파
  • Git 이력으로 확인: 이 파일은 직급 Enum 변경 커밋의 일부이며, PR 범위에 올바르게 포함되어 있습니다.
app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (3)

3-3: LGTM!

Enum 타입 변경에 따른 import 수정이 적절합니다.


8-22: LGTM!

로그인 시점에는 상세 프로필 정보가 없으므로 기본값 설정이 적절합니다. positionUserPosition.STAFF로 초기화하는 것은 합리적인 기본값입니다.


24-38: LGTM!

프로필 응답을 도메인 모델로 매핑하는 로직이 적절합니다. position 필드를 toUserRole() 함수를 통해 enum으로 변환하는 방식이 올바릅니다.

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

🧹 Nitpick comments (1)
app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (1)

47-51: 이전 리뷰의 로깅 제안이 반영되지 않았습니다

함수명 변경과 예외 타입 지정은 이전 리뷰 의견이 반영되었으나, 로깅 추가 제안은 아직 구현되지 않았습니다. 서버에서 잘못된 직급 값을 받았을 때 이를 감지하기 어려워 데이터 무결성 문제가 숨겨질 수 있습니다.

다음과 같이 로깅을 추가하는 것을 권장합니다:

 private fun String.toUserPosition(): UserPosition = try {
     UserPosition.valueOf(this.uppercase())
 } catch (e: IllegalArgumentException) {
+    // TODO: Log invalid position value - received: $this
     UserPosition.STAFF
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b7dd107 and 3b7cbbd.

📒 Files selected for processing (1)
  • app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (3 hunks)
🔇 Additional comments (3)
app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt (3)

1-6: Import 변경사항 확인 완료

UserPosition import로 변경이 정상적으로 반영되었습니다.


24-38: 프로필 매핑 구현 확인 완료

GetProfileResponseDto.toModel()에서 position 필드를 toUserPosition() 헬퍼 함수로 변환하는 로직이 올바르게 구현되었습니다.


8-22: 원본 리뷰 댓글이 부적절함 - 코드는 정상입니다

LoginResponseDto에서 position 필드를 확인한 결과, 해당 DTO에는 userId, accessToken, refreshToken, expiresIn만 포함되어 있습니다. position 필드가 응답 데이터에 포함되지 않으므로, UserPosition.STAFF로 하드코딩하는 것이 올바른 방식입니다. 로그인 응답에서는 직급 정보를 제공하지 않기 때문에 기본값을 설정하는 것이 필요하며, 현재 구현은 적절합니다.

@Sangyoon98 Sangyoon98 merged commit ca15451 into dev Nov 6, 2025
4 checks passed
@coderabbitai coderabbitai bot mentioned this pull request Nov 9, 2025
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.

2 participants