Skip to content

Create Week9 Mission1#45

Open
Hyerin-Jeong wants to merge 1 commit into
mainfrom
Week09/LinLin
Open

Create Week9 Mission1#45
Hyerin-Jeong wants to merge 1 commit into
mainfrom
Week09/LinLin

Conversation

@Hyerin-Jeong
Copy link
Copy Markdown
Contributor

  • ReqRes API로 userId 1 프로필 연동 (Coil)
  • 팔로잉 HorizontalPager, AlertDialog, ModalBottomSheet 구현

📝 미션 번호

N주차 Misson N

📋 구현 사항

📎 스크린샷

✅ 체크리스트

  • Merge 하려는 브랜치가 올바르게 설정되어 있나요?
  • 에뮬레이터 또는 실제 기기에서 정상 동작하나요?
  • 불필요한 주석 및 Log가 제거되었나요?

🤔 질문 사항

- ReqRes API로 userId 1 프로필 연동 (Coil)
- 팔로잉 HorizontalPager, AlertDialog, ModalBottomSheet 구현

Co-authored-by: Cursor <cursoragent@cursor.com>
@Dawon-Y Dawon-Y self-requested a review May 25, 2026 15:00
@Dawon-Y
Copy link
Copy Markdown
Contributor

Dawon-Y commented Jun 1, 2026

안녕하세요! 9주차 과제 진행하시느라 고생 많으셨습니다💚


1) 요구사항 기준 체크

마이페이지 UI 전부 구현

  • MyPageScreen에서 프로필 헤더/퀵메뉴/멤버혜택/팔로잉 섹션/가입일/편집 bottom sheet/팔로잉 이미지 다이얼로그까지 구성되어 있어 UI 구성은 매우 탄탄합니다.
  • 로딩 상태(CircularProgressIndicator)도 있어서 UX도 좋습니다.

서버 데이터 연동 (userId = 1)

  • MyPageViewModel.myUserId = 1
  • UserRepository.getUserProfile(1) 호출로 myProfile 세팅 → 화면에서 AsyncImage(model = profile?.avatar) + displayName 표시 흐름이 맞습니다.

팔로잉 리스트 HorizontalPager로 구현

  • 코드 일부만 보이지만, 화면 상단에서 FollowingPagerSection(...)를 따로 두었고, import에 HorizontalPager, rememberPagerState가 있으며 “팔로잉 섹션을 Pager로 렌더링”하는 구조는 요구사항을 충족합니다.
  • 팔로잉 클릭 시 selectedFollowingUser로 다이얼로그 띄우는 상호작용도 좋습니다.

2) UserData.kt 리뷰

잘한 점

  • @SerializedName(first_name/last_name) 매핑 정확.
  • displayName 계산 프로퍼티로 UI 단에서 문자열 조합을 안 하게 한 점이 좋습니다.

개선 포인트(선택)

  • displayName이 단순 "first last"라서, first/last가 빈 문자열일 때 공백만 남을 수 있어요. (ReqRes 데이터는 보통 채워져 있지만)
    • Deku처럼 filterNotBlank().joinToString(" ") 형태면 더 안전합니다.

3) ReqResService.kt 리뷰

  • endpoint 정의가 요구사항/ReqRes 형식에 정확합니다.
  • Response<UserResponse>를 repository에서 처리하도록 둔 구조도 과제 범위에서는 충분합니다.

4) UserRepository.kt 리뷰

잘한 점

  • Result<T>로 반환하는 방식이 ViewModel 단에서 깔끔하게 처리할 수 있어 좋습니다.
  • excludeUserId를 인자로 받는 것도 재사용성 좋습니다.

개선/주의 포인트

  1. runCatching { ... error("...") } 패턴은 편하지만, 에러 타입이 전부 IllegalStateException 계열로 뭉개지기 쉽습니다.

    • 최소한 RuntimeException("...")로 명확히 하거나,
    • 네트워크/HTTP/empty body를 구분한 에러 메시지를 주면 UI가 더 좋아집니다.
  2. getFollowingUsers에서 실패하면 그냥 error(...)로 throw 후 Result.failure가 되는데,

    • 현재 ViewModel에서 에러 메시지를 uiState에 넣고 “팔로잉 목록 영역에 에러문구”로 보여주고 있어 UX는 괜찮습니다.
    • 다만 “프로필 성공/팔로잉 실패” 같은 부분 성공을 의도한 거라면(지금 구현이 그 방향임) 지금 구조는 잘 맞습니다.

5) MyPageViewModel.kt 리뷰

잘한 점(핵심)

  • 부분 성공 처리가 좋습니다.
    • 프로필 실패/팔로잉 실패를 각각 처리하고, 둘 중 하나만 실패해도 화면 자체는 그릴 수 있게 설계되어 있습니다.
  • update를 써서 immutable state를 안전하게 갱신하는 점 Good.
  • errorMessage가 이미 있으면 팔로잉 실패 에러로 덮어쓰지 않는 처리도 UX 관점에서 합리적입니다.

개선 포인트

  1. 현재는 profile/following을 “동시에 시작”하긴 하지만, 실제로는 같은 코루틴에서 순차로 호출됩니다.

    • 성능/응답성 관점에서 병렬로 하고 싶다면 async 두 개로 나눌 수 있습니다(선택).
  2. isLoading이 두 요청이 끝난 뒤 false로 내려가는데,

    • “프로필만 먼저 보여주고 팔로잉은 로딩 스켈레톤” 같은 UX를 원하면,
    • loading 상태를 세분화(isProfileLoading, isFollowingLoading)하는 것도 방법입니다(과제에선 과함).

6) MyPageScreen.kt 리뷰 (Compose/UI)

잘한 점

  • 로딩/성공 UI 분기 명확.
  • UI가 섹션 단위로 잘 분리되어 있고, 상호작용도 깔끔합니다.
    • 편집 클릭 → ModalBottomSheet
    • 팔로잉 클릭 → AlertDialog(이미지 확대)
  • 팔로잉 비어있을 때 “빈 상태”를 잘 처리하고, 에러 메시지를 그 자리에 노출하는 방식도 일관성이 있습니다.

개선/주의 포인트

  1. collectAsState()collectAsStateWithLifecycle() 권장

    • 화면이 길고 스크롤도 있으니 생명주기 기반 수집이 더 안전합니다.
  2. LaunchedEffect/init 중복 로딩 주의

    • 지금은 ViewModel init { loadMyPage() }로 로딩하고 있고,
    • Screen에서 별도 LaunchedEffect로 재호출하진 않아서 괜찮습니다. (이 방식 유지 추천)
  3. 가입일 하드코딩

    • "회원 가입일: 2025년 9월"은 ReqRes에서 제공 안 하니 더미인 건 이해되는데,
    • 주석으로 “API에서 제공하지 않아 임시” 정도 남기면 리뷰에서 방어가 됩니다.
  4. (코드 청결) snapshotFlow, distinctUntilChanged import가 보이는데, 실제 사용이 없다면 정리하는 게 좋습니다.

    • 지금 화면 일부만 보이지만, unused import는 린트에서 걸릴 수 있습니다.

7) 결론

  • 요구사항(프로필 API 연동 + HorizontalPager 팔로잉 + UI 구현) 기준으로 완성도가 높고 UX도 신경 쓴 구현입니다.
  • 개선한다면 큰 방향은 두 가지:
    1. lifecycle 기반 state 수집 + 문자열/더미 값 정리
    2. Repository의 에러 처리(메시지/타입)만 조금 더 다듬기

워크북 진행하시느라 수고하셨습니다! 궁금한 점 있으시면 언제든 말씀해 주세요!

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