9148c358d0
Topic_Agent/Topic_Blog/Topics/Topics_Biz/Topics_Meeting/Topics_Rag의 마크다운 지식 문서를 Topic_General/Topic_Programming/Topic_Graphic/Topic_Business 4개 카테고리로 재분류. - 중복 제거: frontmatter의 status:duplicate/merged + duplicate_of/redirect_to 필드로 자기 자신을 중복으로 선언한 리다이렉트 stub 1032개 제거, 완전 동일 내용 파일 472개 제거, 동일 파일명·다른 내용 충돌 시 더 큰(완전한) 버전만 유지(162개 제거) — 총 1639개 중복 제거. - 분류: 폴더 단위로 명확한 항목(AI_and_ML/Coding/Architecture 등 → Programming, Comfyui/Visual_Effects → Graphic, Topics_Biz/Topics_Meeting/사업 등 → Business, Poetic_Blog_Writing/창의성/Game_Design 등 → General)은 폴더 우선순위로, 나머지 혼재 폴더(Topic_Agent/Topic_Blog/Topics 루트/Thinking & Reasoning/Other/UI_UX_Assets)는 title/tags 키워드 스코어링으로 파일 단위 분류(불명확한 경우 General로 폴백). 원본 폴더명은 "From_*" 서브폴더로 보존해 추적 가능성 유지. - 최종 배치: Programming 2784 / General 1608 / Graphic 285 / Business 249 = 4926개 문서. - 에이전트 운영 상태(.astra/.agent/.obsidian/sessions/memory/_company/docs/lessons/_shared/src)는 지식 콘텐츠가 아니므로 재분류 대상에서 제외하고 원위치 유지. - Topics/Topic_email(상위 보호 폴더 Topic_email과 파일명 100% 중복) 삭제 — 보호 폴더 자체는 미변경. - 완전히 비게 된 Topic_Agent/Topic_Blog/Topics_Biz/Topics_Rag 폴더 제거.
5.3 KiB
5.3 KiB
id, title, category, status, canonical_id, aliases, duplicate_of, source_trust_level, confidence_score, verification_status, tags, raw_sources, last_reinforced, github_commit, tech_stack
| id | title | category | status | canonical_id | aliases | duplicate_of | source_trust_level | confidence_score | verification_status | tags | raw_sources | last_reinforced | github_commit | tech_stack | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| wiki-2026-0508-client-components | Client Components | 10_Wiki/Topics | verified | self |
|
none | A | 0.9 | applied |
|
2026-05-10 | pending |
|
Client Components
매 한 줄
"매 interactive boundary". Client Components 매 React Server Components (RSC) 매 architecture 의 매 interactive half —
'use client'directive 매 매 module-level boundary marker, 매 hydration + state + browser API 매 가능한 영역. 매 2026 현재 Next.js 13+ App Router / Remix Single Fetch / TanStack Start 의 default model.
매 핵심
매 boundary model
'use client'매 file-top directive — 매 module 부터 dependent tree 매 client bundle 에 포함.- Server Component (default) 매 server-only render — 매 zero JS shipped.
- Client Component 매 hydrate —
useState/useEffect/ event handler / browser API 매 가능.
매 핵심 properties
- Composability: Server → Client 매 OK (props 통해), Client → Server 매 NOT (children prop slot 만 OK).
- Serialization: Server → Client props 매 serializable 만 (no functions, classes, Date OK via 2026 RSC payload).
- Bundle: 매 leaf client component 만 ship — 매 root 에서 'use client' 매 X.
매 응용
- Form 매 controlled input + validation.
- Animation / transition (Framer Motion, View Transitions API).
- Browser API (geolocation, clipboard, IndexedDB).
- Real-time (WebSocket, SSE consumer).
💻 패턴
Basic client component
'use client';
import { useState } from 'react';
export function Counter() {
const [n, setN] = useState(0);
return <button onClick={() => setN(n + 1)}>Count: {n}</button>;
}
Server Component → Client Component (props)
// page.tsx (Server)
import { getProducts } from '@/lib/db';
import { ProductGrid } from './ProductGrid';
export default async function Page() {
const products = await getProducts(); // server fetch
return <ProductGrid initial={products} />;
}
// ProductGrid.tsx (Client — interactive filter)
'use client';
import { useState } from 'react';
export function ProductGrid({ initial }: { initial: Product[] }) {
const [filter, setFilter] = useState('');
const visible = initial.filter(p => p.name.includes(filter));
return (
<>
<input value={filter} onChange={e => setFilter(e.target.value)} />
{visible.map(p => <Card key={p.id} {...p} />)}
</>
);
}
Client Component 안 Server Component (children slot)
// Layout.tsx (Client — needs onClick)
'use client';
export function Sidebar({ children }: { children: ReactNode }) {
return <aside onClick={...}>{children}</aside>;
}
// page.tsx (Server)
import { Sidebar } from './Sidebar';
import { ServerProfile } from './ServerProfile';
export default function Page() {
return (
<Sidebar>
<ServerProfile /> {/* Server component as children — OK */}
</Sidebar>
);
}
Server Action 호출 (Client → Server mutation)
'use client';
import { createPost } from './actions'; // 'use server' file
export function NewPostForm() {
return (
<form action={createPost}>
<input name="title" />
<button>Submit</button>
</form>
);
}
Suspense + Streaming
// page.tsx (Server)
import { Suspense } from 'react';
import { Comments } from './Comments';
export default function Page() {
return (
<>
<Article />
<Suspense fallback={<Skeleton />}>
<Comments /> {/* streamed in */}
</Suspense>
</>
);
}
매 결정 기준
| 상황 | Approach |
|---|---|
| Static rendering, data fetching | Server Component (default) |
| State / event / effect / browser API | Client Component |
| SEO + interactive (form) | Server shell + Client island |
| 매 entire page interactive (dashboard) | Mostly client, server outer layout |
기본값: 매 default Server Component — 매 boundary 를 leaf 에 push, 매 'use client' 매 minimum.
🔗 Graph
- 부모: React Server Components — 경계 의식
- 변형: Modern_Web_Rendering_and_Optimization · Server Actions
- 응용: Hydration · Suspense · Streaming SSR
- Adjacent: Islands Architecture · Astro
🤖 LLM 활용
언제: interactivity 매 필요한 leaf component, browser-only API, 매 form / input control. 언제 X: data fetching 매 only, static content — Server Component 가 더 light.
❌ 안티패턴
- Root layout 매 'use client': 매 entire app 매 client bundle — 매 RSC benefit 의 destruction.
- Server-only data 매 props 로 큰 객체 pass: 매 RSC payload bloat.
- Client component 안 server-only import (e.g.,
fs,db): 매 build error / leak risk. - Server Component 안 useState: 매 build error — 매 boundary 의 misunderstanding.
🧪 검증 / 중복
- Verified (React docs RSC 2026, Next.js 15 App Router guide).
- 신뢰도 A.
🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — 'use client' boundary + composition rules + Server Action |