Conversation
Walkthrough사용자 직급 시스템을 재설계하여 UserRole 열거형을 제거하고 새로운 UserPosition 열거형으로 대체하였습니다. 엣지-투-엣지 스타일링을 적용하고, 네트워크 복원력 개선을 위해 재시도 유틸을 추가하였으며, 가입 화면에 위치 드롭다운 선택기를 도입하였습니다. Changes
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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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
📒 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.ktapp/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!문자열 기반에서
UserPositionenum으로의 전환은 타입 안정성을 크게 향상시킵니다. nullable 타입에 맞게 검증 로직도 올바르게 업데이트되었습니다.Also applies to: 9-9, 28-28
app/src/main/java/com/sampoom/android/core/util/PositionToKorean.kt (1)
1-17: LGTM!
UserPositionenum을 한글로 변환하는 유틸리티 함수가 잘 구현되었습니다. 모든 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이벤트가UserPositionenum을 사용하도록 올바르게 업데이트되었습니다.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!
readOnly와singleLine파라미터가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 모델 업데이트 확인다음 변경사항이 적절하게 적용되었습니다:
role이String타입으로 변경position이UserPositionenum으로 변경하여 타입 안전성 향상startedAt및endedAt필드 추가로 사용자 근무 기간 추적 가능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.kt의retry함수가 모든 예외를 무시하므로, 재시도할 수 없는 에러(예: 인증 실패, 잘못된 요청)에서도 불필요하게 재시도할 수 있습니다.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을 빈 문자열로 설정position을UserPosition.STAFF로 설정- 프로필 정보는 이후
getProfile호출로 채워질 것으로 예상됩니다
24-38: GetProfileResponseDto 매핑 확인프로필 응답을
User모델로 매핑하는 로직이 올바르게 구현되었습니다.role은 문자열로,position은toUserRole()을 통해UserPosition으로 변환됩니다.
app/src/main/java/com/sampoom/android/app/navigation/AppNavHost.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/sampoom/android/core/preferences/AuthPreferences.kt
Show resolved
Hide resolved
app/src/main/java/com/sampoom/android/core/ui/component/CommonTextField.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt
Outdated
Show resolved
Hide resolved
app/src/main/java/com/sampoom/android/feature/setting/ui/SettingScreen.kt
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
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.Logimport가 필요합니다.
🧹 Nitpick comments (2)
app/src/main/java/com/sampoom/android/feature/auth/ui/SignUpScreen.kt (1)
162-196: 드롭다운 구현이 올바르게 작동합니다.ExposedDropdownMenuBox 패턴이 정확하게 구현되었으며, 한글 라벨 표시, 선택 처리, 에러 검증이 모두 적절합니다.
선택사항: 드롭다운 표시 아이콘 추가 고려
표준 Material3 드롭다운은 trailing icon (▼)을 표시합니다. 현재
CommonTextField가trailingIcon파라미터를 노출하지 않아 드롭다운 화살표가 표시되지 않을 수 있습니다. 향후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
📒 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!로그인 시점에는 상세 프로필 정보가 없으므로 기본값 설정이 적절합니다.
position을UserPosition.STAFF로 초기화하는 것은 합리적인 기본값입니다.
24-38: LGTM!프로필 응답을 도메인 모델로 매핑하는 로직이 적절합니다.
position필드를toUserRole()함수를 통해 enum으로 변환하는 방식이 올바릅니다.
app/src/main/java/com/sampoom/android/feature/auth/data/mapper/AuthMappers.kt
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
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
📒 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 변경사항 확인 완료
UserPositionimport로 변경이 정상적으로 반영되었습니다.
24-38: 프로필 매핑 구현 확인 완료
GetProfileResponseDto.toModel()에서position필드를toUserPosition()헬퍼 함수로 변환하는 로직이 올바르게 구현되었습니다.
8-22: 원본 리뷰 댓글이 부적절함 - 코드는 정상입니다
LoginResponseDto에서 position 필드를 확인한 결과, 해당 DTO에는 userId, accessToken, refreshToken, expiresIn만 포함되어 있습니다. position 필드가 응답 데이터에 포함되지 않으므로,UserPosition.STAFF로 하드코딩하는 것이 올바른 방식입니다. 로그인 응답에서는 직급 정보를 제공하지 않기 때문에 기본값을 설정하는 것이 필요하며, 현재 구현은 적절합니다.
📝 Summary
직급 Enum 변경
🙏 Question & PR point
📬 Reference
Summary by CodeRabbit
릴리스 노트
새로운 기능
개선 사항