# TabContainerV2 구분선 문제 분석 및 해결 방안 ## 문제 개요 PlayerPanel의 TabContainerV2에서 ShopNowContents와 YouMayLikeContents 사이에 세로 구분선을 표시해야 하지만, 현재 TVirtualGridList 구조의 한계로 인해 올바르게 동작하지 않음 ## 현재 구조 분석 ### 1. TabContainerV2 구조 - 위치: `src/views/PlayerPanel/PlayerTabContents/v2/TabContainer.v2.jsx` - 3개의 tabIndex로 구성 (0: ShopNow, 1: LiveChannel, 2: ShopNowButton) - version=2에서 ShopNow와 YouMayLike 통합 표시 ### 2. ShopNowContents 구조 - 위치: `src/views/PlayerPanel/PlayerTabContents/TabContents/ShopNowContents.jsx` - ShopNow 아이템 < 3개일 때 YouMayLike 아이템을 통합하여 표시 - combinedItems 배열로 ShopNow + YouMayLike 통합 관리 - TVirtualGridList로 가로 방향 렌더링 (itemWidth: 310px, itemHeight: 445px, spacing: 30px) ### 3. 현재 구분선 구현 로직 ```javascript // YouMayLike 시작 지점 여부 (구분선 표시) const isYouMayLikeStart = shopNowInfo && index === shopNowInfo.length; return ( <> {isYouMayLikeStart &&
} ); ``` ## 문제 상세 ### 1. TVirtualGridList 구조적 한계 - TVirtualGridList는 각 아이템이 고정된 크기를 가짐 (itemWidth: 310px) - renderItem 함수 내에서 추가적인 요소(divider)를 렌더링하면 레이아웃 충돌 발생 - divider가 TItemCard와 같은 공간을 차지하려고 하여 빈 TItemCard가 표시되는 현상 ### 2. 포커스 이동 문제 - divider가 포커스를 받거나 포커스 이동을 방해하는 현상 - 실제 상품과 포커스 위치가 불일치하는 문제 ### 3. 간격 문제 - 구분선으로 인해 상품들 간의 간격이 넓어짐 - 사용자 경험 저하 ## 해결 방안 분석 ### 방안 1: TItemCard Wrapper 방식 ❌ **구현:** ```javascript
``` **CSS:** ```css .itemWrapper::before { content: ''; width: 2px; opacity: 0; } .itemWrapper.showDivider::before { opacity: 1; background: rgba(234, 234, 234, 0.3); } ``` **문제점:** - itemWidth를 310px → 327px로 증가시켜야 함 - 상품 간 간격이 넓어짐 - 포커스와 상품 위치 불일치 - 전체 레이아웃 변경 필요 ### 방안 2: Divider 아이템 추가 방식 ❌ **구현:** ```javascript // combinedItems에 divider 추가 items.push({ _type: 'divider' }); // renderItem에서 처리 if (item._type === 'divider') { return
; } ``` **문제점:** - divider가 TVirtualGridList 아이템으로 인식되어 TItemCard만큼 공간 차지 - ShopNow와 YouMayLike 사이 포커스 이동이 막힘 - 빈 공간이 생기는 문제 여전히 존재 ### 방안 3: 두 개의 TVirtualGridList 분리 방식 ✅ **구현:** ```javascript
[ShopNow1][ShopNow2]
[YouMayLike1][YouMayLike2]
``` **장점:** - 구분선을 완벽하게 제어 가능 - 각 TVirtualGridList가 독립적으로 동작 - 빈 TItemCard 문제 해결 - 레이아웃 깨짐 없음 - 기존 기능 모두 유지 가능 **고려사항:** - 포커스 이동 핸들러 구현 필요 - ShopNow 마지막 아이템 → 구분선 → YouMayLike 첫 아이템 - YouMayLike 첫 아이템 → 구분선 → ShopNow 마지막 아이템 - Spotlight 컨테이너 간 이동 수동 처리 필요 **포커스 이동 구현 예시:** ```javascript // ShopNow 마지막 아이템 onSpotlightRight={() => Spotlight.focus('divider-element')} // 구분선 SpottableDiv Spotlight.focus('shop-now-last')} onSpotlightRight={() => Spotlight.focus('you-may-like-first')} >
// YouMayLike 첫 아이템 onSpotlightLeft={() => Spotlight.focus('divider-element')} ``` ## 추천 해결책 **방안 3: 두 개의 TVirtualGridList 분리 방식**을 추천합니다. ### 이유 1. **근본적인 해결**: TVirtualGridList 구조적 한계를 완전히 회피 2. **레이아웃 안정성**: 각 컴포넌트가 독립적으로 동작하여 예측 가능한 결과 3. **유지보수성**: 기존 로직을 최소한만 수정하며 명확한 분리 4. **사용자 경험**: 포커스 이동이 더 명확하고 직관적 ### 구현 우선순위 1. ShopNow TVirtualGridList 분리 2. YouMayLike TVirtualGridList 분리 3. 구분선 SpottableDiv 추가 4. 포커스 이동 핸들러 구현 5. 테스트 및 디버깅 ### 영향 범위 - **수정 필요 파일**: `ShopNowContents.jsx` 1개 - **기존 기능**: 모두 유지 가능 - **성능 영향**: 미미 (VirtualGridList 인스턴스 1개 추가) - **사용자 영향**: 없음 (개선된 경험 제공) ## 관련 파일 - `src/views/PlayerPanel/PlayerTabContents/v2/TabContainer.v2.jsx` - `src/views/PlayerPanel/PlayerTabContents/TabContents/ShopNowContents.jsx` - `src/views/PlayerPanel/PlayerTabContents/TabContents/YouMayLikeContents.jsx` - `src/views/PlayerPanel/PlayerTabContents/TabContents/ShopNowContents.v2.module.less` - `src/components/TVirtualGridList/TVirtualGridList.jsx`