Skip to content

Conversation

@casper-jr
Copy link
Member

@casper-jr casper-jr commented Oct 10, 2025

🚀 이슈번호

✏️ 변경사항

  • 마이페이지에서 로그아웃, 회원 탈퇴 버튼 추가
  • 회원 탈퇴 버튼 클릭시 다이얼로그 팝업 구현
  • 로그아웃 버튼 클릭시 초기 화면으로 이동하도록 구현(기존의 토큰 만료 로직 사용)

📷 스크린샷

Screen_Recording_20251010_145522_WhosInClient.mp4

✍️ 사용법

🎸 기타

  • 회원탈퇴 api는 서버측 구현되는대로 연결해두겠습니다

Summary by CodeRabbit

  • 신기능
    • 마이페이지에 로그아웃 버튼 추가
    • 회원 탈퇴 확인 다이얼로그 추가(확인/취소 버튼 포함)
  • 개선/리팩터링
    • 마이페이지 레이아웃을 세로 스크롤 가능한 구성으로 개선해 가독성 향상
    • 클럽 목록 렌더링 방식을 조정해 UI 일관성 및 안정성 개선
    • 뷰모델 구조를 정리해 인증/회원 정보 흐름을 명확화하고 오류 처리 안정성 향상

@casper-jr casper-jr self-assigned this Oct 10, 2025
@casper-jr casper-jr added FEAT 기능 개발 UI UI 구현 작업 OK Merge 완료된 PR labels Oct 10, 2025
@coderabbitai
Copy link

coderabbitai bot commented Oct 10, 2025

Walkthrough

로그아웃 기능이 추가되었다. 요청/응답 DTO가 신설되고, RemoteAuthDataSource와 AuthRepository에 logout API가 도입되었다. MyPageViewModel에 TokenManager 연계 로그아웃 로직이 추가되었고, MyPageScreen에 로그아웃/회원탈퇴 버튼과 확인 다이얼로그 UI가 포함되었다. MyClubComponent는 Column 기반 렌더링으로 변경되었다.

Changes

Cohort / File(s) Change Summary
Auth DTOs (Logout)
composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/request/LogoutRequestDto.kt, composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/LogoutResponseDto.kt
새 직렬화 DTO 추가: LogoutRequestDto(refreshToken), LogoutResponseDto(success/status/message/data).
Remote Data Source
composeApp/src/commonMain/kotlin/org/whosin/client/data/remote/RemoteAuthDataSource.kt
suspend fun logout(refreshToken) 추가. POST auth/logout 호출, 성공/에러 처리 및 ErrorResponseDto 파싱 시도.
Repository
composeApp/src/commonMain/kotlin/org/whosin/client/data/repository/AuthRepository.kt
logout(refreshToken) 공개 메서드 추가, 데이터소스 위임.
ViewModel (MyPage)
composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/MyPageViewModel.kt
생성자에 memberRepository, authRepository, tokenManager 주입으로 변경. logout() 추가: 리프레시 토큰 조회→API 호출→토큰 정리/만료 처리 및 에러 메시지 반영.
UI Screen (MyPage)
composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/MyPageScreen.kt
하단 액션 행 추가: 로그아웃/회원 탈퇴 버튼. 회원 탈퇴 확인 다이얼로그 추가. 레이아웃을 스크롤 가능한 Column으로 조정.
UI Component (MyClub)
composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/component/MyClubComponent.kt
LazyColumnColumn+forEach로 렌더링 방식 변경(가상화 제거), 패딩/간격 조정.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor U as User
  participant S as MyPageScreen
  participant VM as MyPageViewModel
  participant AR as AuthRepository
  participant DS as RemoteAuthDataSource
  participant API as HTTP API
  participant TM as TokenManager

  U->>S: 탭: 로그아웃
  S->>VM: logout()
  VM->>TM: getRefreshToken()
  alt refreshToken 없음
    VM->>TM: clearTokens() + markExpired()
    VM-->>S: 상태 업데이트(로그아웃 완료)
  else refreshToken 존재
    VM->>AR: logout(refreshToken)
    AR->>DS: logout(refreshToken)
    DS->>API: POST /auth/logout {refreshToken}
    API-->>DS: 200 OK / 에러 응답
    alt 성공
      DS-->>AR: ApiResult.Success(LogoutResponseDto)
      AR-->>VM: 성공 결과
      VM->>TM: clearTokens() + markExpired()
      VM-->>S: 상태 업데이트(로그아웃 완료)
    else 에러
      DS-->>AR: ApiResult.Error(...)
      AR-->>VM: 에러 결과
      VM-->>S: errorMessage 갱신
    end
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related issues

Possibly related PRs

Poem

버튼 두 개, 한숨 하나 — 로그아웃 클릭!
토큰은 인사하고 사라지고 🌬️
새 DTO는 말없이 봉투를 건네며
뷰모델은 길을 정리한다.
클럽 리스트는 가볍게 줄서고,
내 페이지엔 산들바람만 남았다.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 40.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed 이 PR 제목은 UI에서 로그아웃 기능 구현이라는 주요 변경 사항을 명확하고 간결하게 전달하여 팀원이 기록을 빠르게 이해할 수 있도록 돕습니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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

@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 (4)
composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/component/MyClubComponent.kt (1)

68-94: 레이아웃 변경 확인됨

LazyColumn에서 Column으로 변경되어 지연 로딩이 제거되었습니다. 현재 동아리 목록이 적다면 문제없지만, 향후 목록이 길어질 경우 성능 저하가 발생할 수 있습니다. 필요시 다시 LazyColumn으로 전환하는 것을 고려해보세요.

composeApp/src/commonMain/kotlin/org/whosin/client/data/remote/RemoteAuthDataSource.kt (1)

203-203: TODO 확인

회원 탈퇴 API는 PR 설명에 명시된 대로 서버 구현 후 연결 예정이군요. 필요시 별도 이슈로 트래킹하시면 좋을 것 같습니다.

composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/MyPageViewModel.kt (2)

117-142: 로그아웃 로직 구현 확인

로그아웃 로직이 잘 구현되었습니다:

  • 리프레시 토큰이 없을 경우 바로 토큰 삭제 및 만료 처리
  • 토큰이 있을 경우 서버에 로그아웃 요청 후 성공 시 토큰 삭제
  • 에러 발생 시 적절한 에러 메시지 업데이트

다만 로그아웃 실패 시에도 토큰을 삭제하는 것이 사용자 경험 측면에서 나을 수 있습니다. 현재는 에러 메시지만 표시하고 토큰을 유지하는데, 사용자가 로그아웃 의도를 명확히 했다면 서버 응답과 무관하게 로컬 토큰을 삭제하는 것도 고려해볼 만합니다.

필요시 에러 케이스에서도 토큰을 삭제하도록 수정할 수 있습니다:

                 is ApiResult.Error -> {
+                    // 로그아웃 실패 시에도 로컬 토큰 삭제
+                    tokenManager.clearToken()
+                    TokenExpiredManager.setTokenExpired()
                     _uiState.value = _uiState.value.copy(
                         errorMessage = result.message ?: "로그아웃에 실패했습니다."
                     )
                     println("MyPageViewModel: 로그아웃 실패 - ${result.message}")
                 }

144-144: TODO 확인

회원 탈퇴 기능은 PR 설명에 따르면 서버 구현 후 연결 예정이군요.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6a1b9d4 and a275ff8.

📒 Files selected for processing (7)
  • composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/request/LogoutRequestDto.kt (1 hunks)
  • composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/LogoutResponseDto.kt (1 hunks)
  • composeApp/src/commonMain/kotlin/org/whosin/client/data/remote/RemoteAuthDataSource.kt (2 hunks)
  • composeApp/src/commonMain/kotlin/org/whosin/client/data/repository/AuthRepository.kt (2 hunks)
  • composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/MyPageScreen.kt (6 hunks)
  • composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/MyPageViewModel.kt (5 hunks)
  • composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/component/MyClubComponent.kt (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
composeApp/src/commonMain/kotlin/org/whosin/client/data/repository/AuthRepository.kt (2)
composeApp/src/commonMain/kotlin/org/whosin/client/data/repository/ClubRepository.kt (2)
  • checkOut (22-23)
  • dataSource (10-30)
composeApp/src/commonMain/kotlin/org/whosin/client/di/DIModules.kt (1)
  • AuthRepository (47-47)
composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/LogoutResponseDto.kt (4)
composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/LoginResponseDto.kt (2)
  • success (6-18)
  • accessToken (20-26)
composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/AddClubResponseDto.kt (1)
  • success (6-16)
composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/SignupResponseDto.kt (1)
  • success (6-18)
composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/FindPasswordResponseDto.kt (1)
  • success (6-18)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: ios-build
  • GitHub Check: android-build
🔇 Additional comments (9)
composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/request/LogoutRequestDto.kt (1)

1-10: LGTM!

로그아웃 요청 DTO가 올바르게 구현되었습니다. 직렬화 어노테이션이 적절히 적용되어 있습니다.

composeApp/src/commonMain/kotlin/org/whosin/client/data/repository/AuthRepository.kt (1)

41-42: LGTM!

로그아웃 메서드가 올바르게 추가되었습니다. 기존 패턴과 일관성 있게 데이터 소스에 위임하고 있습니다.

composeApp/src/commonMain/kotlin/org/whosin/client/data/remote/RemoteAuthDataSource.kt (1)

167-201: LGTM!

로그아웃 API 구현이 올바르게 작성되었습니다. 에러 핸들링이 기존 login 메서드와 일관된 패턴을 따르고 있으며, 성공/실패 케이스를 적절히 처리하고 있습니다.

composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/MyPageScreen.kt (4)

58-58: LGTM!

다이얼로그 상태 관리가 올바르게 구현되었습니다.


77-199: LGTM!

스크롤 가능한 레이아웃으로 잘 구성되었습니다. weight(1f)verticalScroll을 활용해 하단 버튼 영역을 고정하면서 나머지 콘텐츠를 스크롤할 수 있도록 구현한 점이 좋습니다.


141-179: LGTM!

로그아웃 및 회원 탈퇴 버튼이 적절한 색상과 레이아웃으로 구현되었습니다. 로그아웃은 ViewModel의 logout() 메서드를 호출하고, 회원 탈퇴는 확인 다이얼로그를 표시하도록 되어 있네요.


202-252: 회원 탈퇴 다이얼로그 구현 확인

다이얼로그가 잘 구현되었습니다. 회원 탈퇴 API는 TODO로 표시되어 있으며, PR 설명에 따르면 서버 구현 후 연결 예정이군요.

composeApp/src/commonMain/kotlin/org/whosin/client/data/dto/response/LogoutResponseDto.kt (1)

1-16: LGTM!

로그아웃 응답 DTO가 올바르게 구현되었습니다. 기존 응답 DTO들(LoginResponseDto, SignupResponseDto 등)과 일관된 구조를 따르고 있습니다.

composeApp/src/commonMain/kotlin/org/whosin/client/presentation/mypage/MyPageViewModel.kt (1)

26-28: LGTM!

생성자가 MemberRepository, AuthRepository, TokenManager를 주입받도록 올바르게 업데이트되었습니다.

@casper-jr casper-jr merged commit fc6a3bc into WhosInRoom:develop Oct 10, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

FEAT 기능 개발 OK Merge 완료된 PR UI UI 구현 작업

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant