Skip to content

refactor: 공통 SavedItemBase 추출 (PR-D)#73

Merged
bbbang105 merged 1 commit into
devfrom
feature/pr-d-common-item-base
Apr 21, 2026
Merged

refactor: 공통 SavedItemBase 추출 (PR-D)#73
bbbang105 merged 1 commit into
devfrom
feature/pr-d-common-item-base

Conversation

@bbbang105
Copy link
Copy Markdown
Owner

Summary

피드와 유튜브 아이템이 동일 의미의 공통 필드 10개를 각자 선언하고 있었음. 공통 UI(InlineNote / 북마크 / 핀 토글 / 읽음 토글)가 두 타입을 유사하게 소비 중이라 base interface 로 통합.

변경

  • 신규 `lib/types/saved-item.ts` — `SavedItemBase` 10필드 정의
  • `FeedItemData extends SavedItemBase` — 도메인 필드만 유지 (url, category, tags, collectedAt, sourceName). sourceId는 string로 narrow
  • `YoutubeItemData extends SavedItemBase` — 도메인 필드만 유지 (videoId, status, channelName, oneLiner, summarySource, keywords, duration)
  • 신규 `tests/saved-item-base.test.ts` — drift 회귀 가드 (3 tests)

불변

  • 런타임 동작 변동 없음 (타입만 재구성)
  • 필드 이름/타입 완전 동일
  • TypeScript structural typing 덕분에 기존 consumer 전부 호환
  • 257 tests (기존 254 + 새 3), typecheck 통과

가치

  • 새 공통 유틸/헬퍼가 SavedItemBase 하나로 가능
  • Drift 시 CI 즉시 실패
  • 새 아이템 타입(노트/팟캐스트) 추가 시 base 상속 시작 가능

Test plan

  • 피드 카드 렌더 (기존 필드 전부 접근 가능)
  • 유튜브 카드 렌더 (기존 필드 전부 접근 가능)
  • 저장 탭 / 북마크 / 핀 / InlineNote 동작 동일
  • CI green (typecheck / test / lint / build 4-job)

Follow-up

PR-E (컴포넌트 완전 분리: feed-list + youtube-feed) 예정.

🤖 Generated with Claude Code

피드와 유튜브 아이템이 동일한 의미의 공통 필드 10개(id, sourceId, title,
description, thumbnailUrl, publishedAt, isRead, isBookmarked, note, pinnedAt)
를 각자 선언하고 있었음. InlineNote / 북마크 / 핀 토글 / 읽음 토글 같은
공통 UI가 두 타입을 유사한 방식으로 소비 중이라 base interface 로 통합.

## 변경
- 신규: `packages/web/src/lib/types/saved-item.ts` — `SavedItemBase` 정의
- `FeedItemData extends SavedItemBase`: 도메인 필드만 유지 (url, category,
  tags, collectedAt, sourceName). sourceId 는 string 로 narrow.
- `YoutubeItemData extends SavedItemBase`: 도메인 필드만 유지 (videoId,
  status, channelName, oneLiner, summarySource, keywords, duration)
- 신규: `__tests__/saved-item-base.test.ts` — 두 concrete 타입이 base 와
  구조적으로 호환됨을 lock 하는 회귀 가드 (3 tests)

## 불변
- 런타임 동작 일절 변동 없음 (타입만 재구성)
- 필드 이름/타입 완전 동일 (sourceId는 FeedItemData에서만 non-null로 narrow)
- 컴파일 시 TS structural typing 덕분에 모든 기존 consumer 호환
- 257 tests 통과 (기존 254 + 새 3), typecheck 통과

## 가치
- SavedItemBase 를 받아 동작하는 공통 유틸(예: 향후 핀 토글 헬퍼, 북마크
  헬퍼)을 한 곳에 쓸 수 있음
- Drift 발생 시(예: 한쪽만 필드 rename) CI 에서 즉시 실패
- 새 아이템 타입 추가 시(예: 노트, 팟캐스트) 같은 base 로 시작 가능

Co-Authored-By: Claude <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 21, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
forme Ready Ready Preview, Comment Apr 21, 2026 5:38am

@bbbang105 bbbang105 added ✅ test 테스트 코드 🎫 rename 패키지 혹은 폴더명, 클래스명 수정 🔄 refactor 코드 리팩토링 🔧 ci CI/CD 파이프라인 변경 labels Apr 21, 2026
@bbbang105 bbbang105 merged commit 4c55932 into dev Apr 21, 2026
8 checks passed
@bbbang105 bbbang105 deleted the feature/pr-d-common-item-base branch April 21, 2026 06:05
bbbang105 added a commit that referenced this pull request Apr 21, 2026
PR #73 (SavedItemBase) + #74 (useBulkSelection) 머지 후속. 다음 세션에서
이 공통 프리미티브 위치를 바로 찾을 수 있도록 테이블에 등록.

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔧 ci CI/CD 파이프라인 변경 🔄 refactor 코드 리팩토링 🎫 rename 패키지 혹은 폴더명, 클래스명 수정 ✅ test 테스트 코드

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant