Conversation
There was a problem hiding this comment.
Pull request overview
이 PR은 1차 QA 과정에서 발견된 기능들을 구현합니다. 주요 변경사항으로는 타 유저 프로필 조회, 매일 오전 9시 질문 도착 알림, 마이페이지 데이터 새로고침, 앱 아이콘 추가, 알림 권한 시스템 연동, 홈화면 커버 블러 효과 등이 있습니다.
Changes:
- 새로운
feature:otherprofile모듈 추가로 타 유저 프로필 조회 기능 구현 - WorkManager 기반 매일 알림 스케줄링 및 알림 권한 시스템 설정 연동
- Refresh Trigger 패턴을 통한 화면 간 데이터 동기화 개선
Badges모델을BADGEenum으로 리팩토링하여 타입 안정성 향상MyPage를 data class로 변경하여 초기 탭 지정 가능
Reviewed changes
Copilot reviewed 56 out of 72 changed files in this pull request and generated 14 comments.
Show a summary per file
| File | Description |
|---|---|
| settings.gradle.kts | otherprofile 모듈 추가 |
| gradle/libs.versions.toml | WorkManager 의존성 추가 |
| feature/setting/* | 알림 권한을 시스템 설정으로 연동하도록 변경 |
| feature/otherprofile/* | 타 유저 프로필 조회 기능 신규 구현 |
| feature/mypage/* | 데이터 새로고침 trigger 통합 및 초기 탭 설정 기능 추가 |
| feature/home/* | 새로고침 trigger, 잠긴 커버 모달, 블러 효과 구현 |
| feature/detail/* | 삭제 확인 모달 추가, 날짜 표시 개선, BADGE 통합 |
| feature/comment/* | Home 새로고침 trigger 연동 |
| core/navigation/* | MyPage data class 변경, OtherProfile 라우트 추가 |
| core/domain/* | UseCase 리팩토링, BADGE enum 도입, UserRelation 및 CheckUserRelationUseCase 추가 |
| core/data/* | BADGE 모델 변경, PostDetail 날짜 포맷팅 추가, User 조회 API 추가 |
| core/designsystem/* | DPlayLargeCover 블러 효과, 북마크 버튼 분리, 리포트 바텀시트 단일 선택으로 변경 |
| core/common/* | HomeRefreshTrigger, RegisteredTrackRefreshTrigger, ScrappedTrackRefreshTrigger 추가 |
| app/* | 앱 아이콘 추가, DailyQuestionWorker 구현, 알림 스케줄링 |
| } | ||
|
|
||
| companion object{ | ||
| const val ADMIN_ID = 1L |
There was a problem hiding this comment.
ADMIN_ID가 하드코딩되어 있습니다. 설정이나 BuildConfig를 통해 관리하는 것이 더 유연합니다.
| }.onFailure { e -> | ||
| changeBottomSheetVisible(visible = false) | ||
| Timber.e(e) |
There was a problem hiding this comment.
포스트 삭제 실패 시 빈 onFailure 블록만 있습니다. 사용자에게 삭제 실패를 알리거나 에러를 로깅해야 합니다.
| } else { | ||
| } |
There was a problem hiding this comment.
빈 else 블록이 남아있습니다. 불필요한 코드는 제거하는 것이 좋습니다.
| Spacer(modifier = Modifier.height(184.dp)) | ||
|
|
||
| Text( | ||
| text = "아직 등록한 곡이 없어요", |
There was a problem hiding this comment.
하드코딩된 문자열입니다. strings.xml로 리소스화하는 것이 좋습니다.
| Spacer(modifier = Modifier.height(184.dp)) | ||
|
|
||
| Text( | ||
| text = "아직 저장한 곡이 없어요", |
There was a problem hiding this comment.
하드코딩된 문자열입니다. strings.xml로 리소스화하는 것이 좋습니다.
| // 추후 Writer와 통합 | ||
| User( | ||
| id = userData.userId, | ||
| nickname = userData.nickname, | ||
| profileImagePath = userData.profileImg, | ||
| ) |
There was a problem hiding this comment.
주석 "추후 Writer와 통합"이 있지만, Writer 타입과 User 타입이 중복되는 것으로 보입니다. 이는 기술 부채가 될 수 있으니 이슈로 트래킹하거나 TODO로 명확히 표시하는 것이 좋습니다.
| @@ -0,0 +1,7 @@ | |||
| <?xml version="1.0" encoding="utf-8"?> | |||
| <resources> | |||
| <string name="other_profile_screen_title">마이페이지</string> | |||
There was a problem hiding this comment.
타 유저의 프로필 화면인데 screen_title이 "마이페이지"로 되어 있습니다. 다른 사용자의 프로필이므로 "프로필" 또는 사용자 닉네임을 표시하는 것이 더 적절합니다.
| private fun scheduleDailyNotification() { | ||
| val currentDate = Calendar.getInstance() | ||
| val dueDate = Calendar.getInstance() | ||
|
|
||
| dueDate.set(Calendar.HOUR_OF_DAY, 9) | ||
| dueDate.set(Calendar.MINUTE, 0) | ||
| dueDate.set(Calendar.SECOND, 0) | ||
|
|
||
| if (dueDate.before(currentDate)) { | ||
| dueDate.add(Calendar.HOUR_OF_DAY, 24) | ||
| } | ||
|
|
||
| val timeDiff = dueDate.timeInMillis - currentDate.timeInMillis | ||
|
|
||
| val dailyWorkRequest = | ||
| PeriodicWorkRequestBuilder<DailyQuestionWorker>(24, TimeUnit.HOURS) | ||
| .setInitialDelay(timeDiff, TimeUnit.MILLISECONDS) | ||
| .addTag(DailyQuestionWorker.TAG) | ||
| .build() | ||
|
|
||
| WorkManager | ||
| .getInstance(this) | ||
| .enqueueUniquePeriodicWork( | ||
| DailyQuestionWorker.WORK_NAME, | ||
| ExistingPeriodicWorkPolicy.KEEP, | ||
| dailyWorkRequest, | ||
| ) |
There was a problem hiding this comment.
WorkManager는 정확한 시간 보장이 어렵습니다. 정확히 오전 9시에 알림을 보내야 한다면 AlarmManager 사용을 고려해야 합니다. WorkManager는 배터리 최적화를 위해 실행 시간을 조정할 수 있어 최대 15분 정도 지연될 수 있습니다.
| override fun doWork(): Result { | ||
| showNotification() | ||
| return Result.success() | ||
| } |
There was a problem hiding this comment.
알림 권한이 없을 때 알림이 표시되지 않습니다. 권한 체크를 추가하거나, 최소한 권한이 없을 때는 Worker 실행을 건너뛰는 로직이 필요합니다.
| if (event == Lifecycle.Event.ON_RESUME) { | ||
| val isGranted = NotificationManagerCompat.from(context).areNotificationsEnabled() | ||
| viewModel.handleIntent(SettingContract.SettingIntent.UpdateNotificationPermission(isGranted)) | ||
| } |
There was a problem hiding this comment.
시스템 설정에서 알림 권한 변경 시 앱으로 돌아올 때마다 권한 상태를 확인하는 것은 좋은 접근이지만, 화면이 표시될 때마다(ON_RESUME) 체크하는 것은 과도할 수 있습니다. ON_START 이벤트를 사용하거나, 설정 화면에서 돌아올 때만 체크하는 것을 고려해보세요.
Related issue 🛠
Work Description ✏️
Screenshot 📷
To Reviewers 📢
QA한번 시원하게 부탁드립니다~