Skip to content

feat/ ootd 디자인#88

Merged
seokminseok merged 7 commits into
developfrom
feat/#82
Jun 19, 2026
Merged

feat/ ootd 디자인#88
seokminseok merged 7 commits into
developfrom
feat/#82

Conversation

@seokminseok

Copy link
Copy Markdown
Collaborator

📌 관련 이슈

관련된 이슈 번호를 작성해 주세요.

Closes #82


🛠️ 작업 내용

구현한 내용을 간략히 설명해 주세요.

✅ 변경 사항

  • [ ]
  • [ ]

🔍 테스트 내용

테스트한 방법과 결과를 작성해 주세요.

  • 단위 테스트 작성 / 확인
  • 기능 동작 확인

📷 스크린샷 (선택사항)

UI 변경이 있는 경우 첨부해 주세요.

💬 리뷰어에게

리뷰 시 특별히 봐줬으면 하는 부분이 있다면 작성해 주세요.


📋 PR 체크리스트

  • develop 브랜치를 base로 설정했나요?
  • 코드 컨벤션을 준수했나요?
  • 불필요한 주석 / 디버그 코드를 제거했나요?
  • 관련 이슈 번호를 연결했나요?

@seokminseok seokminseok linked an issue Jun 19, 2026 that may be closed by this pull request

@jychoi0831 jychoi0831 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

현재 head commit a570817 기준으로 확인했습니다.

Findings

  • [P1] 최신 developHomeTab.tsx 병합 충돌을 먼저 해소해야 합니다. git merge-tree --write-tree origin/develop a5708175b0e7a5349882c833f2fb9a3a1205ebaesrc/components/HomeTab.tsx content conflict로 실패했고, GitHub 메타데이터도 mergeable: CONFLICTING입니다. 현재 head는 RecommendationLabelootd를 다시 추가하고(src/components/HomeTab.tsx:172) OOTD를 라벨 grid 안에서 렌더링하는 이전 구조를 수정합니다(src/components/HomeTab.tsx:675, src/components/HomeTab.tsx:781). 반면 최신 developootd 라벨을 제거하고 OOTD를 상단 고정 섹션으로 분리한 상태라, 수동 충돌 해결 시 최신 홈 추천 구조를 되돌릴 위험이 큽니다. 최신 develop으로 rebase/merge한 뒤 Canvas 디자인을 현재 OOTD 상단 섹션 구조에 다시 적용해 주세요.

  • [P2] OOTD Canvas가 보호 이미지 처리 경로를 우회해 실제 사용자 옷 이미지가 빈 카드로 보일 수 있습니다. 새 OotdCanvas는 raw URL을 new Image()로 직접 로드하고(src/components/HomeTab.tsx:79) 바로 getImageData를 호출합니다(src/components/HomeTab.tsx:94). 그런데 OOTD 구성품에는 /api/v1/images/clothes/** 같은 BE 보호 이미지 URL이 들어올 수 있고, 기존 화면들은 이를 AuthenticatedImage/useAuthenticatedImageSrc로 blob 변환해 표시합니다(src/components/common/AuthenticatedImage.tsx:9). 현재처럼 combo.top?.imageUrl 등을 그대로 Canvas에 넘기면(src/components/HomeTab.tsx:831) 인증/CORS 실패 또는 tainted canvas 예외가 발생하고 catch가 console만 남겨 배경만 그려진 카드가 됩니다. Canvas 합성 전에 기존 fetchAuthenticatedImageObjectUrl 경로로 object URL을 만든 뒤 draw하거나, 실패 시 기존 AuthenticatedImage 기반 fallback을 렌더링해야 합니다.

검증

  • PASS: git diff --check origin/develop...a5708175b0e7a5349882c833f2fb9a3a1205ebae --
  • FAIL: git merge-tree --write-tree origin/develop a5708175b0e7a5349882c833f2fb9a3a1205ebae - src/components/HomeTab.tsx content conflict
  • PASS: npm ci --offline
  • PASS: npm run lint - 0 errors, 36 warnings
  • PASS: npm run build
  • GitHub checks: 현재 statusCheckRollup에 실행된 check가 없습니다.

Sync 확인

  • 대상 레포: BE
  • Sync 이슈 기록: 필요 없음
  • 사유: FE 홈 화면 표시 방식 변경이며 BE API 계약, enum/code, 문서 source of truth 변경은 없습니다.

본 리뷰는 Codex를 사용해 작성했습니다.

@jychoi0831 jychoi0831 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

현재 head commit ac85508 기준으로 확인했습니다.

Findings

  • [P2] OOTD를 다시 추천 라벨 탭으로 되돌리면서 공식 문서 기준과 코드가 어긋났습니다. 현재 FE 기준 문서는 RECO-001HomeTab 상단 고정 OOTD 섹션으로 두고, RecommendationLabel에서 ootd를 제거해 탭과 독립적으로 항상 로드한다고 명시합니다(docs/frontend/implementation-gaps.md:53, docs/frontend/implementation-gaps.md:64, docs/api/frontend-api-usage.md:263). 그런데 이번 head는 RecommendationLabelootd를 다시 추가하고(src/components/HomeTab.tsx:165), 초기 탭도 ootd로 바꾼 뒤(src/components/HomeTab.tsx:229) 라벨 grid에서 OOTD를 선택해야 렌더링되는 구조로 변경합니다(src/components/HomeTab.tsx:625, src/components/HomeTab.tsx:774). 의도한 제품 결정이 OOTD를 다시 탭으로 넣는 것이라면 관련 기준 문서와 gap 문서를 함께 갱신해야 하고, 아니라면 현재 develop의 상단 고정 OOTD 섹션 구조 위에 디자인 변경만 적용해야 합니다.

  • [P2] OOTD Canvas가 보호 이미지 처리 경로를 우회해 실제 사용자 옷 이미지가 빈 카드로 보일 수 있습니다. OotdCanvas는 구성품 URL을 new Image()로 직접 로드하고(src/components/HomeTab.tsx:49) getImageData를 호출합니다(src/components/HomeTab.tsx:64). 하지만 옷 이미지는 /api/v1/images/clothes/** 형태의 보호 URL일 수 있고, 기존 화면은 이를 AuthenticatedImage/useAuthenticatedImageSrc가 axios blob URL로 바꿔 표시합니다(src/components/common/AuthenticatedImage.tsx:9, src/utils/authenticatedImageUrl.ts:34). 이번 변경은 combo.top?.imageUrl 등을 그대로 Canvas에 넘기므로(src/components/HomeTab.tsx:824) 인증/CORS 실패 또는 tainted canvas 예외가 나면 catch에서 console만 남기고 카드에는 배경만 남습니다. Canvas 합성 전에 fetchAuthenticatedImageObjectUrl로 object URL을 만든 뒤 draw하거나, 실패 시 기존 AuthenticatedImage 기반 fallback을 렌더링해야 합니다.

검증

  • PASS: git diff --check origin/develop...ac85508e0fde8b9b9173c9f9e4d64218392ebe65 --
  • PASS: git merge-tree --write-tree origin/develop ac85508e0fde8b9b9173c9f9e4d64218392ebe65
  • PASS: npm ci --offline
  • PASS: npm run lint - 0 errors, 36 warnings
  • PASS: npm run build
  • PASS: GitHub CI Lint & Build

이전 리뷰 확인

  • 해결됨: 최신 develop과의 HomeTab.tsx merge conflict는 해소됐습니다.
  • 미해결: 보호 이미지 URL을 Canvas가 직접 읽는 문제는 남아 있습니다.

Sync 확인

  • 대상 레포: BE
  • Sync 이슈 기록: 필요 없음
  • 사유: FE 홈 화면 표시 방식 변경이며 BE API 계약, enum/code, 문서 source of truth 변경은 없습니다.

본 리뷰는 Codex를 사용해 작성했습니다.

@jychoi0831 jychoi0831 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

현재 head commit 2171ce0 기준으로 확인했습니다.

Findings

  • [P2] 추천 액션 후 상단 OOTD가 더 이상 갱신되지 않습니다. 현재 onWishlistChanged는 style/match 상태만 비우고 refreshSignal을 증가시킵니다(src/components/HomeTab.tsx:280). 그런데 OOTD fetch effect는 ootdItems.length === 0일 때만 다시 호출됩니다(src/components/HomeTab.tsx:403). 따라서 toggleWishlist, handleFeedback, addPurchasedToCloset가 성공해서 onWishlistChanged를 호출해도 기존 OOTD 카드가 남아 있으면 refreshSignal 변경만으로는 GET /api/v1/ootd/{wardrobeId}를 다시 호출하지 않습니다. 특히 구매 후 보유 옷장 전환처럼 wardrobe 데이터가 바뀐 뒤에도 상단 OOTD는 이전 추천을 계속 보여줄 수 있습니다. 기존 develop처럼 이 콜백에서 setOotdItems([])setOotdLoading(true)를 함께 수행하거나, refreshSignal 변경 시 OOTD를 강제로 refetch하도록 조건을 조정해 주세요.

Notes

  • 이전 리뷰의 merge conflict는 해소됐습니다.
  • 이전 리뷰의 OOTD 라벨 재도입 문제도 해소되어 RecommendationLabel은 다시 style | similar | match | aimd이고, OOTD는 상단 독립 섹션으로 렌더링됩니다.
  • 보호 이미지 URL은 fetchAuthenticatedImageObjectUrl를 거치도록 개선됐습니다. 다만 생성된 object URL을 해제하지 않는 구조라(src/components/HomeTab.tsx:149) 추후 cleanup에서 URL.revokeObjectURL까지 같이 처리하는 편이 좋습니다.

검증

  • PASS: git diff --check origin/develop...2171ce03e7d6e979924fbe65df955e709247b828 --
  • PASS: git merge-tree --write-tree origin/develop 2171ce03e7d6e979924fbe65df955e709247b828
  • PASS: npm ci --offline
  • PASS: npm run lint - 0 errors, 37 warnings
  • PASS: npm run build
  • PASS: GitHub CI Lint & Build

Sync 확인

  • 대상 레포: BE
  • Sync 이슈 기록: 필요 없음
  • 사유: FE 홈 화면 표시 방식 변경이며 BE API 계약, enum/code, 문서 source of truth 변경은 없습니다.

본 리뷰는 Codex를 사용해 작성했습니다.

@jychoi0831 jychoi0831 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

현재 head commit 2171ce0 기준으로 확인했습니다.

동일 head commit에 대한 재리뷰입니다.

Findings

  • [P2] 추천/저장 액션 이후 상단 OOTD가 갱신되지 않습니다. 현재 onWishlistChanged는 style/match 상태만 비우고 refreshSignal을 증가시킵니다(src/components/HomeTab.tsx:280). 하지만 OOTD fetch는 ootdItems.length === 0일 때만 실행됩니다(src/components/HomeTab.tsx:403), 그래서 refreshSignal이 바뀌어도 기존 OOTD 카드가 남아 있으면 GET /api/v1/ootd/{wardrobeId}를 다시 호출하지 않습니다. 또한 하위 추천 컴포넌트의 저장/구매 전환 경로도 onWishlistAdded={onRefreshWardrobe} 또는 onSaved={onRefreshWardrobe}만 호출하므로(src/components/HomeTab.tsx:837, src/components/HomeTab.tsx:842, src/components/HomeTab.tsx:850, src/components/HomeTab.tsx:1011) 부모 옷장 목록은 새로고침돼도 상단 OOTD 상태는 그대로 남습니다. 위시리스트 저장, 추천 제외, 구매 후 보유 옷장 전환처럼 wardrobe 데이터가 바뀐 뒤에도 사용자는 이전 OOTD 조합을 계속 볼 수 있으니, 기존 develop처럼 이 갱신 경로에서 setOotdItems([])setOotdLoading(true)를 함께 수행하거나 refreshSignal/wardrobe 변경 시 OOTD를 강제로 refetch하도록 조건을 조정해 주세요.

  • [P3] 유사 상품/AI MD 탭에서도 style 탭의 count, error, loading/empty 상태가 같이 노출될 수 있습니다. selectedRecommendationssimilaraimd에서 항상 빈 배열을 반환합니다(src/components/HomeTab.tsx:317), 그런데 헤더 count와 style error는 activeLabel !== "match" 기준으로 표시됩니다(src/components/HomeTab.tsx:731, src/components/HomeTab.tsx:732). 빈 상태와 skeleton도 같은 조건을 사용합니다(src/components/HomeTab.tsx:737, src/components/HomeTab.tsx:747). 결과적으로 유사 상품이나 AI MD 탭을 열었을 때 실제 목록은 하위 컴포넌트가 렌더링되는데 상단에는 0개, style API 에러, style skeleton/empty 문구가 함께 보일 수 있습니다. style 전용 상태는 다시 activeLabel === "style"로 한정하거나 각 탭 컴포넌트가 자신의 count/loading/error를 표시하도록 분리하는 편이 좋습니다.

Notes

  • 이전 리뷰의 merge conflict는 해소된 상태로 유지되고, GitHub mergeableMERGEABLE입니다.
  • 이전 리뷰의 OOTD 라벨 재도입 문제도 해소되어 RecommendationLabelstyle | similar | match | aimd이고, OOTD는 상단 독립 섹션으로 렌더링됩니다.
  • 보호 이미지 URL은 fetchAuthenticatedImageObjectUrl 경로를 거치도록 개선됐습니다. 다만 생성한 object URL을 해제하지 않는 구조라(src/components/HomeTab.tsx:149) 추후 cleanup에서 URL.revokeObjectURL을 같이 처리하는 편이 좋습니다.

검증

  • PASS: git diff --check origin/develop...2171ce03e7d6e979924fbe65df955e709247b828 --
  • PASS: git merge-tree --write-tree origin/develop 2171ce03e7d6e979924fbe65df955e709247b828
  • PASS: npm ci --offline
  • PASS: npm run lint - 0 errors, 37 warnings
  • PASS: npm run build
  • PASS: GitHub CI Lint & Build
  • 로컬 환경 메모: git fetch origin은 DNS 제한으로 실패했지만, GitHub API에서 원격 develop과 로컬 origin/develop이 모두 d1464f15f72c11e3cabf95d72cf88129b0cf57c7임을 확인했습니다.

Sync 확인

  • 대상 레포: BE
  • Sync 이슈 기록: 필요 없음
  • 사유: FE 홈 화면 표시 방식 변경이며 BE API 계약, enum/code, 문서 source of truth 변경은 없습니다.

본 리뷰는 Codex를 사용해 작성했습니다.

@jychoi0831 jychoi0831 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

현재 head commit 1ead3bc 기준으로 확인했습니다.

Findings

  • [P1] 현재 head는 TypeScript build가 실패해서 머지할 수 없습니다. HomeTab에서 SimilarProductRecommendationsonRefreshWardrobe={handleRefreshAll}를 추가했지만(src/components/HomeTab.tsx:842), 해당 컴포넌트의 props 타입은 userId, existingGarments, onWishlistAdded, onGoToCloset만 선언합니다(src/components/SimilarProductRecommendations.tsx:41). 이 때문에 npm run buildTS2322: Property 'onRefreshWardrobe' does not exist on type 'SimilarProductRecommendationsProps'로 실패했고, GitHub CI Lint & Build도 실패 상태입니다. 이미 같은 콜백을 onWishlistAdded={handleRefreshAll}로 넘기고 있으니 중복 prop을 제거하거나, 실제로 별도 콜백이 필요하다면 SimilarProductRecommendationsProps와 내부 호출부를 함께 추가해 주세요.

Notes

  • 이전 리뷰의 추천/저장 액션 후 OOTD 미갱신 문제는 handleRefreshAllsetOotdItems([])setOotdLoading(true)를 수행하고, match/similar/aimd/Outfit 저장 경로에 전달되도록 개선됐습니다.
  • 이전 리뷰의 유사 상품/AI MD 탭에서 style 상태가 함께 보이던 문제도 style 전용 count/error/loading/empty 조건으로 되돌아와 해소됐습니다.
  • 보호 이미지 URL은 계속 fetchAuthenticatedImageObjectUrl 경로를 거치지만, 생성한 object URL을 해제하지 않는 구조는 추후 cleanup에서 URL.revokeObjectURL을 같이 처리하는 편이 좋습니다.

검증

  • PASS: git diff --check origin/develop...1ead3bc236475b7c47b3a58a3cb2577ffdcd34a5 --
  • PASS: git merge-tree --write-tree origin/develop 1ead3bc236475b7c47b3a58a3cb2577ffdcd34a5
  • PASS: npm ci --offline
  • PASS: npm run lint - 0 errors, 39 warnings
  • FAIL: npm run build - src/components/HomeTab.tsx(842,17): error TS2322
  • FAIL: GitHub CI Lint & Build

Sync 확인

  • 대상 레포: BE
  • Sync 이슈 기록: 필요 없음
  • 사유: FE 홈 화면/검증 실패 수정 범위이며 BE API 계약, enum/code, 문서 source of truth 변경은 없습니다.

본 리뷰는 Codex를 사용해 작성했습니다.

@jychoi0831 jychoi0831 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

현재 head commit 7045b4d 기준으로 확인했습니다.

Findings

  • 머지 차단 이슈는 확인되지 않았습니다.

Notes

  • 이전 리뷰의 SimilarProductRecommendations 미선언 prop으로 인한 TypeScript build 실패는 해소됐습니다.
  • 이전 리뷰의 추천/저장 액션 후 OOTD 미갱신 문제는 handleRefreshAll이 OOTD/style/match를 함께 초기화하고 하위 추천 저장 경로에 전달되도록 개선되어 해소됐습니다.
  • 이전 리뷰의 유사 상품/AI MD 탭에서 style 상태가 함께 보이던 문제도 style 전용 조건으로 되돌아와 해소됐습니다.
  • 참고: OotdCanvas에서 fetchAuthenticatedImageObjectUrl로 생성한 object URL 해제는 아직 없어, 후속 cleanup에서 URL.revokeObjectURL을 같이 처리하는 편이 좋습니다.

검증

  • PASS: git diff --check origin/develop...7045b4de38c261900af5ae227f958aae210a863b --
  • PASS: git merge-tree --write-tree origin/develop 7045b4de38c261900af5ae227f958aae210a863b
  • PASS: npm ci --offline
  • PASS: npm run lint - 0 errors, 39 warnings
  • PASS: npm run build
  • PASS: GitHub CI Lint & Build

Sync 확인

  • 대상 레포: BE
  • Sync 이슈 기록: 필요 없음
  • 사유: FE 홈 화면/코디 상세 표시 및 검증 수정 범위이며 BE API 계약, enum/code, 문서 source of truth 변경은 없습니다.

본 리뷰는 Codex를 사용해 작성했습니다.

@seokminseok seokminseok merged commit aab9ab7 into develop Jun 19, 2026
1 check passed
@seokminseok seokminseok deleted the feat/#82 branch June 19, 2026 14:35
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.

feat/ ootd 디자인 재구성

2 participants