From 2bf711c7bb47509676c5cbf652f3559ab8999ac5 Mon Sep 17 00:00:00 2001 From: haewonwon Date: Thu, 18 Dec 2025 14:35:51 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Docs:=20=EB=A7=88=EC=9D=B4=EA=B7=B8?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98/=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81=20=EA=B0=80=EC=9D=B4=EB=93=9C=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/back-end/{back-end.md => .gitkeep} | 0 docs/fornt-end/REFACTORING-DETAILS.md | 339 +++++++++++++++++ docs/fornt-end/REFACTORING-MIGRATION.md | 484 ++++++++++++++++++++++++ docs/fornt-end/REFACTORING-TESTING.md | 367 ++++++++++++++++++ docs/fornt-end/REFACTORING.md | 181 +++++++++ docs/fornt-end/ROUTING.md | 256 +++++++++++++ docs/fornt-end/front-end.md | 0 7 files changed, 1627 insertions(+) rename docs/back-end/{back-end.md => .gitkeep} (100%) create mode 100644 docs/fornt-end/REFACTORING-DETAILS.md create mode 100644 docs/fornt-end/REFACTORING-MIGRATION.md create mode 100644 docs/fornt-end/REFACTORING-TESTING.md create mode 100644 docs/fornt-end/REFACTORING.md create mode 100644 docs/fornt-end/ROUTING.md delete mode 100644 docs/fornt-end/front-end.md diff --git a/docs/back-end/back-end.md b/docs/back-end/.gitkeep similarity index 100% rename from docs/back-end/back-end.md rename to docs/back-end/.gitkeep diff --git a/docs/fornt-end/REFACTORING-DETAILS.md b/docs/fornt-end/REFACTORING-DETAILS.md new file mode 100644 index 00000000..694f7d7c --- /dev/null +++ b/docs/fornt-end/REFACTORING-DETAILS.md @@ -0,0 +1,339 @@ +# 리팩토링 상세 - 중간/낮은 우선순위 + +이 문서는 [메인 리팩토링 문서](./REFACTORING.md)의 중간 및 낮은 우선순위 항목들의 상세 내용을 담고 있습니다. + +## 🟡 중간 우선순위 + +### 4. 긴 컴포넌트 분리 + +**문제점:** + +- `BoardList.tsx` (236줄), `BoardDetail.tsx` (423줄) 등 컴포넌트가 과도하게 길음 +- 단일 책임 원칙 위반 + +**리팩토링 방안:** + +- 컴포넌트를 더 작은 단위로 분리 +- Custom Hook으로 로직 분리 +- Presentational/Container 패턴 적용 + +**예상 효과:** + +- 코드 가독성 향상 +- 재사용성 증가 +- 테스트 용이성 향상 + +--- + +### 5. 하드코딩된 값들 상수화 + +**문제점:** + +- 권한 체크 로직에 하드코딩된 문자열 배열 +- 메뉴 ID 매핑이 하드코딩됨 +- 매직 넘버 사용 + +**현재 코드:** + +```typescript +// BoardList.tsx +if (['sponsor', 'usage', 'notice', 'executive'].includes(url) && isAuthorizedOverSecretary) { + return true; +} + +// BoardDetail.tsx +switch (pathName1) { + case 'introduce': + menuId = 1; + break; + case 'activity': + menuId = 2; + // ... +} +``` + +**리팩토링 방안:** + +- 상수 파일 생성: `src/constants/boardTypes.ts`, `src/constants/menuIds.ts` +- Enum 또는 const 객체로 관리 +- 타입 안정성 확보 + +**예상 효과:** + +- 유지보수성 향상 +- 오타 방지 +- 타입 안정성 개선 + +--- + +### 6. 환경변수 관리 개선 + +**문제점:** + +- `.env` 파일 하나로 개발/프로덕션 구분이 안 됨 +- 환경변수 타입 체크 없음 + +**리팩토링 방안:** + +- `.env.development`, `.env.production` 분리 +- 환경변수 타입 정의 및 검증 함수 생성 +- `src/config/env.ts` 생성 + +**예상 효과:** + +- 환경별 설정 명확화 +- 설정 오류 조기 발견 +- 개발 환경 개선 + +--- + +## 🟢 낮은 우선순위 + +### 7. 주석 처리된 코드 제거 + +**문제점:** + +- `useFetch.tsx`에 주석 처리된 `console.log` 다수 +- 사용하지 않는 코드 존재 + +**리팩토링 방안:** + +- 주석 처리된 코드 제거 +- 필요시 로깅 라이브러리 도입 (예: `winston`, `pino`) + +--- + +### 8. Modal 컴포넌트 리팩토링 + +**문제점:** + +- `Modal.tsx`에서 조건부 렌더링이 복잡함 +- 타입별 모달 컴포넌트 매핑이 하드코딩됨 + +**현재 코드:** + +```typescript +{(modalType.type === "major" && ) || + (modalType.type === "changeName" && ) || + // ... 많은 조건들 +} +``` + +**리팩토링 방안:** + +- 모달 타입별 컴포넌트 매핑 객체 생성 +- Factory 패턴 적용 + +--- + +### 9. API 호출 패턴 통일 + +**문제점:** + +- 일부 컴포넌트에서 `useFetch` 사용 방식이 일관되지 않음 +- 토큰 필요 여부 판단 로직이 분산됨 + +**리팩토링 방안:** + +- API 호출 래퍼 함수 생성 +- 토큰 필요 여부를 URL 기반으로 자동 판단 + +--- + +### 10. 폴더 구조 개선 + +**문제점:** + +1. **Components 폴더 구조의 혼란** + + - `Common/`, `Component/`, `Container/`, `Page/`로 나뉘어 있지만 구분 기준이 모호함 + - `Component/`와 `Page/`의 차이가 명확하지 않음 + - `Container/`는 Presentational/Container 패턴을 따르지만 일관성이 없음 + +2. **도메인별 파일 분산** + + - `Page/IBAS/`와 `Component/IBAS/`가 분리되어 있음 + - 같은 도메인(IBAS)의 관련 파일들이 여러 곳에 흩어져 있음 + - 도메인별 응집도가 낮음 + +3. **타입 파일 구조 불일치** + + - `Types/IBAS/` 하위에 일부 타입이 있고, 루트에도 타입이 있음 + - 일관성 부족 + +4. **유틸리티 파일 명명** + + - `Functions/`라는 이름이 모호함 (함수만 있는 게 아님) + - `utils/` 또는 `helpers/`가 더 명확할 수 있음 + +5. **스타일 컴포넌트 위치** + - `styles/assets/`에 컴포넌트들이 있는데, 스타일인지 컴포넌트인지 모호함 + +**현재 구조:** + +``` +src/ +├── Components/ +│ ├── Common/ # 공통 컴포넌트 +│ ├── Component/ # ??? (Page와의 차이 불명확) +│ ├── Container/ # Container 컴포넌트 (일부만) +│ └── Page/ # 페이지 컴포넌트 +├── Functions/ # 유틸리티 함수들 +├── Types/ # 타입 정의 (일부는 IBAS/ 하위) +└── styles/ + └── assets/ # 스타일 컴포넌트들 +``` + +**리팩토링 방안:** + +#### 옵션 1: Feature-based 구조 (권장) + +도메인/기능별로 파일을 그룹화: + +``` +src/ +├── features/ # 기능별 모듈 +│ ├── board/ +│ │ ├── components/ # Board 관련 컴포넌트 +│ │ ├── pages/ # Board 페이지 +│ │ ├── hooks/ # Board 관련 hooks +│ │ ├── types/ # Board 타입 +│ │ └── utils/ # Board 유틸리티 +│ ├── ibas/ +│ │ ├── components/ +│ │ ├── pages/ +│ │ ├── hooks/ +│ │ ├── types/ +│ │ └── utils/ +│ ├── lecture/ +│ └── auth/ +├── shared/ # 공통 모듈 +│ ├── components/ # 공통 컴포넌트 +│ ├── hooks/ # 공통 hooks +│ ├── utils/ # 공통 유틸리티 +│ ├── types/ # 공통 타입 +│ └── styles/ # 공통 스타일 +├── layouts/ # 레이아웃 +└── routes/ # 라우팅 +``` + +**장점:** + +- 도메인별 응집도 향상 +- 기능 추가/수정 시 관련 파일을 한 곳에서 찾을 수 있음 +- 코드 탐색이 쉬움 + +**단점:** + +- 마이그레이션 비용이 큼 +- 기존 구조와 완전히 다름 + +#### 옵션 2: 개선된 계층 구조 (점진적 마이그레이션) + +현재 구조를 유지하면서 개선: + +``` +src/ +├── components/ # 모든 컴포넌트 +│ ├── ui/ # 재사용 가능한 UI 컴포넌트 +│ │ ├── Button/ +│ │ ├── Input/ +│ │ └── Modal/ +│ ├── features/ # 기능별 컴포넌트 +│ │ ├── board/ +│ │ ├── ibas/ +│ │ └── lecture/ +│ └── layouts/ # 레이아웃 컴포넌트 +├── pages/ # 페이지 컴포넌트 +│ ├── board/ +│ ├── ibas/ +│ └── lecture/ +├── hooks/ # 모든 hooks +├── utils/ # Functions → utils로 변경 +├── types/ # 모든 타입 (도메인별 폴더) +│ ├── board.ts +│ ├── ibas/ +│ └── common.ts +└── styles/ # 스타일 + ├── components/ # 스타일 컴포넌트 + ├── theme.ts + └── global.ts +``` + +**장점:** + +- 현재 구조와 유사하여 마이그레이션 비용이 낮음 +- 점진적으로 개선 가능 +- 명확한 구분 + +**단점:** + +- 여전히 계층 구조 (도메인별 응집도는 낮음) + +#### 옵션 3: 하이브리드 구조 (실용적) + +중요한 부분만 개선: + +``` +src/ +├── components/ +│ ├── ui/ # 공통 UI 컴포넌트 +│ ├── features/ # 기능별 컴포넌트 +│ └── layouts/ # 레이아웃 +├── pages/ # 페이지만 분리 +├── hooks/ # hooks 통합 +├── utils/ # Functions → utils +├── types/ # 타입 통합 +└── styles/ # 스타일 +``` + +**리팩토링 전략:** + +1. **1단계: 명명 개선** + + - `Functions/` → `utils/` + - `styles/assets/` → `styles/components/` + +2. **2단계: 컴포넌트 통합** + + - `Component/`, `Container/`, `Page/`의 구분 명확화 + - 또는 `components/` 하나로 통합 + +3. **3단계: 도메인별 그룹화** + + - 같은 도메인의 파일들을 가까이 배치 + - 예: `components/board/`, `pages/board/`, `types/board.ts` + +4. **4단계: Feature-based 구조로 전환** (선택사항) + - 큰 리팩토링 시점에 고려 + +**예상 소요 시간:** + +- 옵션 2 (개선된 계층 구조): 2-3주 +- 옵션 1 (Feature-based): 4-6주 + +**권장 사항:** + +- **옵션 2 (개선된 계층 구조)**를 권장 +- 현재 구조와 유사하여 마이그레이션 비용이 낮음 +- 점진적으로 개선 가능 +- 팀의 학습 곡선이 낮음 + +--- + +### 11. 스타일 컴포넌트 중복 제거 + +**문제점:** + +- 유사한 스타일 컴포넌트가 여러 파일에 중복 정의됨 +- 예: `HorizonScrollDiv`가 여러 파일에 존재 + +**리팩토링 방안:** + +- 공통 스타일 컴포넌트를 `src/styles/components/`로 이동 +- 재사용 가능한 스타일 컴포넌트 라이브러리화 + +--- + +[← 메인 리팩토링 문서로 돌아가기](./REFACTORING.md) + diff --git a/docs/fornt-end/REFACTORING-MIGRATION.md b/docs/fornt-end/REFACTORING-MIGRATION.md new file mode 100644 index 00000000..04adf049 --- /dev/null +++ b/docs/fornt-end/REFACTORING-MIGRATION.md @@ -0,0 +1,484 @@ +# 장기 마이그레이션 계획 + +이 문서는 [메인 리팩토링 문서](./REFACTORING.md)의 장기 마이그레이션 계획을 담고 있습니다. + +## 개요 + +이 문서는 현재 사용 중인 기술 스택(CRA, Recoil, styled-components)을 최신 기술로 마이그레이션하는 계획을 다룹니다. + +> ⚠️ **주의**: 이 마이그레이션들은 **선택사항**이며, 현재 기술 스택이 정상 작동 중이므로 급하게 진행할 필요는 없습니다. + +--- + +## 10. npm → pnpm 마이그레이션 + +**현재 상황:** + +- **npm** 사용 중 (`package-lock.json` 존재) +- `package.json`에 `npm`이 dependencies에 포함되어 있음 (의도치 않은 것 같음) + +**pnpm의 장점:** + +- 🚀 **빠른 설치 속도**: npm/yarn보다 2-3배 빠름 +- 💾 **디스크 공간 절약**: 하드 링크를 사용하여 중복 패키지 저장 방지 +- 🔒 **엄격한 의존성 관리**: phantom dependencies 방지 +- 📦 **작은 node_modules**: 심볼릭 링크로 효율적인 저장 +- ✅ **npm/yarn과 호환**: 대부분의 npm 스크립트 그대로 사용 가능 + +**마이그레이션 난이도:** **매우 낮음** (거의 즉시 가능) + +**장점:** + +- 설치 속도 향상 +- 디스크 공간 절약 +- 더 엄격한 의존성 관리 +- npm과 거의 동일한 사용법 + +**단점:** + +- 팀원들이 pnpm을 설치해야 함 +- CI/CD 파이프라인 수정 필요 +- 일부 레거시 도구와 호환성 문제 가능 (거의 없음) + +**마이그레이션 단계:** + +#### 1단계: pnpm 설치 + +```bash +# npm으로 전역 설치 +npm install -g pnpm + +# 또는 Homebrew (macOS) +brew install pnpm + +# 또는 curl +curl -fsSL https://get.pnpm.io/install.sh | sh - +``` + +#### 2단계: 기존 lock 파일 제거 및 pnpm 설치 + +```bash +# 기존 lock 파일 제거 +rm package-lock.json # 또는 yarn.lock + +# pnpm으로 의존성 설치 +pnpm install +``` + +#### 3단계: `.npmrc` 설정 (선택사항) + +**`.npmrc` 파일 생성:** + +``` +# 엄격한 peer dependencies 검사 비활성화 (필요시) +strict-peer-dependencies=false + +# 또는 활성화 (권장) +strict-peer-dependencies=true +``` + +#### 4단계: `.gitignore` 확인 + +**`.gitignore`에 추가 (없는 경우):** + +``` +# pnpm +pnpm-lock.yaml +.pnpm-store/ +``` + +#### 5단계: CI/CD 파이프라인 수정 + +**GitHub Actions 예시:** + +```yaml +# 기존 (npm) +- uses: actions/setup-node@v2 + with: + node-version: '18' +- run: npm ci +- run: npm run build + +# 변경 (pnpm) +- uses: pnpm/action-setup@v2 + with: + version: 8 +- uses: actions/setup-node@v2 + with: + node-version: '18' + cache: 'pnpm' +- run: pnpm install --frozen-lockfile +- run: pnpm run build +``` + +**주의사항:** + +1. **`package.json`에서 `npm` 의존성 제거**: `"npm": "^10.0.0"` 제거 (의도치 않은 것 같음) +2. **스크립트는 그대로 사용 가능**: `npm start` → `pnpm start` (동일) +3. **`pnpm-lock.yaml` 커밋**: `package-lock.json` 대신 `pnpm-lock.yaml` 커밋 +4. **팀원 공지**: 모든 팀원이 pnpm 설치 필요 + +**예상 소요 시간:** **1일 이내** (매우 빠름) + +**마이그레이션 체크리스트:** + +- [ ] pnpm 설치 +- [ ] `package-lock.json` 제거 +- [ ] `pnpm install` 실행 +- [ ] `.gitignore`에 `pnpm-lock.yaml` 확인 (일반적으로 커밋함) +- [ ] `package.json`에서 불필요한 `npm` 의존성 제거 +- [ ] CI/CD 파이프라인 수정 +- [ ] 팀원들에게 pnpm 설치 안내 +- [ ] 빌드 및 테스트 확인 + +**권장 사항:** + +- **매우 쉬운 마이그레이션**이므로 **우선순위 높게 고려** 권장 +- npm과 거의 동일하게 사용 가능하여 리스크가 낮음 +- 개발 경험 향상 (빠른 설치, 디스크 공간 절약) +- **CRA → Vite 마이그레이션과 함께 진행**하면 좋음 + +**참고 자료:** + +- [pnpm 공식 문서](https://pnpm.io/) +- [pnpm vs npm vs yarn 비교](https://pnpm.io/feature-comparison) +- [pnpm GitHub Actions](https://github.com/pnpm/action-setup) + +--- + +## 11. CRA → Vite 마이그레이션 + +**현재 상황:** + +- **Create React App (CRA)** 기반 프로젝트 +- `react-scripts: 5.0.1` 사용 +- `package.json`에 `react-scripts start`, `react-scripts build` 스크립트 사용 + +**문제점:** + +- CRA는 더 이상 활발히 유지보수되지 않음 +- 빌드 속도가 느림 (Webpack 기반) +- 개발 서버 시작이 느림 +- 번들 크기가 큼 +- 커스터마이징이 어려움 (eject 필요) + +**Vite의 장점:** + +- ⚡ **매우 빠른 개발 서버**: HMR(Hot Module Replacement)이 즉시 반영 +- 🚀 **빠른 빌드**: esbuild 기반으로 빌드 속도가 CRA보다 10-100배 빠름 +- 📦 **작은 번들 크기**: Tree-shaking이 더 효율적 +- 🔧 **쉬운 설정**: 설정 파일이 간단하고 명확함 +- 🎯 **최신 표준**: ES modules, 최신 JavaScript 기능 지원 + +**마이그레이션 난이도:** **중간** + +**장점:** + +- 개발 경험(DX)이 크게 향상됨 +- 빌드 시간 단축 +- 최신 도구 사용 가능 +- 커뮤니티 활성도 높음 + +**단점:** + +- 일부 CRA 전용 설정을 수동으로 마이그레이션해야 함 +- 환경변수 처리 방식이 다름 (`REACT_APP_` → `VITE_`) +- 일부 플러그인/설정이 다를 수 있음 + +**마이그레이션 단계:** + +#### 1단계: Vite 설치 및 기본 설정 + +```bash +# Vite 및 플러그인 설치 +npm install -D vite @vitejs/plugin-react + +# 기존 react-scripts 제거 +npm uninstall react-scripts +``` + +#### 2단계: 설정 파일 생성 + +**`vite.config.ts` 생성:** + +```typescript +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + }, + }, + server: { + port: 3000, + open: true, + }, + build: { + outDir: 'build', + }, +}); +``` + +#### 3단계: `index.html` 수정 + +**`public/index.html` → `index.html` (루트로 이동):** + +```html + + + + + + IBAS + + +
+ + + +``` + +#### 4단계: 환경변수 변경 + +**`.env` 파일 수정:** + +```bash +# CRA 방식 (기존) +REACT_APP_API_URL=https://www.inhabas.com/api + +# Vite 방식 (변경) +VITE_API_URL=https://www.inhabas.com/api +``` + +**코드에서 사용:** + +```typescript +// CRA 방식 (기존) +process.env.REACT_APP_API_URL; + +// Vite 방식 (변경) +import.meta.env.VITE_API_URL; +``` + +#### 5단계: `package.json` 스크립트 수정 + +```json +{ + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "test": "vitest" // 또는 기존 jest 유지 + } +} +``` + +#### 6단계: 타입 정의 추가 + +**`src/vite-env.d.ts` 생성:** + +```typescript +/// + +interface ImportMetaEnv { + readonly VITE_API_URL: string; + readonly VITE_BASE_URL: string; + // ... 기타 환경변수 +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} +``` + +**주의사항:** + +1. **환경변수 접두사 변경**: `REACT_APP_` → `VITE_` +2. **환경변수 접근 방식**: `process.env` → `import.meta.env` +3. **public 폴더**: `public/` 폴더는 그대로 유지 (자동 처리) +4. **절대 경로**: `tsconfig.json`의 `paths` 설정 필요 +5. **SVG/이미지 import**: Vite는 기본적으로 지원하지만 설정 확인 필요 + +**예상 소요 시간:** 1-2주 + +**마이그레이션 체크리스트:** + +- [ ] Vite 설치 및 기본 설정 +- [ ] `vite.config.ts` 생성 +- [ ] `index.html` 루트로 이동 및 수정 +- [ ] 환경변수 접두사 변경 (`REACT_APP_` → `VITE_`) +- [ ] 환경변수 접근 방식 변경 (`process.env` → `import.meta.env`) +- [ ] `package.json` 스크립트 수정 +- [ ] 타입 정의 추가 (`vite-env.d.ts`) +- [ ] 절대 경로 설정 확인 +- [ ] 빌드 테스트 +- [ ] 배포 프로세스 확인 + +**권장 사항:** + +- **CRA → Vite 마이그레이션은 비교적 쉬움** (다른 마이그레이션보다) +- 개발 경험 향상이 크므로 **우선순위를 높게 고려**해볼 만함 +- 환경변수 변경만 주의하면 대부분 자동으로 작동 +- 단계적으로 진행 가능 (새 브랜치에서 테스트 후 병합) + +**참고 자료:** + +- [Vite 공식 문서](https://vitejs.dev/) +- [CRA to Vite Migration Guide](https://github.com/vitejs/vite/discussions/3048) +- [Vite React Plugin](https://github.com/vitejs/vite-plugin-react) + +--- + +## 12. Recoil → Zustand/Jotai 마이그레이션 + +**현재 상황:** + +- Recoil 사용: **436개 매치, 74개 파일** +- Recoil은 Meta에서 개발했지만, 최근에는 Zustand, Jotai, Redux Toolkit 등이 더 인기 + +**문제점:** + +- Recoil의 공식 지원이 약해지고 있음 +- 커뮤니티 활성도가 상대적으로 낮음 +- 번들 크기가 상대적으로 큼 + +**마이그레이션 옵션:** + +#### 옵션 1: Zustand (권장) + +- **장점:** + - 매우 가벼움 (~1KB) + - 간단한 API + - TypeScript 지원 우수 + - Recoil보다 학습 곡선이 낮음 +- **단점:** + - Recoil의 atom 개념과 다름 (Context 기반) +- **마이그레이션 난이도:** 중간 + +#### 옵션 2: Jotai + +- **장점:** + - Recoil과 유사한 atom 기반 API + - 마이그레이션이 상대적으로 쉬움 + - 가벼움 +- **단점:** + - 커뮤니티가 Zustand보다 작음 +- **마이그레이션 난이도:** 낮음 (Recoil과 유사) + +#### 옵션 3: React Context + useReducer + +- **장점:** + - 외부 라이브러리 불필요 + - React 내장 기능만 사용 +- **단점:** + - 성능 최적화가 필요할 수 있음 + - 복잡한 상태 관리에 부적합 +- **마이그레이션 난이도:** 높음 + +**마이그레이션 전략:** + +1. **점진적 마이그레이션**: 한 번에 모든 것을 바꾸지 않고, 새 기능부터 새 라이브러리 사용 +2. **병행 운영**: Recoil과 새 라이브러리를 동시에 사용하며 점진적으로 전환 +3. **마이그레이션 도구**: 자동 변환 스크립트 작성 (가능한 경우) + +**예상 소요 시간:** 4-6주 (전체 마이그레이션) + +**권장 사항:** + +- **지금 당장 마이그레이션할 필요는 없음** +- Recoil이 여전히 작동하고 있으므로, 새로운 프로젝트나 큰 리팩토링 시점에 고려 +- 팀의 학습 곡선과 프로젝트 일정을 고려하여 결정 + +--- + +## 13. styled-components → Tailwind CSS / CSS Modules 마이그레이션 + +**현재 상황:** + +- styled-components 사용: **75개 매치, 44개 파일** +- styled-components는 여전히 사용되지만, Tailwind CSS가 최근 트렌드 + +**문제점:** + +- 런타임 오버헤드 (CSS-in-JS) +- 번들 크기가 큼 +- SSR 시 성능 이슈 가능성 +- 최근 React Server Components와의 호환성 문제 + +**마이그레이션 옵션:** + +#### 옵션 1: Tailwind CSS (권장) + +- **장점:** + - 매우 빠른 개발 속도 + - 작은 번들 크기 (사용한 클래스만 포함) + - 유틸리티 퍼스트 접근 + - 커뮤니티 활성도 높음 +- **단점:** + - HTML 클래스명이 길어질 수 있음 + - 학습 곡선 (유틸리티 클래스 학습 필요) +- **마이그레이션 난이도:** 중간-높음 + +#### 옵션 2: CSS Modules + +- **장점:** + - 순수 CSS 사용 + - 스코프 격리 자동 + - 런타임 오버헤드 없음 +- **단점:** + - 동적 스타일링이 제한적 + - 테마 관리가 복잡할 수 있음 +- **마이그레이션 난이도:** 중간 + +#### 옵션 3: Emotion (styled-components 대체) + +- **장점:** + - styled-components와 유사한 API + - 더 작은 번들 크기 + - 더 나은 성능 +- **단점:** + - 여전히 CSS-in-JS (런타임 오버헤드) +- **마이그레이션 난이도:** 낮음 (API가 유사) + +**마이그레이션 전략:** + +1. **하이브리드 접근**: 새 컴포넌트는 Tailwind로, 기존은 유지 +2. **점진적 전환**: 컴포넌트별로 하나씩 마이그레이션 +3. **코드 변환 도구**: styled-components → Tailwind 변환 스크립트 활용 + +**예상 소요 시간:** 6-8주 (전체 마이그레이션) + +**권장 사항:** + +- **styled-components가 여전히 잘 작동하므로 급하게 마이그레이션할 필요는 없음** +- 새 프로젝트나 대규모 리팩토링 시점에 고려 +- 팀의 선호도와 프로젝트 특성에 따라 결정 +- 성능 문제가 실제로 발생하는지 먼저 측정 + +--- + +## 마이그레이션 우선순위 결정 기준 + +**마이그레이션을 고려해야 하는 경우:** + +- ✅ 실제 성능 문제가 발생하고 있음 +- ✅ 유지보수가 어려워지고 있음 +- ✅ 새로운 기능 추가가 기술 부채로 인해 어려움 +- ✅ 팀이 새로운 기술 스택을 학습할 여유가 있음 +- ✅ 큰 리팩토링을 계획 중임 + +**마이그레이션을 보류해야 하는 경우:** + +- ❌ 단순히 "최신 기술"이라는 이유만으로 +- ❌ 프로젝트가 안정적으로 작동 중 +- ❌ 팀의 학습 여유가 없음 +- ❌ 다른 우선순위 높은 작업이 많음 +- ❌ 마이그레이션 리스크가 높음 + +--- + +[← 메인 리팩토링 문서로 돌아가기](./REFACTORING.md) diff --git a/docs/fornt-end/REFACTORING-TESTING.md b/docs/fornt-end/REFACTORING-TESTING.md new file mode 100644 index 00000000..4ccfd5db --- /dev/null +++ b/docs/fornt-end/REFACTORING-TESTING.md @@ -0,0 +1,367 @@ +# 테스트 전략 + +이 문서는 [메인 리팩토링 문서](./REFACTORING.md)의 테스트 작성 전략을 담고 있습니다. + +## 현재 상황 + +- ✅ 테스트 라이브러리 설치됨: `@testing-library/react`, `@testing-library/jest-dom` +- ✅ `setupTests.ts` 파일 존재 +- ❌ 실제 테스트 파일 없음 (0개) +- ✅ `package.json`에 test 스크립트 존재 + +## 테스트 작성 우선순위 + +### 🔴 1순위: 유틸리티 함수 테스트 (Unit Test) + +**대상:** + +- `src/Functions/dateFunction.tsx` +- `src/Functions/convertLabelFunctions.tsx` +- `src/utils/boardUrlMapper.ts` (리팩토링 후 생성 예정) + +**이유:** + +- 순수 함수라서 테스트가 쉬움 +- 의존성이 없어서 Mock 불필요 +- 비즈니스 로직의 핵심 +- 버그 발생 시 영향도가 큼 + +**예시:** + +```typescript +// src/Functions/__tests__/dateFunction.test.ts +import { DateFunction } from '../dateFunction'; + +describe('DateFunction', () => { + const { formatDateDay, formatDateMinute, formatDateT } = DateFunction(); + + describe('formatDateDay', () => { + it('날짜를 YYYY-MM-DD 형식으로 변환해야 함', () => { + const result = formatDateDay({ date: '2024-12-19T10:30:00' }); + expect(result).toBe('2024-12-19'); + }); + }); +}); +``` + +**예상 소요 시간:** 1주 + +--- + +### 🟡 2순위: Custom Hook 테스트 + +**대상:** + +- `src/Hooks/useFetch.tsx` + +**이유:** + +- 여러 컴포넌트에서 사용되는 핵심 Hook +- 복잡한 로직 (토큰 갱신, 에러 처리 등) +- 버그 발생 시 전체 앱에 영향 + +**주의사항:** + +- Recoil, React Router 의존성 Mock 필요 +- `@testing-library/react-hooks` 또는 `renderHook` 사용 + +**예시:** + +```typescript +// src/Hooks/__tests__/useFetch.test.tsx +import { renderHook, waitFor } from '@testing-library/react'; +import { RecoilRoot } from 'recoil'; +import useFetch from '../useFetch'; + +describe('useFetch', () => { + it('GET 요청이 성공하면 데이터를 반환해야 함', async () => { + // Mock fetch + global.fetch = jest.fn(() => + Promise.resolve({ + ok: true, + json: () => Promise.resolve({ data: 'test' }), + }) + ); + + const { result } = renderHook(() => useFetch(), { + wrapper: RecoilRoot, + }); + + await waitFor(() => { + expect(result.current[0]).toEqual({ data: 'test' }); + }); + }); +}); +``` + +**예상 소요 시간:** 1-2주 + +--- + +### 🟢 3순위: 공통 컴포넌트 테스트 (Component Test) + +**대상:** + +- `src/Components/Common/Loading.tsx` +- `src/Components/Common/Button.tsx` (스타일 컴포넌트) +- `src/Components/Common/Modal/Modal.tsx` +- `src/Components/Common/Dropdown.tsx` + +**이유:** + +- 여러 곳에서 재사용되는 컴포넌트 +- 상대적으로 테스트가 쉬움 +- UI 버그 조기 발견 + +**주의사항:** + +- Recoil, React Router 의존성 Mock 필요 +- 사용자 인터랙션 테스트 (`@testing-library/user-event`) + +**예시:** + +```typescript +// src/Components/Common/__tests__/Loading.test.tsx +import { render, screen } from '@testing-library/react'; +import Loading from '../Loading'; + +describe('Loading', () => { + it('로딩 스피너를 렌더링해야 함', () => { + render(); + expect(screen.getByRole('status')).toBeInTheDocument(); + }); +}); +``` + +**예상 소요 시간:** 2주 + +--- + +### 🔵 4순위: 페이지 컴포넌트 테스트 (Integration Test) + +**대상:** + +- `src/Components/Page/Board/BoardList.tsx` +- `src/Components/Page/Member/Login.tsx` +- `src/Components/Page/IBAS/Main.tsx` + +**이유:** + +- 사용자 플로우의 핵심 +- 복잡한 로직과 상태 관리 +- 통합 테스트로 전체 동작 확인 + +**주의사항:** + +- 많은 의존성 Mock 필요 (API, Recoil, Router 등) +- 테스트 작성 비용이 높음 +- 핵심 기능 위주로 작성 + +**예상 소요 시간:** 3-4주 + +--- + +### ⚪ 5순위: E2E 테스트 (선택사항) + +**대상:** + +- 주요 사용자 플로우 (로그인, 게시글 작성 등) + +**도구:** + +- Playwright +- Cypress + +**이유:** + +- 실제 사용자 시나리오 테스트 +- 브라우저 환경에서의 동작 확인 + +**주의사항:** + +- 설정 및 유지보수 비용이 높음 +- CI/CD 파이프라인 구축 필요 +- 우선순위 낮음 (선택사항) + +**예상 소요 시간:** 2-3주 (설정 포함) + +--- + +## 테스트 작성 전략 + +### 1. 점진적 접근 + +**단계별 진행:** + +1. **1단계**: 유틸리티 함수 테스트 (1주) +2. **2단계**: Custom Hook 테스트 (1-2주) +3. **3단계**: 공통 컴포넌트 테스트 (2주) +4. **4단계**: 페이지 컴포넌트 테스트 (3-4주) + +**원칙:** + +- 한 번에 모든 것을 테스트하려고 하지 않기 +- 새로 작성하는 코드부터 테스트 추가 +- 리팩토링하는 부분에 테스트 추가 + +--- + +### 2. 테스트 커버리지 목표 + +**현실적인 목표:** + +- **1년 목표**: 60-70% 커버리지 +- **우선순위 높은 파일**: 80% 이상 +- **유틸리티 함수**: 90% 이상 + +**주의:** + +- 커버리지 100%를 목표로 하지 않기 +- 의미 있는 테스트에 집중 +- 유지보수 비용 고려 + +--- + +### 3. 테스트 파일 구조 + +``` +src/ +├── Functions/ +│ ├── __tests__/ +│ │ ├── dateFunction.test.ts +│ │ └── convertLabelFunctions.test.ts +│ └── dateFunction.tsx +├── Hooks/ +│ ├── __tests__/ +│ │ └── useFetch.test.tsx +│ └── useFetch.tsx +└── Components/ + └── Common/ + ├── __tests__/ + │ └── Loading.test.tsx + └── Loading.tsx +``` + +**또는:** + +``` +src/ +├── Functions/ +│ ├── dateFunction.tsx +│ └── dateFunction.test.ts # 같은 폴더에 배치 +``` + +**권장:** 같은 폴더에 배치 (`.test.ts` 파일) + +--- + +### 4. 테스트 작성 가이드라인 + +**AAA 패턴 사용:** + +```typescript +describe('함수명', () => { + it('해야 할 일', () => { + // Arrange (준비) + const input = 'test'; + + // Act (실행) + const result = functionToTest(input); + + // Assert (검증) + expect(result).toBe('expected'); + }); +}); +``` + +**테스트 네이밍:** + +- `describe`: 테스트할 함수/컴포넌트명 +- `it`: "해야 할 일"을 명확하게 작성 +- 예: `it('날짜를 YYYY-MM-DD 형식으로 변환해야 함')` + +**Mock 사용 원칙:** + +- 외부 의존성만 Mock +- 순수 함수는 Mock 하지 않기 +- Mock은 최소한으로 사용 + +--- + +### 5. CI/CD 통합 + +**GitHub Actions 예시:** + +```yaml +name: Test +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + - run: npm ci + - run: npm test -- --coverage +``` + +**권장:** + +- PR 생성 시 자동 테스트 실행 +- 커버리지 리포트 생성 +- 테스트 실패 시 PR 머지 차단 + +--- + +## 테스트 작성 체크리스트 + +**유틸리티 함수:** + +- [ ] 정상 케이스 테스트 +- [ ] 엣지 케이스 테스트 (null, undefined, 빈 문자열 등) +- [ ] 에러 케이스 테스트 + +**Custom Hook:** + +- [ ] 초기 상태 테스트 +- [ ] 상태 변경 테스트 +- [ ] 에러 처리 테스트 +- [ ] 사이드 이펙트 테스트 + +**컴포넌트:** + +- [ ] 렌더링 테스트 +- [ ] 사용자 인터랙션 테스트 +- [ ] Props 변경 테스트 +- [ ] 조건부 렌더링 테스트 + +--- + +## 예상 소요 시간 및 리소스 + +**전체 테스트 작성:** + +- **1순위 (유틸리티)**: 1주 +- **2순위 (Hook)**: 1-2주 +- **3순위 (컴포넌트)**: 2주 +- **4순위 (페이지)**: 3-4주 +- **총 예상 시간**: 7-9주 + +**권장 접근:** + +- 새 기능 개발 시 테스트 함께 작성 +- 리팩토링 시 기존 테스트 보완 +- 점진적으로 커버리지 확대 + +--- + +## 참고 자료 + +- [React Testing Library 공식 문서](https://testing-library.com/react) +- [Jest 공식 문서](https://jestjs.io/) +- [Testing Best Practices](https://kentcdodds.com/blog/common-mistakes-with-react-testing-library) + +--- + +[← 메인 리팩토링 문서로 돌아가기](./REFACTORING.md) + diff --git a/docs/fornt-end/REFACTORING.md b/docs/fornt-end/REFACTORING.md new file mode 100644 index 00000000..32a322dc --- /dev/null +++ b/docs/fornt-end/REFACTORING.md @@ -0,0 +1,181 @@ +# 리팩토링 체크리스트 + +이 문서는 inhabas.com-front 프로젝트의 리팩토링이 필요한 부분들을 정리한 문서입니다. + +> 📚 **관련 문서** +> +> - [중간/낮은 우선순위 상세](./REFACTORING-DETAILS.md) +> - [장기 마이그레이션 계획](./REFACTORING-MIGRATION.md) +> - [테스트 전략](./REFACTORING-TESTING.md) + +## 🔴 높은 우선순위 + +### 1. 중복된 URL 매핑 로직 추출 + +**문제점:** + +- `BoardList.tsx`, `BoardDetail.tsx`, `BoardCreate.tsx`, `BoardSearch.tsx`에서 동일한 URL 매핑 로직이 반복됨 +- 새로운 게시판 타입 추가 시 여러 파일을 수정해야 함 + +**현재 코드:** + +```typescript +// 여러 파일에서 반복됨 +let fetchUrl: string; +if (url === 'alpha') { + fetchUrl = '/project/alpha'; +} else if (url === 'beta') { + fetchUrl = '/project/beta'; +} else if (url === 'sponsor') { + fetchUrl = '/scholarship/sponsor'; +} else if (url === 'usage') { + fetchUrl = '/scholarship/usage'; +} else if (url === 'opensource') { + fetchUrl = '/board/storage'; +} else if (url === 'contest') { + fetchUrl = '/contest/contest'; +} else if (url === 'activity') { + fetchUrl = '/contest/activity'; +} else { + fetchUrl = `/board/${url}`; +} +``` + +**리팩토링 방안:** + +- `src/utils/boardUrlMapper.ts` 생성 +- URL 매핑을 상수 객체로 관리 +- 타입 안정성 확보 (enum 또는 union type 사용) + +**예상 효과:** + +- 코드 중복 제거 (4개 파일 → 1개 유틸) +- 유지보수성 향상 +- 타입 안정성 개선 + +--- + +### 2. useFetch Hook 타입 안정성 개선 + +**문제점:** + +- `any` 타입 과다 사용 +- 반환 타입이 명확하지 않음 +- 제네릭 미활용 + +**현재 코드:** + +```typescript +const useFetch = (): [ + any, // ❌ any 타입 + (url: string, method: string, token?: string, sendData?: any, media?: boolean) => Promise +] => { + const [data, setData] = useState(null); // ❌ any 타입 + // ... +}; +``` + +**리팩토링 방안:** + +- 제네릭 타입 도입: `useFetch()` +- API 응답 타입 정의 +- 에러 타입 정의 + +**예상 효과:** + +- 타입 안정성 향상 +- IDE 자동완성 개선 +- 런타임 에러 감소 + +--- + +### 3. 에러 처리 로직 개선 + +**문제점:** + +- `useFetch.tsx`에서 에러 처리 로직이 복잡하고 중복됨 +- HTTP 상태 코드별 처리가 분산되어 있음 +- 에러 메시지가 `alert`로만 표시됨 + +**현재 코드:** + +```typescript +// 401 처리 +if (errorResponse.status === 401) { + navigate(-1); +} +// 403 처리 +if (errorResponse.status === 403) { + if (url === '/signUp') { + navigate('/'); + } else { + navigate(-1); + } +} +// 404 처리 +if (errorResponse.status === 404) { + navigate('/notfound'); +} +``` + +**리팩토링 방안:** + +- 에러 핸들러 클래스/함수 분리 +- HTTP 상태 코드별 처리 전략 패턴 적용 +- Toast 알림 시스템 도입 (alert 대신) + +**예상 효과:** + +- 에러 처리 일관성 향상 +- 사용자 경험 개선 +- 코드 가독성 향상 + +--- + +## 📋 리팩토링 실행 계획 + +### Phase 1: 기반 작업 (1-2주) + +1. ✅ URL 매핑 로직 추출 +2. ✅ 타입 정의 강화 +3. ✅ 상수 파일 생성 + +### Phase 2: 핵심 개선 (2-3주) + +4. ✅ useFetch 타입 안정성 개선 +5. ✅ 에러 처리 로직 개선 +6. ✅ 환경변수 관리 개선 + +### Phase 3: 구조 개선 (2-3주) + +7. ✅ 긴 컴포넌트 분리 +8. ✅ Modal 컴포넌트 리팩토링 +9. ✅ 폴더 구조 개선 (1단계: 명명 개선) +10. ✅ 스타일 컴포넌트 정리 + +### Phase 4: 마무리 (1주) + +11. ✅ 주석 코드 제거 +12. ✅ 테스트 작성 (자세한 내용은 [테스트 전략](./REFACTORING-TESTING.md) 참고) +13. ✅ 문서 업데이트 + +--- + +## 🎯 리팩토링 원칙 + +1. **점진적 개선**: 한 번에 모든 것을 바꾸지 않고 단계적으로 진행 +2. **기능 유지**: 리팩토링 중에도 기존 기능이 정상 작동해야 함 +3. **테스트 우선**: 리팩토링 전후 동작이 동일한지 확인 +4. **타입 안정성**: `any` 타입을 최대한 제거하고 명확한 타입 정의 +5. **코드 리뷰**: 리팩토링도 PR을 통해 리뷰 받기 + +--- + +## 📝 참고사항 + +- 리팩토링은 기능 추가와 분리하여 진행하는 것이 좋습니다 +- 각 리팩토링은 작은 PR로 나누어 진행하는 것을 권장합니다 +- 리팩토링 전후의 동작을 비교할 수 있도록 테스트 코드를 작성하는 것이 좋습니다 +- 중간/낮은 우선순위 항목은 [REFACTORING-DETAILS.md](./REFACTORING-DETAILS.md) 참고 +- 장기 마이그레이션 계획은 [REFACTORING-MIGRATION.md](./REFACTORING-MIGRATION.md) 참고 +- 테스트 전략은 [REFACTORING-TESTING.md](./REFACTORING-TESTING.md) 참고 diff --git a/docs/fornt-end/ROUTING.md b/docs/fornt-end/ROUTING.md new file mode 100644 index 00000000..08cb3388 --- /dev/null +++ b/docs/fornt-end/ROUTING.md @@ -0,0 +1,256 @@ +# 라우팅 구조 문서 + +## 개요 + +이 문서는 inhabas.com-front 프로젝트의 라우팅 구조와 권한별 접근 제한을 설명합니다. + +## 권한 체계 + +### 사용자 역할 (User Roles) + +1. **회장** (`CHIEF`) - 최고 권한 +2. **부회장** (`VICE_CHIEF`) - 부회장 권한 +3. **운영팀** (`EXECUTIVES`) - 운영팀 권한 +4. **총무** (`SECRETARY`) - 총무 권한 +5. **활동회원** (`BASIC`) - 일반 활동회원 +6. **비활동회원** (`DEACTIVATED`) - 비활동 회원 (졸업생 포함) +7. **미승인 회원** (`NOT_APPROVED`) - 승인 대기 중 +8. **회원가입 중** (`SIGNING_UP`) - 소셜로그인 직후 + +### 권한 레벨 + +- `OverVice`: 회장, 부회장 +- `OverExecutives`: 회장, 부회장, 운영팀 +- `OverSecretary`: 회장, 부회장, 운영팀, 총무 +- `OverBasic`: 회장, 부회장, 운영팀, 총무, 활동회원 +- `OverDeactivate`: 모든 승인된 회원 (비활동회원 포함) + +## 라우팅 구조 + +### 1. 최상위 라우트 (App.tsx) + +#### 인증이 필요 없는 페이지 + +``` +/login # 로그인 페이지 +/login/process # 로그인 처리 페이지 +/signup # 회원가입 페이지 +/signup/question # 회원가입 질문 페이지 +/rule/:id # 규칙 페이지 +/notfound # 404 페이지 +``` + +#### 인증이 필요한 페이지 (HeaderNavLayout) + +``` +/* # 모든 인증된 페이지 +``` + +### 2. 메인 네비게이션 라우트 (HeaderNavLayout.tsx) + +``` +/ # 메인 페이지 +/introduce # 소개 페이지 +/honor # 명예 페이지 +/myInfo # 내 정보 페이지 +/scholarship # 장학금 페이지 +/* # 기타 모든 페이지 (HeaderTitleLayout으로 위임) +``` + +### 3. 제목 헤더 라우트 (HeaderTitleLayout.tsx) + +``` +/* # 메인 라우트 (MainRoute) +/board/* # 게시판 라우트 (BoardRoute) +/lecture/* # 강의 라우트 (LectureRoute) +``` + +#### 관리자 전용 라우트 + +``` +/staff/member # 회원 관리 (OverSecretary 권한 필요) +/staff/member/newStudents # 신입생 관리 +/staff/member/application/:id # 신청서 관리 +/staff/member/students # 재학생 관리 +/staff/member/graduateStudents # 졸업생 관리 +/staff/manage # 직원 관리 (OverVice 권한 필요) +``` + +### 4. 메인 라우트 (MainRoute.tsx) + +``` +/activity # 활동 목록 +/activity/detail # 활동 상세 +/activity/detail/:id # 특정 활동 상세 +/activity/create # 활동 생성 +/activity/update/:id # 활동 수정 +``` + +#### 은행 관련 라우트 (OverDeactivate 권한 필요) + +``` +/bank # 은행 관리 +/bank/support # 지원금 관리 +/bank/support/detail/:id # 지원금 상세 +/bank/support/create # 지원금 생성 +/bank/support/update/:id # 지원금 수정 +``` + +### 5. 게시판 라우트 (BoardRoute.tsx) + +#### 비활동회원 이상 접근 가능 + +``` +/board/opensource # 오픈소스 게시판 +/board/opensource/detail/:id # 오픈소스 상세 +/board/opensource/create # 오픈소스 작성 +/board/opensource/update/:id # 오픈소스 수정 + +/board/sponsor # 후원 게시판 +/board/sponsor/detail/:id # 후원 상세 +/board/sponsor/create # 후원 작성 +/board/sponsor/update/:id # 후원 수정 + +/board/usage # 이용안내 게시판 +/board/usage/detail/:id # 이용안내 상세 +/board/usage/create # 이용안내 작성 +/board/usage/update/:id # 이용안내 수정 + +/board/contest # 공모전 게시판 +/board/contest/detail/:id # 공모전 상세 +/board/contest/create # 공모전 작성 +/board/contest/update/:id # 공모전 수정 + +/board/activity # 활동 게시판 +/board/activity/detail/:id # 활동 상세 +/board/activity/create # 활동 작성 +/board/activity/update/:id # 활동 수정 +``` + +#### 활동회원 이상 접근 가능 + +``` +/board/alpha # 알파 게시판 +/board/alpha/detail/:id # 알파 상세 +/board/alpha/create # 알파 작성 +/board/alpha/update/:id # 알파 수정 + +/board/beta # 베타 게시판 +/board/beta/detail/:id # 베타 상세 +/board/beta/create # 베타 작성 +/board/beta/update/:id # 베타 수정 +``` + +#### 비활동회원 이상 접근 가능 (내부 게시판) + +``` +/board/notice # 공지사항 +/board/notice/detail/:id # 공지사항 상세 +/board/notice/create # 공지사항 작성 +/board/notice/update/:id # 공지사항 수정 + +/board/free # 자유게시판 +/board/free/detail/:id # 자유게시판 상세 +/board/free/create # 자유게시판 작성 +/board/free/update/:id # 자유게시판 수정 + +/board/question # 질문게시판 +/board/question/detail/:id # 질문게시판 상세 +/board/question/create # 질문게시판 작성 +/board/question/update/:id # 질문게시판 수정 + +/board/suggest # 건의게시판 +/board/suggest/detail/:id # 건의게시판 상세 +/board/suggest/create # 건의게시판 작성 +/board/suggest/update/:id # 건의게시판 수정 +``` + +#### 총무 이상 접근 가능 + +``` +/board/executive # 임원 게시판 +/board/executive/detail/:id # 임원 게시판 상세 +/board/executive/create # 임원 게시판 작성 +/board/executive/update/:id # 임원 게시판 수정 +``` + +### 6. 강의 라우트 (LectureRoute.tsx) + +``` +/lecture/ # 강의 목록 +/lecture/detail # 강의 상세 +/lecture/create # 강의 생성 +/lecture/room # 강의실 목록 +/lecture/room/announce # 강의실 공지 +/lecture/room/detail # 강의실 상세 +/lecture/room/create # 강의실 생성 +``` + +## 로그인 없이 접근 가능한 페이지 + +다음 페이지들은 로그인 없이도 접근할 수 있습니다: + +- `/board/opensource` +- `/board/sponsor` +- `/board/usage` +- `/board/contest` +- `/board/activity` +- `/activity` +- `/activity/detail` +- `/introduce` +- `/login` +- `/signup` +- `/signup/question` + +## 권한별 접근 가능한 기능 + +### 회장/부회장 (OverVice) + +- 모든 페이지 접근 가능 +- 직원 관리 (`/staff/manage`) + +### 운영팀 (OverExecutives) + +- 회장/부회장 권한 + 운영팀 전용 기능 + +### 총무 (OverSecretary) + +- 운영팀 권한 + 회원 관리 기능 +- 회원 관리 (`/staff/member/*`) +- 임원 게시판 관리 + +### 활동회원 (OverBasic) + +- 일반 회원 기능 +- 알파/베타 게시판 작성 권한 +- 은행 관련 기능 + +### 비활동회원 (OverDeactivate) + +- 읽기 전용 대부분 기능 +- 공개 게시판만 접근 가능 + +## 라우팅 파일 구조 + +``` +src/ +├── App.tsx # 최상위 라우팅 +├── Layout/ +│ ├── HeaderNavLayout.tsx # 네비게이션 헤더가 있는 레이아웃 +│ └── HeaderTitleLayout.tsx # 제목 헤더가 있는 레이아웃 +└── Routes/ + ├── MainRoute.tsx # 메인 라우트 + ├── BoardRoute.tsx # 게시판 라우트 + └── LectureRoute.tsx # 강의 라우트 +``` + +## 주의사항 + +1. **권한 검사**: 각 라우트는 `GetRoleAuthorization` 함수를 통해 권한을 검사합니다. +2. **로그인 상태**: `failRefreshing` 상태를 통해 로그인 여부를 확인합니다. +3. **자동 리다이렉트**: 권한이 없는 페이지 접근 시 이전 페이지로 자동 리다이렉트됩니다. +4. **동적 라우트**: `:id` 파라미터를 사용하는 동적 라우트들이 있습니다. + +## 업데이트 이력 + +- 2024-12-19: 초기 라우팅 문서 작성 diff --git a/docs/fornt-end/front-end.md b/docs/fornt-end/front-end.md deleted file mode 100644 index e69de29b..00000000 From bc19b27dd9d540b6510a70e159d3a45075e3410a Mon Sep 17 00:00:00 2001 From: haewonwon Date: Thu, 18 Dec 2025 14:51:38 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Add:=20legacy-peer-deps=20=EB=AA=85?= =?UTF-8?q?=EB=A0=B9=EC=96=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .npmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .npmrc diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..e9ee3cb4 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +legacy-peer-deps=true \ No newline at end of file From 51cb0cad56965c2b144719a1e14424f6ce28da0e Mon Sep 17 00:00:00 2001 From: haewonwon Date: Thu, 18 Dec 2025 15:10:52 +0900 Subject: [PATCH 3/4] chore: trigger vercel deployment From 3b11a6cc6cb59252e0661f07f78c3fb5248aa896 Mon Sep 17 00:00:00 2001 From: haewonwon Date: Thu, 18 Dec 2025 15:22:41 +0900 Subject: [PATCH 4/4] chore: trigger vercel deployment