IT
Claude Code용 설계 패턴 md 파일
메타인지 월드
2025. 9. 20. 21:56
반응형
활용 용도
에이전트 코딩 툴인 Claude Code CLI 에서 활용할 수 있는 설계 패턴 파일을 만들었습니다. 유사한 분야에 아래의 md 파일을 활용해서 개발에 적용하면 시행착오를 줄일 수 있습니다.
설계 패턴 설명
🎯 MCMP (Modular Content Management Pattern)
왜 이 이름인가?
- "Modular": 카테고리별 독립 모듈화 핵심
- "Content": 스니펫 대신 일반 컨텐츠로 추상화
- "Management": 검색, 필터링, CRUD 기능 포함
- "Pattern": 재사용 가능한 설계 템플릿
🔄 다른 앱에 적용 예시
1. 레시피 앱 (Recipe Management)
text
src/
├── components/ # UI 컴포넌트
├── data/ # 데이터 레이어
│ └── recipes/ # 요리 카테고리별 모듈
│ ├── korean.js # 한식 레시피
│ ├── italian.js # 이탈리안 레시피
│ └── [cuisine].js
├── hooks/ # 커스텀 훅
└── utils/ # 유틸리티
레시피 데이터 구조:
javascript
{
title: "비빔밥",
cuisine: "korean", // 카테고리
ingredients: ["밥", "고추장", "나물"], // 태그 역할
instructions: "...", // 코드 역할
prepTime: "20분",
difficulty: "medium"
}
2. 강의 관리 앱 (Course Library)
text
data/courses/
├── javascript/ # JS 강의
├── python/ # Python 강의
└── [subject].js # 새 과목
강의 데이터:
javascript
{
title: "React Hooks 심화",
subject: "javascript",
content: "useEffect의 의존성 배열...", // 강의 내용
tags: ["react", "hooks", "advanced"],
duration: "15분",
level: "intermediate"
}
3. 제품 카탈로그 (E-commerce)
text
data/products/
├── electronics/ # 전자제품
├── clothing/ # 의류
└── [category].js
제품 데이터:
javascript
{
name: "iPhone 15 Pro",
category: "electronics",
description: "최신 모델...",
specifications: ["6.1인치", "A17 Pro"], // 태그 역할
price: 1299000,
rating: 4.8
}
🏗️ 범용 아키텍처 템플릿
MCMP 기본 구조
text
src/
├── components/ # 공통 UI 컴포넌트
│ ├── ContentCard.jsx # 카드 컴포넌트
│ ├── SearchBar.jsx # 검색 UI
│ └── ModalViewer.jsx # 상세 보기
├── data/ # 컨텐츠 레이어
│ ├── content/ # 카테고리별 컨텐츠
│ │ ├── [category].js # 동적 카테고리
│ │ └── index.js # 중앙 오케스트레이터
│ └── types/ # 데이터 타입 정의
├── hooks/ # 비즈니스 로직
│ ├── useContentSearch.js # 검색 훅
│ └── useContentFilter.js # 필터링 훅
├── services/ # 외부 연동
│ └── ContentService.js # API 추상화
└── utils/ # 공통 유틸리티
├── idGenerator.js # ID 생성기
└── validator.js # 데이터 검증
범용 데이터 스키마
javascript
// 모든 컨텐츠 타입의 공통 구조
export const ContentSchema = {
id: string, // 자동 생성 ID
title: string, // 필수: 제목
category: string, // 필수: 카테고리
content: string, // 필수: 메인 컨텐츠
tags: string[], // 필수: 검색용 태그
metadata: { // 선택: 카테고리별 메타데이터
[key: string]: any
},
createdAt: Date, // 선택: 생성일
updatedAt: Date // 선택: 수정일
};
🔧 구현 템플릿 (Starter Kit)
1. 중앙 오케스트레이터
javascript
// data/content/index.js
export const contentCategories = {
// 앱별로 카테고리 정의
// javascript: "JavaScript Snippets",
// recipes: "Korean Recipes"
};
export const categoryImports = {};
// 동적 카테고리 로드
export const loadCategory = async (category) => {
const loader = categoryImports[category];
if (!loader) throw new Error(`Category ${category} not found`);
return await loader().then(module => module.default);
};
// 모든 컨텐츠 로드
export const loadAllContent = async () => {
const allContent = [];
for (const [category, loader] of Object.entries(categoryImports)) {
try {
const content = await loader();
allContent.push(...content.map(item => ({
...item,
category,
id: `${category}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
})));
} catch (error) {
console.warn(`Failed to load ${category}:`, error);
}
}
return allContent;
};
2. 범용 검색 훅
javascript
// hooks/useContentSearch.js
import { useState, useMemo, useCallback } from 'react';
export const useContentSearch = (initialContent = []) => {
const [searchTerm, setSearchTerm] = useState('');
const [selectedCategory, setSelectedCategory] = useState('all');
const filteredContent = useMemo(() => {
return initialContent.filter(content => {
// 검색 매칭
const matchesSearch = !searchTerm || (
content.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
content.tags.some(tag =>
tag.toLowerCase().includes(searchTerm.toLowerCase())
) ||
content.content.toLowerCase().includes(searchTerm.toLowerCase())
);
// 카테고리 매칭
const matchesCategory = selectedCategory === 'all' ||
content.category === selectedCategory;
return matchesSearch && matchesCategory;
});
}, [initialContent, searchTerm, selectedCategory]);
const clearSearch = useCallback(() => {
setSearchTerm('');
setSelectedCategory('all');
}, []);
return {
searchTerm,
setSearchTerm,
selectedCategory,
setSelectedCategory,
filteredContent,
clearSearch,
hasResults: filteredContent.length > 0
};
};
3. 카테고리별 설정
javascript
// config/contentConfig.js
export const ContentConfig = {
// 스니펫 앱용
snippets: {
categories: {
javascript: { icon: "⚡", color: "#f7df1e", label: "JavaScript" },
python: { icon: "🐍", color: "#3776ab", label: "Python" }
}
},
// 레시피 앱용
recipes: {
categories: {
korean: { icon: "🇰🇷", color: "#ce1126", label: "한식" },
italian: { icon: "🇮🇹", color: "#009246", label: "이탈리안" }
}
},
// 강의 앱용
courses: {
categories: {
javascript: { icon: "📚", color: "#f7df1e", label: "프론트엔드" },
dataScience: { icon: "📊", color: "#2e86ab", label: "데이터 사이언스" }
}
}
};
🚀 적용 체크리스트
Phase 1: 기본 설정
- data/content/ 폴더 구조 생성
- 첫 번째 카테고리 데이터 파일 작성
- 중앙 오케스트레이터 구현
- 기본 검색/필터링 훅 작성
Phase 2: UI 통합
- ContentCard 컴포넌트 구현
- SearchBar 컴포넌트 구현
- ModalViewer 컴포넌트 구현
- 카테고리별 스타일링 적용
Phase 3: 고급 기능
- 즐겨찾기 시스템 추가
- 로컬 스토리지 연동
- 에러 바운더리 구현
- 접근성 개선
Phase 4: 확장
- 새 카테고리 추가 프로세스 테스트
- API 서비스 레이어 구현
- 성능 측정 및 최적화
📋 앱별 커스터마이징 가이드
스니펫 | code, language | 코드 하이라이팅 | 복사 버튼 |
레시피 | ingredients, prepTime | 이미지 중심 | 영양 정보 |
강의 | duration, level | 비디오 임베드 | 진행률 표시 |
제품 | price, rating | 가격 강조 | 장바구니 |
🎖️ MCMP의 핵심 가치
개발자 입장
✅ 빠른 프로토타이핑: 템플릿으로 80% 구현 완료
✅ 일관된 구조: 팀원 간 코드 이해 쉬움
✅ 확장 용이: 새 기능 추가 시 예측 가능한 패턴
사용자 입장
✅ 빠른 검색: 통합 검색으로 즉시 찾기
✅ 직관적 탐색: 카테고리별 체계적 구성
✅ 성능 우수: 지연 로딩으로 빠른 응답
비즈니스 입장
✅ 비용 절감: 재사용 가능한 설계로 개발 비용 ↓
✅ 유지보수성: 모듈화로 버그 수정 시간 ↓
✅ 스케일링: 새로운 컨텐츠 타입 쉽게 추가
이 MCMP 패턴을 사용하면 어떤 컨텐츠 관리 앱이든 빠르고 확장 가능하게 구축할 수 있습니다!
설계 패턴 파일
DESIGN-PATTERN.md
# 최적 설계 패턴
> 확장성, 유지보수성, 유연성을 고려한 코드 스니펫 관리 앱 설계 가이드
## 📋 목차
1. [전체 아키텍처](#전체-아키텍처)
2. [모듈화 전략](#모듈화-전략)
3. [데이터 관리](#데이터-관리)
4. [UI/UX 패턴](#uiux-패턴)
5. [성능 최적화](#성능-최적화)
6. [확장성 고려사항](#확장성-고려사항)
7. [최적 관행](#최적-관행)
---
## 🏗️ 전체 아키텍처
### 계층별 구조
```
src/
├── components/ # 재사용 가능한 UI 컴포넌트
├── data/ # 데이터 레이어
│ └── snippets/ # 카테고리별 스니펫 모듈
├── hooks/ # 커스텀 React 훅
├── utils/ # 유틸리티 함수
└── styles/ # 전역 스타일
```
### 핵심 설계 원칙
1. **관심사 분리**: UI, 데이터, 비즈니스 로직 분리
2. **단일 책임**: 각 모듈은 하나의 명확한 목적
3. **의존성 역전**: 인터페이스 기반 설계
4. **확장성 우선**: 새로운 기능 추가 용이
---
## 🧩 모듈화 전략
### 1. 카테고리별 파일 분리
**✅ 권장 구조:**
```javascript
// data/snippets/
├── index.js // 중앙 오케스트레이터
├── javascript.js // JavaScript 스니펫
├── python.js // Python 스니펫
├── spring-boot.js // Spring Boot 스니펫
└── [category].js // 새 카테고리별 파일
```
**장점:**
- 독립적 관리 가능
- 병렬 개발 지원
- 충돌 최소화
- 로딩 성능 최적화
### 2. 동적 import 시스템
```javascript
// 카테고리별 지연 로딩
const categoryImports = {
javascript: () => import('./javascript.js').then(m => m.javascriptSnippets),
python: () => import('./python.js').then(m => m.pythonSnippets),
// 새 카테고리 쉽게 추가 가능
};
```
**이점:**
- 초기 로딩 시간 단축
- 필요시에만 리소스 로드
- 번들 크기 최적화
---
## 📊 데이터 관리
### 1. 자동 ID 생성 시스템
**❌ 피해야 할 방식:**
```javascript
// 수동 ID 관리 (충돌 위험)
{ id: 17, title: "FastAPI", ... }
{ id: 18, title: "Pandas", ... }
```
**✅ 권장 방식:**
```javascript
// 자동 ID 생성
snippets.map((snippet, index) => ({
...snippet,
id: `${category}-${index + 1}`,
originalId: snippet.id // 필요시 보존
}))
```
**장점:**
- ID 충돌 완전 방지
- 카테고리별 자동 정렬
- 유지보수 부담 제거
### 2. 스니펫 데이터 구조
```javascript
// 표준 스니펫 객체 구조
{
title: string, // 필수: 스니펫 제목
language: string, // 필수: 프로그래밍 언어
category: string, // 필수: 카테고리 분류
code: string, // 필수: 코드 내용
tags: string[], // 필수: 검색용 태그
description?: string, // 선택: 상세 설명
author?: string, // 선택: 작성자
createdAt?: Date, // 선택: 생성일
difficulty?: 'easy'|'medium'|'hard' // 선택: 난이도
}
```
---
## 🎨 UI/UX 패턴
### 1. 모달 기반 상세 보기
**설계 근거:**
- 스니펫 수가 증가해도 성능 유지
- 전체 화면 활용으로 가독성 향상
- ESC 키, 클릭 외부 영역으로 직관적 닫기
```javascript
// 모달 상태 관리
const [selectedSnippet, setSelectedSnippet] = useState(null);
// ESC 키 핸들링
useEffect(() => {
const handleEsc = (e) => {
if (e.key === 'Escape') setSelectedSnippet(null);
};
if (selectedSnippet) {
document.addEventListener('keydown', handleEsc);
return () => document.removeEventListener('keydown', handleEsc);
}
}, [selectedSnippet]);
```
### 2. 카드 기반 프리뷰
```javascript
// 프리뷰 카드 최적화
<div className="snippet-card">
<h3>{snippet.title}</h3>
<span className="language-badge">{snippet.language}</span>
<pre className="code-preview">
{snippet.code.split('\n').slice(0, 3).join('\n')}
{snippet.code.split('\n').length > 3 && '\n...'}
</pre>
<div className="tags">
{snippet.tags.map(tag => <span key={tag}>{tag}</span>)}
</div>
</div>
```
### 3. 실시간 검색 및 필터링
```javascript
// 통합 검색 로직
const filteredSnippets = snippets.filter(snippet => {
const matchesSearch =
snippet.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
snippet.tags.some(tag => tag.toLowerCase().includes(searchTerm.toLowerCase())) ||
snippet.code.toLowerCase().includes(searchTerm.toLowerCase());
const matchesCategory = selectedCategory === 'all' ||
snippet.category === selectedCategory;
return matchesSearch && matchesCategory;
});
```
---
## ⚡ 성능 최적화
### 1. 코드 분할 (Code Splitting)
```javascript
// 카테고리별 청크 분할
const categoryImports = {
javascript: () => import(
/* webpackChunkName: "snippets-javascript" */
'./javascript.js'
),
python: () => import(
/* webpackChunkName: "snippets-python" */
'./python.js'
),
};
```
### 2. 로딩 상태 관리
```javascript
// 사용자 피드백 제공
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const loadData = async () => {
try {
setLoading(true);
const data = await loadAllSnippets();
setSnippets(data);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
```
### 3. 메모이제이션 활용
```javascript
// 비싼 계산 결과 캐싱
const categoryCounts = useMemo(() => {
return snippets.reduce((acc, snippet) => {
acc[snippet.category] = (acc[snippet.category] || 0) + 1;
return acc;
}, {});
}, [snippets]);
```
---
## 🚀 확장성 고려사항
### 1. 새 카테고리 추가
**단계별 확장 방법:**
1. **새 스니펫 파일 생성**
```javascript
// data/snippets/golang.js
export const golangSnippets = [
{
title: "Go HTTP Server",
language: "go",
category: "golang",
code: `package main...`,
tags: ["go", "http", "server"]
}
];
```
2. **중앙 레지스트리 업데이트**
```javascript
// data/snippets/index.js
export const snippetCategories = {
// 기존 카테고리들...
golang: "Go Language" // 새 카테고리 추가
};
const categoryImports = {
// 기존 import들...
golang: () => import('./golang.js').then(m => m.golangSnippets)
};
```
### 2. 고급 기능 확장
**즐겨찾기 시스템:**
```javascript
// localStorage 기반 즐겨찾기
const [favorites, setFavorites] = useState(() => {
const saved = localStorage.getItem('snippet-favorites');
return saved ? JSON.parse(saved) : [];
});
const toggleFavorite = (snippetId) => {
const newFavorites = favorites.includes(snippetId)
? favorites.filter(id => id !== snippetId)
: [...favorites, snippetId];
setFavorites(newFavorites);
localStorage.setItem('snippet-favorites', JSON.stringify(newFavorites));
};
```
**카테고리별 설정:**
```javascript
// 카테고리별 메타데이터
const categoryConfig = {
javascript: {
icon: "🟨",
color: "#f7df1e",
description: "JavaScript & ES6+ features"
},
python: {
icon: "🐍",
color: "#3776ab",
description: "Python scripts and frameworks"
}
};
```
### 3. 데이터베이스 연동 준비
**추상화 레이어 설계:**
```javascript
// services/snippetService.js
class SnippetService {
async loadAllSnippets() {
// 현재: 정적 import
// 향후: API 호출
}
async saveSnippet(snippet) {
// 향후: POST /api/snippets
}
async deleteSnippet(id) {
// 향후: DELETE /api/snippets/:id
}
}
```
---
## 🎯 최적 관행
### 1. 코드 조직
**파일 명명 규칙:**
- `camelCase`: JavaScript 파일/함수명
- `kebab-case`: CSS 클래스명
- `PascalCase`: React 컴포넌트명
**폴더 구조 원칙:**
- 기능별 그룹핑 우선
- 공통 요소는 상위 레벨
- 최대 3단계 깊이 제한
### 2. 에러 처리
```javascript
// 포괄적 에러 처리
const ErrorBoundary = ({ children }) => {
const [hasError, setHasError] = useState(false);
useEffect(() => {
const handleError = (error) => {
console.error('Snippet loading error:', error);
setHasError(true);
};
window.addEventListener('unhandledrejection', handleError);
return () => window.removeEventListener('unhandledrejection', handleError);
}, []);
if (hasError) {
return <div>스니펫을 불러오는 중 오류가 발생했습니다.</div>;
}
return children;
};
```
### 3. 접근성 (Accessibility)
```javascript
// 키보드 네비게이션 지원
const SnippetCard = ({ snippet, onClick }) => (
<div
className="snippet-card"
onClick={onClick}
onKeyDown={(e) => e.key === 'Enter' && onClick()}
tabIndex={0}
role="button"
aria-label={`${snippet.title} 스니펫 보기`}
>
{/* 카드 내용 */}
</div>
);
```
### 4. 테스트 가능한 설계
```javascript
// 순수 함수로 로직 분리
export const filterSnippets = (snippets, searchTerm, category) => {
return snippets.filter(snippet => {
const matchesSearch = snippet.title.toLowerCase().includes(searchTerm.toLowerCase());
const matchesCategory = category === 'all' || snippet.category === category;
return matchesSearch && matchesCategory;
});
};
// 테스트 작성 용이
describe('filterSnippets', () => {
test('should filter by search term', () => {
const result = filterSnippets(mockSnippets, 'react', 'all');
expect(result).toHaveLength(2);
});
});
```
---
## 📈 확장 로드맵
### Phase 1: 기본 기능 (완료)
- ✅ 카테고리별 스니펫 관리
- ✅ 검색 및 필터링
- ✅ 모달 기반 상세 보기
- ✅ 자동 ID 생성
### Phase 2: 향상된 기능
- 🔄 즐겨찾기 시스템
- 🔄 개인 스니펫 추가/편집
- 🔄 다크 모드 지원
- 🔄 키보드 단축키
### Phase 3: 고급 기능
- 📋 백엔드 API 연동
- 📋 사용자 인증
- 📋 스니펫 공유 기능
- 📋 버전 관리
### Phase 4: 엔터프라이즈
- 📋 팀 협업 기능
- 📋 권한 관리
- 📋 API 문서 생성
- 📋 분석 대시보드
---
## 🏆 결론
이 설계 패턴은 다음과 같은 혜택을 제공합니다:
### 개발자 경험
- **빠른 개발**: 명확한 구조로 개발 속도 향상
- **쉬운 유지보수**: 모듈화로 버그 수정 간소화
- **확장성**: 새 기능 추가 시 기존 코드 영향 최소화
### 사용자 경험
- **빠른 로딩**: 코드 분할로 초기 로딩 최적화
- **직관적 UI**: 일관된 패턴으로 학습 비용 감소
- **안정성**: 포괄적 에러 처리로 안정적 동작
### 확장성
- **수평 확장**: 새 카테고리/기능 쉽게 추가
- **수직 확장**: 고급 기능으로 점진적 업그레이드
- **플랫폼 확장**: 웹, 모바일, 데스크톱 대응 가능
이러한 설계 패턴을 따르면 유지보수가 쉽고 확장 가능한 코드 스니펫 관리 애플리케이션을 구축할 수 있습니다.
반응형