Skip to content

[refactor] #85 랜덤포즈 중복 확인 위치 변경#86

Merged
Ojongseok merged 925 commits into
mainfrom
refactor/#85-random-pose-call-site
Feb 7, 2026
Merged

[refactor] #85 랜덤포즈 중복 확인 위치 변경#86
Ojongseok merged 925 commits into
mainfrom
refactor/#85-random-pose-call-site

Conversation

@ikseong00
Copy link
Copy Markdown
Contributor

@ikseong00 ikseong00 commented Feb 6, 2026

🔗 관련 이슈

📙 작업 설명

  • 랜덤 포즈 중복 체크 로직을 ViewModel에서 Repository로 이전
  • getSingleRandomPose / getMultipleRandomPose Repository 함수 추가
  • RandomPoseRetryExhaustedException 커스텀 예외 추가
  • ViewModel의 fetchRandomPoseFetchPoseResult sealed class 제거
  • MAXIMUM_RANDOM_POSE_FALLBACK_COUNTMAXIMUM_RANDOM_POSE_RETRY_COUNT 네이밍 개선

📷 스크린샷

ikseong00 and others added 30 commits January 27, 2026 13:43
`MviIntentStore` 인터페이스에서 `postSideEffect` 함수를 제거하고, `MviIntentStoreImpl`에서는 해당 함수의 접근 제어자를 `private`으로 변경합니다.

이를 통해 ViewModel에서는 `onIntent`를 통해서만 SideEffect를 발생시키도록 강제하여, 단방향 데이터 흐름을 강화합니다.
미디어 업로드 티켓 발급 API의 응답 형식이 단일 객체에서 리스트 형태로 변경됨에 따라 관련 데이터 모델을 수정합니다.

- `MediaUploadTicketResponse`를 `MediaUploadTicketDataResponse`로 리네임하고, 내부에 `MediaUploadTicketItemResponse`를 포함하도록 구조를 변경합니다.
- `toModel()` 확장 함수를 `toModels()`로 변경하여 `List<MediaUploadTicket>`을 반환하도록 수정합니다.
- 이에 따라 `MediaUploadRepository`의 `getUploadTicket` 메서드의 반환 타입을 `Result<MediaUploadTicket>`에서 `Result<List<MediaUploadTicket>>`으로 변경합니다.
- 단일 사진을 업로드하는 `UploadSinglePhotoUseCase`에서는 티켓 리스트의 첫 번째 아이템을 사용하도록 수정합니다.
`ResultEventBus.sendResult`에 `allowDuplicate` 파라미터를 추가하여, `false`로 설정 시 중복된 결과값이 발행되는 것을 방지하도록 `Channel.CONFLATED`를 사용합니다.

[refactor] 사진 상세화면에서 중복 결과 전송 방지

사진 상세화면에서 보관함 업데이트 알림을 보낼 때 `allowDuplicate = false` 옵션을 사용하여, 보관함 화면으로 돌아갈 때 이벤트가 중복으로 전송되는 것을 막습니다.
`LazyVerticalStaggeredGrid`에 `contentPadding`을 직접 적용하여, 각 `item`에 개별적으로 적용되던 수평 `padding`을 제거합니다. 이를 통해 코드의 중복을 줄이고 레이아웃 관리 효율을 높였습니다.
이미지 추가 성공 시 `isLoading` 상태를 `false`로 변경하여 로딩 표시를 중단하도록 수정합니다.
`PhotoDetailState` 내에서 즐겨찾기 요청 `MutableSharedFlow`를 관리하도록 변경합니다.
이를 통해 기존 ViewModel 프로퍼티로 관리하던 즐겨찾기 상태(`originalFavorite`)를 `PhotoDetailState`의 `committedFavorite`로 이전하여 상태 관리의 일관성을 확보했습니다.

- `favoriteRequests`를 `PhotoDetailState`로 이동
- `FavoriteCommitted` 인텐트가 새로운 즐겨찾기 상태(`newFavorite`)를 포함하도록 수정
- 즐겨찾기 상태 업데이트 및 롤백 로직을 `committedFavorite` 기준으로 변경
`PhotoDetailState`에 있던 `favoriteRequests` `MutableSharedFlow`를 `PhotoDetailViewModel`로 이동시킵니다.
State는 UI 상태를 나타내는 순수한 데이터 클래스로 유지하고, 이벤트 처리는 ViewModel에서 담당하도록 역할을 분리합니다.
`PhotoDetailViewModel` 내 `favoriteRequests`의 가시성을 `public`에서 `private`으로 변경하여 캡슐화를 강화합니다.
또한, `handleFavoriteToggle` 함수에서 더 이상 사용되지 않는 `postSideEffect` 파라미터를 제거하여 코드를 간결하게 수정합니다.
포토카드 상세화면 `PhotoDetailState`의 `committedFavorite` 초기값을 `photo.isFavorite` 값으로 설정하여, 화면 진입 시 서버의 좋아요 상태를 정확히 반영하도록 수정합니다.
하나의 CTA 버튼과, 그 아래에 밑줄이 있는 텍스트 버튼을 포함하는 다이얼로그 `SingleButtonWithTextButtonAlertDialog`를 추가합니다.
Ojongseok and others added 23 commits February 6, 2026 08:35
[feat] #71 마이페이지 UI 수정 및 API 연동
- 포즈피드 각 아이템에 스크랩된 경우, 우측 상단에 스크랩 아이콘을 표시하도록 변경했습니다.
- 기존에 사용되던 `ic_scrap_selected` 아이콘을 `icon_scrap`으로 이름을 변경하여 재사용했습니다.
- 포즈 상세, 랜덤 포즈 화면에서 `ic_scrap_selected` 대신 `icon_scrap` 아이콘을 사용하도록 수정했습니다.
포즈피드, 랜덤포즈 등 포즈 상세 화면 진입 시, 초기 스크랩 상태가 항상 `false`로 지정되어 스크랩 여부와 관계 없이 빈 하트로 표시되는 문제가 있었습니다.

API 응답(`PoseResponse`)을 `Pose` 도메인 모델로 변환할 때, `isScrapped` 필드의 기본값을 `true`로 설정하여 이 문제를 해결했습니다.
포즈피드 상세화면의 상단 그라데이션의 알파 값을 0.4f에서 0.2f로 조정했습니다.
[feat] #77 포즈 API 연동 및 랜덤 포즈 추천 구현
기존의 단일 랜덤 포즈를 가져오는 `getRandomPose` 함수를, 중복을 제외하고 여러 개의 포즈를 가져올 수 있도록 `getSingleRandomPose` 와 `getMultipleRandomPose` 함수로 분리했습니다.

- `excludeIds` 파라미터를 추가하여 이미 가져온 포즈 ID를 제외하고 새로운 포즈를 요청합니다.
- `maxRetry` 파라미터를 통해 재시도 횟수를 제한하고, 새로운 포즈를 찾지 못할 경우 `RandomPoseRetryExhaustedException`을 발생시킵니다.
ViewModel에서 랜덤 포즈를 호출하고, 중복을 직접 검사하던 로직을 Repository 계층으로 옮겼습니다.

- `PoseRepository`에 중복을 제외하고 여러 포즈를 가져오는 `getMultipleRandomPose`와 단일 포즈를 가져오는 `getSingleRandomPose`를 추가했습니다.
- ViewModel은 이 새로운 Repository 메서드를 호출하여 비즈니스 로직을 단순화했습니다.
- 중복 포즈를 가져오려다 재시도 횟수를 모두 소진하면 발생하는 `RandomPoseRetryExhaustedException`을 새로 정의하여 예외 처리를 명확히 했습니다.
- `MAXIMUM_RANDOM_POSE_FALLBACK_COUNT` 상수의 이름을 `MAXIMUM_RANDOM_POSE_RETRY_COUNT`로 변경하여 역할을 더 명확하게 표현했습니다.
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Feb 6, 2026

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • 🔍 Trigger a full review
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/#85-random-pose-call-site

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.

@Ojongseok Ojongseok merged commit 748ff59 into main Feb 7, 2026
1 check passed
@ikseong00 ikseong00 deleted the refactor/#85-random-pose-call-site branch February 8, 2026 06:19
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