소스 정보
- 저장소
- puk0806/gugbab-claude
- 최근 소스 활동
- 2026년 4월 15일 01:55
- 감지된 SKILL.md 언어
- 한국어
- 스타
- 2
- 포크
- 0
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SOC 직업 분류 기준
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/puk0806/gugbab-claude --skill performance명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
DDD(Domain-Driven Design) 아키텍처 핵심 패턴 - 유비쿼터스 언어, 서브도메인, 바운디드 컨텍스트, Aggregate, Entity/VO, 도메인 서비스/이벤트, 레이어드 아키텍처
대규모 React/Next.js 프로젝트를 layer-first(types/·utils/·hooks/·api/·components/ 밑에 도메인이 반복되는 구조)에서 domain-first(feature/도메인 우선) 구조로 전환하는 설계 기준과 절차. Feature-Sliced Design 2.1 정본(layers 6종·slices·segments·import 규칙·@x 크로스임포트·public API), FSD를 쓰지 않는 경량 대안(features + shared 2~3계층 + ESLint import/no-restricted-paths), Next.js App Router 공존 전략(route group `()`·private folder `_`·colocation), Turborepo/Nx 모노레포에서 폴더↔패키지 승격 기준, colocation과 배럴 파일 성능 트레이드오프, 도메인 경계 역추출(import 그래프·change coupling·용어 클러스터), 전환 실패 패턴(shared 비대화·entities 남용·순환 의존·도메인=라우트 착각·조기 추상화). 도메인 개념 자체(바운디드 컨텍스트·유비쿼터스 언어)는 `architecture/ddd` 스킬을 참조한다.
소스 파일 수천 개 규모 프론트엔드 코드베이스를 멈추지 않고 점진 재구조화하는 실행 전략 - Strangler Fig / Branch by Abstraction / Parallel Change, ts-morph·jscodeshift codemod, PR 분할·검증 게이트·되돌리기, 테스트 없는 코드의 안전망, 작업 순서 설계와 위반 수 기반 진행 추적
| name | performance |
| description | React 19 + React Compiler 기준 성능 최적화 — 코드 스플리팅, 가상화, 번들 최적화 |
소스: https://react.dev/learn/react-compiler | https://react.dev/reference/react/lazy | https://tanstack.com/virtual/latest/docs/introduction 검증일: 2026-04-01
React Compiler v1.0(2025년 10월 안정 출시)은 빌드 타임에 자동 메모이제이션을 적용한다.
// ❌ React 19 + Compiler 환경에서 불필요
const value = useMemo(() => compute(a, b), [a, b])
const handler = useCallback(() => doSomething(x), [x])
const MemoComp = memo(MyComponent)
// ✅ 그냥 작성하면 Compiler가 자동 처리
const value = compute(a, b)
const handler = () => doSomething(x)
function MyComponent() { ... }
| 케이스 | 이유 |
|---|---|
| Rules of React 위반 코드 | Compiler가 감지하면 해당 컴포넌트 최적화 건너뜀 |
useEffect 의존성 정밀 제어 | 의존성 안정화가 필요한 경우 useMemo로 직접 처리 |
'use no memo' opt-out 구간 | 의도적으로 Compiler 제외한 코드 |
// Compiler opt-out이 필요한 경우
function SpecialComponent() {
'use no memo'
// 이 컴포넌트는 수동 최적화
}
React Compiler는 메모이제이션(리렌더링 방지)만 담당한다. 코드 스플리팅·가상화·번들 최적화는 별개 영역이다.
import { lazy, Suspense } from 'react'
const HeavyChart = lazy(() => import('./HeavyChart'))
function Dashboard() {
return (
<Suspense fallback={<div>로딩 중...</div>}>
<HeavyChart />
</Suspense>
)
}
import dynamic from 'next/dynamic'
// SSR 비활성화 (클라이언트 전용 컴포넌트)
const Chart = dynamic(() => import('./Chart'), { ssr: false })
// 로딩 상태 포함
const Modal = dynamic(() => import('./Modal'), {
loading: () => <p>로딩 중...</p>,
})
수천 개의 리스트/테이블 렌더링 시 DOM 노드 수를 줄이는 기법. React Compiler와 무관하게 필요하다.
import { useVirtualizer } from '@tanstack/react-virtual'
import { useRef } from 'react'
function VirtualList({ items }: { items: string[] }) {
const parentRef = useRef<HTMLDivElement>(null)
const virtualizer = useVirtualizer({
count: items.length,
getScrollElement: () => parentRef.current,
estimateSize: () => 40, // 아이템 예상 높이(px)
})
return (
<div ref={parentRef} style={{ height: '400px', overflow: 'auto' }}>
<div style={{ height: `${virtualizer.getTotalSize()}px`, position: 'relative' }}>
{virtualizer.getVirtualItems().map((virtualItem) => (
<div
key={virtualItem.key}
style={{
position: 'absolute',
top: ,
,
'%',
`${}`,
`(${})`,
}}
>
{items[virtualItem.index]}
))}
)
}
라이브러리 선택 기준:
| TanStack Virtual v3 | react-window | |
|---|---|---|
| 가변 높이 아이템 | 네이티브 지원 | 제한적 |
| 유지보수 활성도 | 활발 | 소극적 |
| 커스텀 레이아웃 | 높음 (헤드리스) | 낮음 |
| 신규 프로젝트 권장 | ✅ | 단순 고정 리스트만 |
import Image from 'next/image'
// ✅ next/image — 자동 WebP 변환, lazy loading, 크기 최적화
<Image
src="/hero.jpg"
alt="Hero"
width={1200}
height={600}
priority // LCP 이미지에만 사용
/>
// React DevTools Profiler API
import { Profiler } from 'react'
function onRender(
id: string, // Profiler id prop
phase: 'mount' | 'update' | 'nested-update',
actualDuration: number, // 커밋에 소요된 렌더링 시간 (ms)
baseDuration: number, // 메모이제이션 없이 렌더링 시 예상 시간
startTime: number, // 렌더링 시작 타임스탬프
commitTime: number // 커밋 타임스탬프
) {
console.log({ id, phase, actualDuration })
}
<Profiler id="Dashboard" onRender={onRender}>
<Dashboard />
</Profiler>