{ "name": "Project Structure Rules", "description": "효율적인 프로젝트 구조화 및 파일 조직을 위한 규칙", "rules": { "directoryStructure": { "frontend": { "reactApp": { "root": [ "src/: 소스 코드", "public/: 정적 파일", "build/ or dist/: 빌드 출력물 (gitignore)", "node_modules/: 패키지 (gitignore)" ], "src": [ "assets/: 이미지, 아이콘, 폰트 등", "components/: 재사용 가능한 UI 컴포넌트", "hooks/: 커스텀 훅", "contexts/: React 컨텍스트", "pages/ or views/: 페이지 컴포넌트", "services/: API 호출, 외부 서비스 연결", "utils/: 유틸리티 함수", "types/: 타입 정의 (TypeScript)", "styles/: 전역 스타일 및 테마", "constants/: 상수 값" ], "components": [ "atomic design 패턴 또는 기능별 구조 사용", "각 컴포넌트는 폴더 내 index, component, styles, tests 파일로 구성", "공통 컴포넌트와 페이지 특정 컴포넌트 구분" ] }, "nextApp": { "root": [ "app/: 페이지 및 라우팅 (App Router)", "pages/: 페이지 및 라우팅 (Pages Router)", "public/: 정적 파일", "components/: 컴포넌트", ".next/: 빌드 출력물 (gitignore)" ], "appDirectory": [ "layout.tsx: 레이아웃 컴포넌트", "page.tsx: 페이지 컴포넌트", "[param]/: 동적 경로", "@namespace/: 병렬 라우트", "(group)/: 라우트 그룹" ], "separation": [ "클라이언트/서버 컴포넌트 구분", "서버 액션 및 API 라우트 명확히 구분", "metadata 활용" ] }, "vueApp": { "root": [ "src/: 소스 코드", "public/: 정적 파일", "dist/: 빌드 출력물 (gitignore)" ], "src": [ "assets/: 이미지, 폰트 등", "components/: 컴포넌트", "views/ or pages/: 페이지 컴포넌트", "router/: 라우트 정의", "store/: 상태 관리 (Pinia/Vuex)", "services/: API 및 외부 서비스", "utils/: 유틸리티 함수", "composables/: 조합형 함수 (Vue 3)" ] }, "angularApp": { "src": [ "app/: 애플리케이션 코드", "assets/: 이미지, 폰트 등", "environments/: 환경 설정" ], "app": [ "core/: 핵심 서비스, 가드, 인터셉터", "shared/: 공유 모듈, 컴포넌트, 디렉티브", "features/: 기능별 모듈", "layouts/: 레이아웃 컴포넌트" ], "features": [ "각 기능은 독립적인 Angular 모듈로 구현", "컴포넌트, 서비스, 모델 등 관련 파일 함께 보관", "기능별 라우팅 모듈 구현" ] } }, "backend": { "nodeExpress": { "root": [ "src/: 소스 코드", "dist/: 빌드 출력물 (TypeScript)", "tests/: 테스트 파일", "config/: 설정 파일" ], "src": [ "controllers/: 라우트 핸들러", "models/: 데이터 모델", "routes/: 라우트 정의", "middlewares/: 미들웨어", "services/: 비즈니스 로직", "utils/: 유틸리티 함수", "types/: 타입 정의 (TypeScript)" ] }, "nestjs": { "src": [ "modules/: 기능별 모듈", "shared/: 공유 모듈 및 서비스", "config/: 설정", "main.ts: 애플리케이션 진입점" ], "module": [ "controllers/: 컨트롤러", "services/: 서비스", "dto/: 데이터 전송 객체", "entities/: 엔티티 (데이터베이스 모델)", "repositories/: 커스텀 저장소" ] }, "django": { "root": [ "apps/: 앱 모듈", "config/: 프로젝트 설정", "static/: 정적 파일", "templates/: 템플릿 파일", "media/: 사용자 업로드 파일", "requirements/: 의존성 파일" ], "app": [ "models.py: 데이터 모델", "views.py: 뷰 함수/클래스", "urls.py: URL 패턴", "admin.py: 관리자 인터페이스", "serializers.py: API 직렬화" ] }, "springBoot": { "src": [ "main/java/com/company/app/: 자바 소스", "main/resources/: 설정 및 리소스", "test/: 테스트 코드" ], "javaStructure": [ "controllers/: 컨트롤러", "services/: 서비스", "repositories/: 저장소", "entities/ or models/: 데이터 모델", "dto/: 데이터 전송 객체", "config/: 설정 클래스", "exceptions/: 예외 처리", "utils/: 유틸리티 클래스" ] } }, "fullstack": { "monorepo": { "root": [ "packages/: 패키지 디렉토리", "apps/: 애플리케이션 디렉토리" ], "packages": [ "ui/: UI 컴포넌트 라이브러리", "config/: 공유 설정", "utils/: 공유 유틸리티", "types/: 공유 타입 정의", "api/: API 클라이언트 또는 서버" ], "tooling": [ "Lerna, Nx, Turborepo 등 모노레포 도구 활용", "공유 빌드 설정 및 스크립트", "워크스페이스 간 의존성 관리" ] }, "microservices": { "services": [ "각 마이크로서비스는 독립적인 프로젝트 구조 가짐", "서비스 간 중복 최소화를 위한 공유 라이브러리", "서비스 간 API 계약 정의 및 문서화" ], "infrastructure": [ "API 게이트웨이 설정", "서비스 디스커버리 구성", "배포 및 오케스트레이션 설정" ] } } }, "naming": { "files": { "general": [ "일관된 네이밍 컨벤션 사용 (kebab-case, camelCase 등)", "파일 내용을 명확히 설명하는 이름 사용", "축약어 사용 자제" ], "components": { "react": "PascalCase.tsx, 예: UserProfile.tsx", "vue": "PascalCase.vue, 예: UserProfile.vue", "angular": "kebab-case.component.ts, 예: user-profile.component.ts" }, "tests": { "pattern": "{파일명}.test.{확장자} or {파일명}.spec.{확장자}", "examples": "user-service.test.ts, UserProfile.spec.tsx" } }, "directories": { "general": [ "복수형 사용 (components/, utils/, services/)", "features나 모듈은 단수형 가능 (auth/, user/, product/)", "일관된 대소문자 사용 (kebab-case 또는 camelCase 권장)" ], "hierarchies": [ "논리적 계층 구조 활용", "너무 깊은 중첩 피하기 (최대 4-5단계)", "관련 코드를 함께 그룹화" ] } }, "modularization": { "principles": [ "단일 책임 원칙 (SRP) 준수", "관심사 분리 (Separation of Concerns)", "적절한 추상화 수준", "응집도 높고 결합도 낮게 설계" ], "techniques": { "frontend": [ "기능별 모듈화", "재사용 가능한 컴포넌트 설계", "페이지/라우트 기반 코드 분할" ], "backend": [ "도메인 주도 설계 (DDD) 원칙 적용", "수직 슬라이스 (Vertical Slice) 아키텍처 고려", "마이크로서비스 경계 명확히 정의" ] }, "dependencies": { "management": [ "명시적 의존성 선언", "의존성 주입 패턴 활용", "순환 의존성 방지" ], "optimization": [ "필요한 기능만 가져오는 트리 쉐이킹 가능한 구조", "불필요한 의존성 최소화", "최신 패키지 관리자 기능 활용 (pnpm, Yarn Berry 등)" ] } }, "configuration": { "principles": [ "환경별 설정 분리 (개발, 테스트, 프로덕션)", "민감 정보는 환경 변수로 관리", "기본값 제공 및 문서화" ], "structure": { "dotenv": ".env.{환경} 파일 활용", "configFiles": "환경별 설정 파일 구성 (예: config.dev.js, config.prod.js)", "validation": "설정 스키마 검증 (yup, joi, zod 등)" }, "management": [ "구성 요소를 기능별로 모듈화", "설정 값의 단일 진실 공급원 (SSOT) 유지", "변경 가능성에 따른 설정 분리" ] }, "codeOrganization": { "imports": { "order": [ "외부 라이브러리 임포트", "내부 모듈 임포트 (절대 경로)", "상대 경로 임포트", "스타일/자산 임포트" ], "aliasing": "절대 경로 임포트 활성화 (tsconfig.json, jsconfig.json)", "grouping": "관련 임포트 그룹화 및 알파벳 순 정렬" }, "codeBlocks": { "orderOfDeclarations": [ "타입/인터페이스 선언", "상수", "유틸리티 함수", "훅/상태 관리", "컴포넌트/클래스", "내보내기" ], "size": "파일 크기 제한 (일반적으로 300-500줄 미만 권장)" }, "documentationStrategy": [ "주요 모듈, 인터페이스, 함수에 JSDoc/TSDoc 주석 사용", "코드 구조 및 아키텍처 문서화 (README.md 파일)", "의도가 명확하지 않은 복잡한 로직에 인라인 주석 추가" ] } } }