Skip to content

Conversation

@HI-JIN2
Copy link
Member

@HI-JIN2 HI-JIN2 commented Sep 30, 2025

Summary

MyPage UiState/UiEvent 리팩토링 및 UserNickname 관련 로컬 저장소 로직 변경

Describe your changes

변경 전 변경 후
닉네임 변경 후 마이페이지에 닉네임 바로 안바뀜 resume 상태에서 함수 재호출하게 하여 바로 바뀌게 수정
각각의 MyPageUiState 공통의 UiState/UiEvent로 수정
GetUserNicknameUsecase에서 항상 API를 재호출함 SharedPreference에서 없을때만 재호출하도록 수정
Nickname 관련 비즈니스 로직에 불필요한 Flow 존재 Nickname 관련 비즈니스 로직에 불필요한 Flow 제거
snackbar / toast 혼용 toast 통일
닉네임 그대로 표시 초기 닉네임이거나 null일때 마이페이지 닉네임 칸에 "닉네임을 설정해주세요"로 수정
Screen_recording_20251001_001357.webm

*영상은 toast 통일 이전에 찍었습니다

Issue

To reviewers

  1. @kangyuri1114 님, UserInfo쪽 UiState/UiEvent 리팩토링 리마인드 드립니다!
  2. 갑자기 드는 생각인데.. 사용자 입장에서 다짜고짜 저렇게 닉네임 설정 창이 나오면 닉네임을 변경해야한다는걸 인지할 수 있을까요..? 닉네임 변경하라는 얘기가 하나도 없는데...

@HI-JIN2 HI-JIN2 self-assigned this Sep 30, 2025
@gemini-code-assist
Copy link
Contributor

Summary of Changes

Hello @HI-JIN2, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 MyPage의 UI 상태 관리 및 이벤트 처리 방식을 개선하고, 사용자 닉네임 관련 로직을 최적화하는 데 중점을 둡니다. 특히, 닉네임 정보의 로컬 저장소 활용을 강화하고, UI 업데이트의 즉각성을 확보하며, 전반적인 코드의 효율성과 사용자 경험을 향상시키는 변경 사항들을 포함합니다.

Highlights

  • MyPage UiState/UiEvent 리팩토링: MyPage 화면의 상태 관리(UiState) 및 이벤트 처리(UiEvent) 로직을 공통 패턴으로 리팩토링하여 코드의 일관성과 유지보수성을 향상시켰습니다.
  • UserNickname 로컬 저장소 로직 최적화: 사용자 닉네임을 가져오는 로직이 SharedPreferences를 먼저 확인하고, 로컬에 없을 경우에만 API를 호출하도록 변경하여 불필요한 네트워크 요청을 줄였습니다. 닉네임 설정 시에도 로컬 저장소에 먼저 반영됩니다.
  • 닉네임 변경 즉시 반영: 닉네임 변경 후 마이페이지로 돌아왔을 때 변경된 닉네임이 즉시 반영되도록 onResume() 시점에 사용자 정보를 다시 불러오는 로직을 추가했습니다.
  • 불필요한 Flow 제거: 닉네임 업데이트 및 조회와 관련된 UserRepositoryUseCase에서 단일 호출로 충분한 비즈니스 로직에 사용되던 불필요한 Flow 래퍼를 제거하여 코드 복잡성을 낮추고 직관성을 높였습니다.
  • 토스트 메시지 통일: 사용자에게 피드백을 제공하는 메시지 방식이 SnackbarToast로 혼용되던 것을 Toast로 통일하여 일관된 사용자 경험을 제공합니다.
  • 초기 닉네임 표시 개선: 사용자 닉네임이 설정되지 않았거나 기본값일 경우, 마이페이지에 '닉네임을 설정해주세요'라는 안내 문구가 표시되도록 수정하여 사용자에게 명확한 가이드를 제공합니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

이번 PR은 MyPage의 UI 상태 관리 로직을 리팩토링하고 닉네임 관련 로직을 개선하는 내용을 담고 있습니다. 전반적으로 MVI 패턴을 도입하여 상태 관리를 개선하고, 불필요한 Flow를 제거하여 코드를 간소화한 점이 좋습니다. 몇 가지 개선점과 치명적인 버그를 발견하여 리뷰에 포함했습니다. 특히 UserInfoViewModel의 닉네임 변경 로직에 있는 경쟁 조건은 반드시 수정이 필요합니다. 그 외에는 코드 가독성 및 유지보수성을 높이기 위한 제안들입니다.

binding.tvNickname.text = state.nickname
} else {
// 필요 시 미설정 안내 문구
binding.tvNickname.text = "닉네임을 설정해주세요"
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

"닉네임을 설정해주세요" 문자열이 하드코딩되어 있습니다. 다국어 지원 및 유지보수 편의성을 위해 strings.xml 리소스 파일로 추출하는 것을 권장합니다.

Suggested change
binding.tvNickname.text = "닉네임을 설정해주세요"
binding.tvNickname.text = getString(R.string.mypage_set_nickname_prompt)

Comment on lines +121 to +126
// 권한 미허용이면 스위치 원복
binding.alarmSwitch.setOnCheckedChangeListener(null)
binding.alarmSwitch.isChecked = false
binding.alarmSwitch.setOnCheckedChangeListener { _, checked ->
handleAlarmSwitchChange(checked)
}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

알림 스위치의 OnCheckedChangeListener를 설정하는 로직이 render 함수(104-108 라인)와 handleAlarmSwitchChange 함수에 중복되어 있습니다. 이 로직을 별도의 헬퍼 함수로 추출하여 코드 중복을 줄이고 가독성을 높이는 것을 고려해 보세요.

data class MyPageState(
var loading: Boolean = true,
var error: Boolean = false,

var toastMessage: String = "",

var nickname: String = "",
var platform: String = "",
var isAlarmOn: Boolean = false,
var appVersion: String = "0.0.0",

var isNicknameNull: Boolean = false,
) No newline at end of file
val nickname: String? = null,
val platform: String = "KAKAO",
val isAlarmOn: Boolean = false,
val appVersion: String = "0.0.0"
) {
val hasNickname: Boolean get() = !nickname.isNullOrBlank() && !nickname.startsWith("user-")
}
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

MyPageState를 불변(immutable)으로 리팩토링한 것은 매우 좋은 변화입니다. var 대신 val을 사용하고, UI 상태와 관련된 프로퍼티(loading, error 등)를 제거하여 데이터 클래스가 순수하게 상태만 표현하도록 만든 점이 훌륭합니다. hasNickname과 같은 계산된 프로퍼티를 추가한 것도 좋은 방법입니다.

@PeraSite
Copy link
Member

PeraSite commented Oct 1, 2025

말씀해주신 것처럼 갑자기 닉네임 변경 창이 뜬다고 해서 바꿔야함을 인지못할 것 같아요.
닉네임을 설정해주세요 라는 토스트 띄워주면 될 것 같습니다!

@kangyuri1114
Copy link
Member

kangyuri1114 commented Oct 1, 2025

@kangyuri1114 님, UserInfo쪽 UiState/UiEvent 리팩토링 리마인드 드립니다!

어제 pr 머지하고 시작한 작업이 없는데 그럼 이 작업부터 시작하겠습니다~!

갑자기 드는 생각인데.. 사용자 입장에서 다짜고짜 저렇게 닉네임 설정 창이 나오면 닉네임을 변경해야한다는걸 인지할 수 있을까요..? 닉네임 변경하라는 얘기가 하나도 없는데...

그러게요 뭔가 영상으로 보니까 오류같네요 ..ㅋㅋㅋ
저는 다이얼로그로 좀 더 친절하게 멘트로 안내해주면 어떨까 싶긴해요~!
확인 누르면 닉네임 수정 화면으로 이동하게끔?

Copy link
Member

@kangyuri1114 kangyuri1114 left a comment

Choose a reason for hiding this comment

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

코루틴, flow를 잘 사용해주신 코드 잘 봤습니다!👍
궁금한 점 몇가지 코멘트 달아놔서 확인부탁드려요!


suspend fun getUserReviews(): Flow<BaseResponse<MyReviewResponse>>
suspend fun getUserNickName(): Flow<BaseResponse<MyNickNameResponse>>
suspend fun getUserNickName(): String
Copy link
Member

Choose a reason for hiding this comment

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

오홋 앞으로 단순 api 호출 작업에서는 flow를 덜어내는 방향으로 진행하실 예정일까요?
저번에 제휴지도 부분에서 리뷰 코멘트로 단순 api호출 결과를 flow로 계속 방출하는 게 잘 이해가 안된다고 답변을 남겼던거같은데
그 후로 팀내에서 정확히 정한 부분은 없는 것 같아서요~!

Copy link
Member Author

Choose a reason for hiding this comment

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

유리님 말씀이 맞는 것 같아 viewmodel -> ui 말고는 suspend로 수정하려고 합니다! 이부분을 이야기하지 않은 것을 까먹었네요 😅 좋은 인사이트 감사합니다

)
_uiState.value = UiState.Loading
runCatching {
withContext(Dispatchers.IO) { getUserNickNameUseCase() }
Copy link
Member

Choose a reason for hiding this comment

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

바뀐 코드가 더 좋네요!!

val uiState: StateFlow<UiState<MyPageState>> =
_state
.map { UiState.Success(it) }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5_000), UiState.Init)
Copy link
Member

Choose a reason for hiding this comment

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

요 코드는 제가 처음봐요!
SharingStarted.WhileSubscribed(5_000) 이렇게 5000으로 값을 정하신 이유가 있을까요?

Copy link
Member Author

@HI-JIN2 HI-JIN2 Oct 1, 2025

Choose a reason for hiding this comment

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

5000은 관용적인 표현인 것 같아요..! https://velog.io/@mraz3068/5000

저렇게 단일값만을 success의 데이터를 갖는 uiState에서 이런 표현을 종종 쓰더라구욥

Comment on lines +57 to +61
override fun onResume() {
super.onResume()
myPageViewModel.fetchMyInfo() // 닉네임 변경 등으로부터 복귀 시 정보 갱신
}

Copy link
Member

@kangyuri1114 kangyuri1114 Oct 1, 2025

Choose a reason for hiding this comment

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

결과적으로 닉네임 수정 후 화면에 바로 반영 안되는 오류는 onresume에서 호출하는 방식으로 해결하신것 같아요

onResume에서 api로 닉네임을 계속 호출하고 있잖아요
사실 이 이슈를 제가 가져가려고 전부터 머리로만 계속 생각했었는데
저는 myInfoActivity에서 성공적으로 닉네임을 반영한 경우 sharedPreference를 업데이트하고,
mypage에서 닉네임은 sharedPreference값을 보여주는 방식으로 수정할 생각이었거든요

혹시 이 부분에 대해서는 어떻게 생각하시나요??

Copy link
Member Author

Choose a reason for hiding this comment

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

헉 사실 이슈를 수정하려고 한건 아닌데 어쩌다보니 함께 수정이 되었습니다.. 😮

유리님께서 말씀하신 방법으로 동작합니다!

닉네임 수정하면 setNicknameUsecase에서 api호출이랑 sharedPreference set 함수 둘다 호출되고
getNicknameUsecase 호출하면 sharedPreference 먼저 검사해서 있으면 로컬 값 주고 비어있으면 api호출하고 sharedPreference set합니다!!

Copy link
Member

Choose a reason for hiding this comment

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

아하 그렇군요!! 수고하셨씁니당~!

@HI-JIN2
Copy link
Member Author

HI-JIN2 commented Oct 1, 2025

@PeraSite @kangyuri1114 일단 토스트는 실행됩니다!닉네임을 설정해주세요

UI적으로 캐릭터랑 같이 잇슈 서비스에서 당신을 표현할 닉네임을 정해주세요~ 뭐 이런 귀여운 문구를 쓰면 좋겠는데, 이건 나령님에게 토스하도록 할게요...

     if (nickname.isNullOrBlank() || nickname.startsWith("user-")) {
                    _uiState.value = UiState.Success(MainState.NicknameNull)
                    _uiEvent.emit(UiEvent.ShowToast(context.getString(R.string.set_nickname)))
                    return@launch // ← 아래 분기 실행 막기
                }

@HI-JIN2 HI-JIN2 requested a review from kangyuri1114 October 1, 2025 10:28
Copy link
Member

@PeraSite PeraSite left a comment

Choose a reason for hiding this comment

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

👍👍👍👍👍

@HI-JIN2 HI-JIN2 merged commit 334cd90 into develop Oct 3, 2025
1 check passed
@HI-JIN2 HI-JIN2 deleted the refactor/get-nickname branch October 3, 2025 05:32
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.

마이페이지에서 닉네임 바꾸고 나오면 바로 반영 안됨

4 participants