# Frontend 프로젝트 가이드 Vite + React + TypeScript 기반 프론트엔드 프로젝트 개발 가이드입니다. --- ## 목차 1. [개발 규칙](#1-개발-규칙) 2. [개발 환경 및 옵션 리스팅](#2-개발-환경-및-옵션-리스팅) 3. [설치 및 동작 방법](#3-설치-및-동작-방법) 4. [아키텍처 & 책임 분리 규칙](#4-아키텍처--책임-분리-규칙) 5. [네이밍 & 패키지 규칙](#5-네이밍--패키지-규칙) 6. [예외 처리 & 에러 응답 규칙](#6-예외-처리--에러-응답-규칙) 7. [로그 & 감사(Audit) 규칙](#7-로그--감사audit-규칙) 8. [설정 관리 규칙](#8-설정-관리-규칙) 9. [보안 관련 추가 규칙](#9-보안-관련-추가-규칙) 10. [테스트 & 검증 규칙](#10-테스트--검증-규칙) 11. [금지 패턴 / 안티 패턴 목록](#11-금지-패턴--안티-패턴-목록) 12. [성능 최적화 가이드](#12-성능-최적화-가이드) 13. [의존성 관리](#13-의존성-관리) 14. [트러블슈팅 가이드](#14-트러블슈팅-가이드) --- ## 1. 개발 규칙 ### 1.1 시큐어 코딩 규칙 준수 - **OWASP Top 10 기반 보안 규칙 준수 필수** - XSS 방지: `dangerouslySetInnerHTML` 금지, 필요 시 DOMPurify 사용 - 인증 정보 저장 금지: `localStorage`/`sessionStorage`에 토큰 저장 금지 - URL 인코딩: `encodeURIComponent` 사용 필수 - `eval` / `new Function` 사용 금지 - 환경 변수에 비밀키 저장 금지 **상세 규칙은 `base_arcitectures_md/SECURE_RULE.md` 참조** ### 1.2 공통 소스 기능 및 활용 방법 #### 공통 API (`common/api/`) - **`http.ts`**: Axios 인스턴스 - `baseURL`, `timeout`, `withCredentials` 설정 - 전역 헤더 설정 - **`endpoints.ts`**: API 엔드포인트 상수 ```typescript import { API } from "@/common/api/endpoints"; const response = await http.get(API.AUTH.ME); ``` - **`interceptors.ts`**: 전역 인터셉터 - 요청: 전역 로딩 시작 - 응답: 전역 로딩 종료, 401/403 처리 #### 공통 인증 (`common/auth/`) - **`AuthContext`**: 인증 상태 Context - **`AuthProvider`**: 인증 상태 제공자 - **`useAuth`**: 인증 훅 ```typescript const { user, login, logout, refreshMe } = useAuth(); ``` - **`ProtectedRoute`**: 인증 필요 라우트 보호 ```typescript } /> ``` - **`authService`**: 인증 API 호출 - `login()`, `logout()`, `me()` #### 공통 컴포넌트 (`common/components/`) **디렉터리 구조:** ``` common/components/ ├── form/ # 폼 입력 컴포넌트 (Input, Select, Textarea, Checkbox, Radio) ├── action/ # 액션 컴포넌트 (Button) ├── display/ # 표시 컴포넌트 (Table) ├── system/ # 시스템 컴포넌트 (LoadingOverlay, LoadingProvider, Toast, CommonModal) └── index.ts # 통합 export ``` **공통 원칙:** - 모든 공통 컴포넌트는 `id`, `name`, `className` 전달 옵션 지원 - 스타일 관련 세부 구현은 CSS로 처리 가능한 영역은 최대한 CSS에 위임 - 컴포넌트는 범용성 위주로 설계하되, 과도한 추상화는 지양 - 동작이 필요한 부분은 props 옵션으로만 제어 **입력 / 액션 계열 컴포넌트:** - **`Button.tsx`**: 버튼 컴포넌트 ```typescript import { Button } from "@/common/components"; ``` - `disabled`: 비활성화 - `loading`: 로딩 상태 (중복 클릭 방지) - `size`: 버튼 크기 (`sm`, `md`, `lg`) - `variant`: 버튼 스타일 변형 - **`Input.tsx`**: 입력 컴포넌트 (검색 기능 포함) ```typescript import { Input } from "@/common/components"; // 기본 텍스트 입력 {} }} /> // 비밀번호 입력 // 숫자 입력 (숫자 이외 문자 자동 제거) ``` - 지원 타입: `text`, `password`, `number` - `format`: 이메일/전화번호 자동 포맷, 정규식 검증 - `search`: debounce, commitOnEnter, clearOnEscape 옵션 - **`Select.tsx`**: 선택 컴포넌트 ```typescript import { Select } from "@/common/components";