diff --git a/DATABASE_SCHEMA.md b/DATABASE_SCHEMA.md
index 5d78e52..d452d1a 100644
--- a/DATABASE_SCHEMA.md
+++ b/DATABASE_SCHEMA.md
@@ -3,6 +3,10 @@
## 개요
작업보고서 시스템의 PostgreSQL 데이터베이스 스키마 정의
+**최종 업데이트:** 2025-10-25
+**데이터베이스 버전:** PostgreSQL 15
+**스키마 버전:** 1.4 (마이그레이션 009까지 적용)
+
---
## 테이블 구조
@@ -13,19 +17,22 @@
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 사용자 고유 ID |
-| username | VARCHAR | UNIQUE, NOT NULL, INDEX | 로그인 아이디 |
-| hashed_password | VARCHAR | NOT NULL | 암호화된 비밀번호 |
-| full_name | VARCHAR | NULL | 사용자 실명 |
-| role | ENUM | DEFAULT 'user' | 사용자 권한 (admin, user) |
+| username | VARCHAR(50) | UNIQUE, NOT NULL | 로그인 아이디 |
+| hashed_password | VARCHAR(255) | NOT NULL | 암호화된 비밀번호 (bcrypt) |
+| full_name | VARCHAR(100) | NULL | 사용자 실명 |
+| role | userrole | DEFAULT 'user' | 사용자 권한 |
| is_active | BOOLEAN | DEFAULT TRUE | 계정 활성화 상태 |
-| created_at | TIMESTAMP | DEFAULT NOW() | 계정 생성일시 |
+| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 계정 생성일시 |
**인덱스:**
-- `idx_users_username` ON username
-- `idx_users_role` ON role
+- `users_pkey` PRIMARY KEY (id)
+- `users_username_key` UNIQUE (username)
-**ENUM 값:**
-- role: 'admin', 'user'
+**참조되는 테이블:**
+- daily_works.created_by_id
+- issues.reporter_id
+- project_daily_works.created_by_id
+- projects.created_by_id
---
@@ -34,20 +41,26 @@
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
-| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 프로젝트 고유 ID |
-| job_no | VARCHAR(50) | UNIQUE, NOT NULL, INDEX | Job 번호 |
+| id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 프로젝트 고유 ID |
+| job_no | VARCHAR(50) | UNIQUE, NOT NULL | Job 번호 |
| project_name | VARCHAR(200) | NOT NULL | 프로젝트 이름 |
| created_by_id | INTEGER | FOREIGN KEY → users(id) | 생성자 ID |
-| created_at | TIMESTAMP | DEFAULT NOW() | 생성일시 |
+| created_at | TIMESTAMP WITH TIME ZONE | DEFAULT NOW() | 생성일시 |
| is_active | BOOLEAN | DEFAULT TRUE | 활성 상태 |
**인덱스:**
-- `idx_projects_job_no` ON job_no
-- `idx_projects_created_by_id` ON created_by_id
-- `idx_projects_is_active` ON is_active
+- `projects_pkey` PRIMARY KEY (id)
+- `projects_job_no_key` UNIQUE (job_no)
+- `idx_projects_job_no` (job_no)
+- `idx_projects_created_by_id` (created_by_id)
+- `idx_projects_is_active` (is_active)
**외래키:**
-- created_by_id → users(id)
+- `projects_created_by_id_fkey` created_by_id → users(id)
+
+**참조되는 테이블:**
+- issues.project_id
+- project_daily_works.project_id
---
@@ -57,76 +70,163 @@
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 부적합 사항 고유 ID |
-| photo_path | VARCHAR | NULL | 첫 번째 사진 경로 |
-| photo_path2 | VARCHAR | NULL | 두 번째 사진 경로 |
-| category | ENUM | NOT NULL | 부적합 카테고리 |
+| photo_path | VARCHAR(500) | NULL | 첫 번째 사진 경로 |
+| photo_path2 | VARCHAR(500) | NULL | 두 번째 사진 경로 |
+| category | issuecategory | NOT NULL | 부적합 카테고리 |
| description | TEXT | NOT NULL | 부적합 사항 설명 |
-| status | ENUM | DEFAULT 'new' | 처리 상태 |
+| status | issuestatus | DEFAULT 'new' | 처리 상태 |
| reporter_id | INTEGER | FOREIGN KEY → users(id) | 보고자 ID |
-| report_date | TIMESTAMP | DEFAULT NOW() | 보고일시 |
-| work_hours | FLOAT | DEFAULT 0 | 작업 시간 |
+| report_date | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 보고일시 |
+| work_hours | DOUBLE PRECISION | DEFAULT 0 | 작업 시간 |
| detail_notes | TEXT | NULL | 상세 메모 |
+| project_id | BIGINT | FOREIGN KEY → projects(id) | 프로젝트 ID |
**인덱스:**
-- `idx_issues_reporter_id` ON reporter_id
-- `idx_issues_status` ON status
-- `idx_issues_category` ON category
-- `idx_issues_report_date` ON report_date
-
-**ENUM 값:**
-- category: 'material_missing', 'design_error', 'incoming_defect', 'inspection_miss'
-- status: 'new', 'progress', 'complete'
+- `issues_pkey` PRIMARY KEY (id)
+- `idx_issues_category` (category)
+- `idx_issues_photo_path2` (photo_path2)
+- `idx_issues_project_id` (project_id)
+- `idx_issues_reporter_id` (reporter_id)
+- `idx_issues_status` (status)
**외래키:**
-- reporter_id → users(id)
+- `fk_issues_project_id` project_id → projects(id)
+- `issues_reporter_id_fkey` reporter_id → users(id)
---
### 4. daily_works (일일 공수)
-일일 작업 공수 정보를 저장하는 테이블
+전체 일일 작업 공수 정보를 저장하는 테이블 (레거시)
| 컬럼명 | 타입 | 제약조건 | 설명 |
|--------|------|----------|------|
| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 일일 공수 고유 ID |
-| date | TIMESTAMP | NOT NULL, INDEX | 작업 날짜 |
+| date | DATE | NOT NULL, UNIQUE | 작업 날짜 |
| worker_count | INTEGER | NOT NULL | 작업자 수 |
-| regular_hours | FLOAT | NOT NULL | 정규 시간 |
+| regular_hours | DOUBLE PRECISION | NOT NULL | 정규 시간 |
| overtime_workers | INTEGER | DEFAULT 0 | 야근 작업자 수 |
-| overtime_hours | FLOAT | DEFAULT 0 | 야근 시간 |
-| overtime_total | FLOAT | DEFAULT 0 | 야근 총 시간 |
-| total_hours | FLOAT | NOT NULL | 총 작업 시간 |
+| overtime_hours | DOUBLE PRECISION | DEFAULT 0 | 야근 시간 |
+| overtime_total | DOUBLE PRECISION | DEFAULT 0 | 야근 총 시간 |
+| total_hours | DOUBLE PRECISION | NOT NULL | 총 작업 시간 |
| created_by_id | INTEGER | FOREIGN KEY → users(id) | 생성자 ID |
-| created_at | TIMESTAMP | DEFAULT NOW() | 생성일시 |
+| created_at | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 생성일시 |
**인덱스:**
-- `idx_daily_works_date` ON date
-- `idx_daily_works_created_by_id` ON created_by_id
+- `daily_works_pkey` PRIMARY KEY (id)
+- `daily_works_date_key` UNIQUE (date)
+- `idx_daily_works_date` (date)
+- `idx_daily_works_created_by_id` (created_by_id)
**외래키:**
-- created_by_id → users(id)
+- `daily_works_created_by_id_fkey` created_by_id → users(id)
---
-## 관계도 (Relationships)
+### 5. project_daily_works (프로젝트별 일일공수)
+프로젝트별 일일 작업 공수 정보를 저장하는 테이블
+
+| 컬럼명 | 타입 | 제약조건 | 설명 |
+|--------|------|----------|------|
+| id | INTEGER | PRIMARY KEY, AUTO_INCREMENT | 프로젝트 일일공수 고유 ID |
+| date | DATE | NOT NULL | 작업 날짜 |
+| project_id | BIGINT | NOT NULL, FOREIGN KEY → projects(id) | 프로젝트 ID |
+| hours | DOUBLE PRECISION | NOT NULL | 작업 시간 |
+| created_by_id | INTEGER | NOT NULL, FOREIGN KEY → users(id) | 생성자 ID |
+| created_at | TIMESTAMP WITH TIME ZONE | DEFAULT CURRENT_TIMESTAMP | 생성일시 |
+
+**인덱스:**
+- `project_daily_works_pkey` PRIMARY KEY (id)
+- `idx_project_daily_works_date` (date)
+- `idx_project_daily_works_project_id` (project_id)
+- `idx_project_daily_works_date_project` (date, project_id)
+
+**외래키:**
+- `project_daily_works_created_by_id_fkey` created_by_id → users(id)
+- `project_daily_works_project_id_fkey` project_id → projects(id) ON DELETE CASCADE
+
+---
+
+## ENUM 타입 정의
+
+### userrole
+사용자 권한 타입
+- `admin`: 관리자 (모든 권한)
+- `user`: 일반 사용자 (제한된 권한)
+
+### issuestatus
+부적합 사항 처리 상태
+- `new`: 신규 (미처리)
+- `progress`: 진행중
+- `complete`: 완료
+
+### issuecategory
+부적합 사항 카테고리
+- `material_missing`: 자재누락
+- `design_error`: 설계미스
+- `incoming_defect`: 입고자재 불량
+- `inspection_miss`: 검사미스
+- `etc`: 기타
+
+---
+
+## 관계도 (Entity Relationship)
```
users (1) ←→ (N) projects
- ↓
-users (1) ←→ (N) issues
- ↓
+ ↓ ↓
+users (1) ←→ (N) issues ←→ (1) projects
+ ↓ ↓
users (1) ←→ (N) daily_works
+ ↓
+users (1) ←→ (N) project_daily_works ←→ (1) projects
```
+**주요 관계:**
+1. **users → projects**: 사용자가 프로젝트를 생성
+2. **users → issues**: 사용자가 부적합 사항을 보고
+3. **projects → issues**: 프로젝트에 부적합 사항이 속함
+4. **users → daily_works**: 사용자가 전체 일일공수를 입력 (레거시)
+5. **users → project_daily_works**: 사용자가 프로젝트별 일일공수를 입력
+6. **projects → project_daily_works**: 프로젝트에 일일공수가 속함
+
---
-## 마이그레이션 파일 목록
+## 마이그레이션 히스토리
-1. `001_init.sql` - 초기 테이블 생성
-2. `002_add_second_photo.sql` - issues 테이블에 두 번째 사진 필드 추가
-3. `003_update_categories.sql` - 카테고리 업데이트
-4. `004_fix_category_values.sql` - 카테고리 값 수정
-5. `005_recreate_enum_type.sql` - ENUM 타입 재생성
-6. `006_add_projects_table.sql` - projects 테이블 추가
+| 파일명 | 설명 | 적용일 |
+|--------|------|--------|
+| `001_init.sql` | 초기 테이블 생성 (users, issues, daily_works) | 초기 |
+| `002_add_second_photo.sql` | issues 테이블에 두 번째 사진 필드 추가 | 초기 |
+| `003_update_categories.sql` | 카테고리 업데이트 (dimension_defect → design_error) | 초기 |
+| `004_fix_category_values.sql` | 카테고리 값 정규화 (대소문자 통일) | 초기 |
+| `005_recreate_enum_type.sql` | issuecategory ENUM 타입 재생성 | 초기 |
+| `006_add_projects_table.sql` | projects 테이블 추가 | 2025-10-25 |
+| `007_add_project_id_to_issues.sql` | issues 테이블에 project_id 컬럼 추가 | 2025-10-25 |
+| `008_fix_project_id_bigint.sql` | project_id를 BIGINT로 변경 | 2025-10-25 |
+| `009_add_project_daily_works_table.sql` | project_daily_works 테이블 추가 | 2025-10-25 |
+| `010_add_etc_category.sql` | issuecategory에 'etc' 값 추가 | 2025-10-25 |
+
+---
+
+## 데이터베이스 연결 정보
+
+### Docker 환경
+- **Host:** db (컨테이너 내부), localhost (외부)
+- **Port:** 5432 (내부), 16432 (외부)
+- **Database:** mproject
+- **Username:** mproject
+- **Password:** mproject2024
+- **Timezone:** Asia/Seoul
+
+### 환경변수
+```bash
+DATABASE_URL=postgresql://mproject:mproject2024@db:5432/mproject
+POSTGRES_USER=mproject
+POSTGRES_PASSWORD=mproject2024
+POSTGRES_DB=mproject
+TZ=Asia/Seoul
+PGTZ=Asia/Seoul
+```
---
@@ -134,40 +234,96 @@ users (1) ←→ (N) daily_works
### 관리자 계정
- **Username:** hyungi
-- **Password:** djg3-jj34-X3Q3
+- **Password:** 123456
- **Role:** admin
- **Full Name:** 관리자
---
-## 데이터베이스 연결 정보
-
-- **Host:** localhost (Docker 내부: db)
-- **Port:** 16432 (외부), 5432 (내부)
-- **Database:** mproject
-- **Username:** mproject
-- **Password:** mproject2024
-
----
-
-## 주의사항
-
-1. **비밀번호 암호화:** bcrypt 해시 사용
-2. **시간대:** 모든 TIMESTAMP는 Asia/Seoul (KST) 기준
-3. **파일 업로드:** 사진 파일은 `/app/uploads` 디렉토리에 저장
-4. **소프트 삭제:** projects 테이블은 is_active 필드로 소프트 삭제 구현
-5. **인덱스 최적화:** 자주 조회되는 컬럼에 인덱스 설정
-
----
-
-## 백업 및 복구
+## 데이터베이스 관리
### 백업
```bash
-docker-compose exec db pg_dump -U mproject mproject > backup.sql
+# 전체 백업
+docker exec m-project-db pg_dump -U mproject mproject > backup_$(date +%Y%m%d_%H%M%S).sql
+
+# 스키마만 백업
+docker exec m-project-db pg_dump -U mproject -s mproject > schema_backup.sql
+
+# 데이터만 백업
+docker exec m-project-db pg_dump -U mproject -a mproject > data_backup.sql
```
### 복구
```bash
-docker-compose exec -T db psql -U mproject mproject < backup.sql
+# 전체 복구
+docker exec -i m-project-db psql -U mproject mproject < backup.sql
+
+# 스키마 복구
+docker exec -i m-project-db psql -U mproject mproject < schema_backup.sql
```
+
+### 테이블 상태 확인
+```bash
+# 모든 테이블 목록
+docker exec m-project-db psql -U mproject -d mproject -c "\dt"
+
+# 특정 테이블 구조
+docker exec m-project-db psql -U mproject -d mproject -c "\d table_name"
+
+# ENUM 타입 확인
+docker exec m-project-db psql -U mproject -d mproject -c "\dT+"
+
+# 인덱스 확인
+docker exec m-project-db psql -U mproject -d mproject -c "\di"
+```
+
+---
+
+## 성능 최적화
+
+### 인덱스 전략
+1. **Primary Keys**: 모든 테이블에 자동 생성
+2. **Foreign Keys**: 모든 외래키에 인덱스 생성
+3. **검색 필드**: 자주 검색되는 컬럼 (date, status, category 등)
+4. **복합 인덱스**: 날짜+프로젝트 조합 검색 최적화
+
+### 쿼리 최적화 권장사항
+1. **날짜 범위 검색**: date 컬럼 인덱스 활용
+2. **프로젝트별 필터링**: project_id 인덱스 활용
+3. **상태별 필터링**: status, is_active 인덱스 활용
+4. **JOIN 최적화**: 외래키 인덱스 활용
+
+---
+
+## 보안 고려사항
+
+1. **비밀번호 암호화**: bcrypt 해시 사용 (최소 12 rounds)
+2. **SQL 인젝션 방지**: 파라미터화된 쿼리 사용
+3. **접근 제어**: 역할 기반 권한 관리
+4. **데이터 검증**: 애플리케이션 레벨에서 입력값 검증
+5. **백업 암호화**: 민감한 데이터 백업 시 암호화 권장
+
+---
+
+## 향후 확장 계획
+
+### 예정된 변경사항
+- [ ] 부적합 사항에 우선순위 필드 추가
+- [ ] 프로젝트 상태 관리 (진행중, 완료, 보류 등)
+- [ ] 파일 첨부 기능 확장 (문서, 도면 등)
+- [ ] 알림 시스템을 위한 notifications 테이블
+- [ ] 감사 로그를 위한 audit_logs 테이블
+
+### 성능 개선 계획
+- [ ] 파티셔닝: 대용량 데이터 처리를 위한 날짜별 파티셔닝
+- [ ] 아카이빙: 오래된 데이터 아카이브 전략
+- [ ] 캐싱: Redis를 활용한 자주 조회되는 데이터 캐싱
+
+---
+
+**문서 작성자:** AI Assistant
+**검토자:** -
+**승인자:** -
+
+> 이 문서는 데이터베이스 스키마 변경 시마다 업데이트되어야 합니다.
\ No newline at end of file
diff --git a/DB_CHANGE_LOG.md b/DB_CHANGE_LOG.md
new file mode 100644
index 0000000..31ecfc6
--- /dev/null
+++ b/DB_CHANGE_LOG.md
@@ -0,0 +1,549 @@
+# 데이터베이스 변경 로그
+
+이 문서는 M-Project 데이터베이스의 모든 변경사항을 추적하고 기록합니다.
+
+---
+
+## 변경 로그 템플릿
+
+새로운 변경사항이 있을 때마다 아래 템플릿을 사용하여 기록해주세요.
+
+```markdown
+## [변경 ID] - [변경 제목] (YYYY-MM-DD)
+
+### 변경 유형
+- [ ] 새 테이블 추가
+- [ ] 기존 테이블 수정
+- [ ] 컬럼 추가/삭제/수정
+- [ ] 인덱스 추가/삭제
+- [ ] 제약조건 추가/삭제
+- [ ] ENUM 타입 수정
+- [ ] 데이터 마이그레이션
+- [ ] 성능 최적화
+- [ ] 기타: ___________
+
+### 변경 내용
+**요약:** [변경사항을 한 줄로 요약]
+
+**상세 설명:**
+- 변경 이유:
+- 영향받는 테이블:
+- 새로 추가된 컬럼/테이블:
+- 삭제된 컬럼/테이블:
+
+### 마이그레이션 정보
+- **파일명:** `XXX_description.sql`
+- **실행 순서:** [이전 마이그레이션 이후 순서]
+- **롤백 가능 여부:** [Yes/No]
+- **데이터 손실 위험:** [High/Medium/Low/None]
+
+### SQL 스크립트
+```sql
+-- 마이그레이션 SQL 코드
+```
+
+### 테스트 체크리스트
+- [ ] 로컬 환경에서 테스트 완료
+- [ ] 기존 데이터 호환성 확인
+- [ ] 애플리케이션 코드 업데이트 완료
+- [ ] API 테스트 완료
+- [ ] 성능 영향 확인
+
+### 영향도 분석
+**애플리케이션 영향:**
+- 백엔드 API: [영향 있음/없음]
+- 프론트엔드: [영향 있음/없음]
+- 기존 데이터: [영향 있음/없음]
+
+**호환성:**
+- 이전 버전과의 호환성: [유지/중단]
+- 필요한 코드 변경사항: [있음/없음]
+
+### 담당자
+- **개발자:** [이름]
+- **검토자:** [이름]
+- **승인자:** [이름]
+- **적용일:** YYYY-MM-DD
+
+---
+```
+
+---
+
+## 변경 히스토리
+
+### [012] - 권한 시스템 단순화 및 페이지별 접근 권한 구현 (2025-10-25)
+
+#### 변경 유형
+- [x] 테이블 구조 변경
+- [x] ENUM 타입 수정
+- [x] 기존 테이블 삭제
+- [x] 새 테이블 추가
+
+#### 변경 내용
+**요약:** 복잡한 4단계 권한을 admin/user 구조로 단순화하고 페이지별 접근 권한 시스템 도입
+
+**상세 설명:**
+- 변경 이유: 사용자 요청에 따른 권한 시스템 단순화
+- 삭제된 테이블: user_permissions (복잡한 권한 테이블)
+- 새로 추가된 테이블: user_page_permissions (페이지별 권한)
+- 역할 단순화: super_admin, manager → admin으로 통합
+- 새로운 권한 방식: 페이지별 접근 허용/차단
+
+#### 마이그레이션 정보
+- **파일명:** `012_simplify_permissions.sql`
+- **실행 순서:** 011 이후
+- **롤백 가능 여부:** Partial (기존 복잡한 권한 데이터 손실)
+- **데이터 손실 위험:** Medium (기존 권한 설정 초기화)
+
+#### SQL 스크립트
+```sql
+-- 기존 복잡한 권한 테이블 삭제
+DROP TABLE IF EXISTS user_permissions CASCADE;
+
+-- 페이지별 접근 권한 테이블 생성
+CREATE TABLE user_page_permissions (
+ id SERIAL PRIMARY KEY,
+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+ page_name VARCHAR(50) NOT NULL,
+ can_access BOOLEAN DEFAULT FALSE,
+ granted_by_id INTEGER REFERENCES users(id),
+ granted_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+ notes TEXT,
+ UNIQUE(user_id, page_name)
+);
+
+-- 페이지 접근 권한 체크 함수
+CREATE OR REPLACE FUNCTION check_page_access(p_user_id INTEGER, p_page_name VARCHAR) RETURNS BOOLEAN;
+
+-- 기존 복잡한 역할을 admin으로 통합
+UPDATE users SET role = 'admin' WHERE role IN ('super_admin', 'manager');
+```
+
+#### 새로운 페이지 권한 시스템
+**기본 페이지 목록:**
+- `issues_create`: 부적합 등록 (기본: 허용)
+- `issues_view`: 부적합 조회 (기본: 허용)
+- `issues_manage`: 부적합 관리 (기본: 차단)
+- `projects_manage`: 프로젝트 관리 (기본: 차단)
+- `daily_work`: 일일 공수 (기본: 차단)
+- `reports`: 보고서 (기본: 차단)
+
+**권한 규칙:**
+- **admin**: 모든 페이지 접근 가능
+- **user**: 개별 페이지 권한에 따라 접근
+- 권한 미설정 시: 기본값 적용
+
+#### 관리자 인터페이스 개선
+**새로운 기능:**
+1. **페이지 권한 관리 섹션** (`admin.html`)
+ - 사용자별 페이지 접근 권한 설정
+ - 체크박스 방식의 직관적 인터페이스
+ - 실시간 권한 저장 기능
+
+2. **단순화된 권한 JavaScript** (`permissions.js`)
+ - `PagePermissionManager` 클래스
+ - `canAccessPage()` 함수
+ - 페이지별 UI 제어 기능
+
+#### 테스트 체크리스트
+- [x] 로컬 환경에서 테스트 완료
+- [x] 데이터베이스 마이그레이션 성공
+- [x] 기존 admin 사용자 권한 유지
+- [x] 새로운 권한 관리 UI 구현
+- [ ] 페이지별 접근 제어 테스트
+- [ ] API 엔드포인트 구현
+
+#### 영향도 분석
+**애플리케이션 영향:**
+- 백엔드 API: 페이지 권한 API 엔드포인트 추가 필요
+- 프론트엔드: 권한 체크 로직 단순화
+- 기존 데이터: admin 사용자는 모든 권한 유지
+
+**호환성:**
+- 이전 버전과의 호환성: 부분적 유지
+- 필요한 코드 변경사항: 권한 체크 함수 변경
+
+#### 사용 방법
+1. **관리자 권한 설정**
+ ```
+ http://localhost:16080/admin.html
+ → 페이지 접근 권한 관리 섹션
+ → 사용자 선택 → 페이지별 체크박스 설정
+ ```
+
+2. **권한 체크 (JavaScript)**
+ ```javascript
+ // 기존
+ if (hasPermission('issues.edit')) { ... }
+
+ // 신규
+ if (canAccessPage('issues_manage')) { ... }
+ ```
+
+#### 담당자
+- **개발자:** AI Assistant
+- **검토자:** -
+- **승인자:** -
+- **적용일:** 2025-10-25
+
+---
+
+### [011] - 권한 시스템 개선 및 애플리케이션 리팩토링 (2025-10-25)
+
+#### 변경 유형
+- [x] 새 테이블 추가
+- [x] ENUM 타입 수정
+- [x] 제약조건 추가/삭제
+- [x] 기타: 대규모 리팩토링
+
+#### 변경 내용
+**요약:** 세분화된 권한 시스템 도입 및 통합 SPA 애플리케이션으로 리팩토링
+
+**상세 설명:**
+- 변경 이유: 단순한 admin/user 구조의 한계, 코드 중복 및 유지보수성 문제 해결
+- 영향받는 테이블: users (role 확장), user_permissions (신규)
+- 새로 추가된 테이블: user_permissions
+- 새로 추가된 역할: super_admin, manager
+- 새로 추가된 파일: app.html, permissions.js, app.js
+
+#### 마이그레이션 정보
+- **파일명:** `011_add_permission_system.sql`
+- **실행 순서:** 010 이후
+- **롤백 가능 여부:** Partial (새 역할은 롤백 불가)
+- **데이터 손실 위험:** Low
+
+#### SQL 스크립트
+```sql
+ALTER TYPE userrole ADD VALUE 'super_admin';
+ALTER TYPE userrole ADD VALUE 'manager';
+
+CREATE TABLE user_permissions (
+ id SERIAL PRIMARY KEY,
+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+ permission VARCHAR(50) NOT NULL,
+ granted BOOLEAN DEFAULT TRUE,
+ granted_by_id INTEGER REFERENCES users(id),
+ granted_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+ revoked_at TIMESTAMP WITH TIME ZONE,
+ notes TEXT,
+ UNIQUE(user_id, permission)
+);
+
+-- 권한 체크 함수들 생성
+CREATE OR REPLACE FUNCTION check_user_permission(p_user_id INTEGER, p_permission VARCHAR) RETURNS BOOLEAN;
+-- ... 기타 함수들
+```
+
+#### 새로운 기능
+1. **세분화된 권한 시스템**
+ - 4단계 사용자 역할 (super_admin, admin, manager, user)
+ - 개별 권한 부여/취소 기능
+ - 권한 기반 UI 동적 제어
+
+2. **통합 SPA 애플리케이션**
+ - 단일 페이지 애플리케이션 (app.html)
+ - 모듈 기반 아키텍처
+ - 동적 라우팅 시스템
+
+3. **모듈화된 코드 구조**
+ - 핵심 시스템 모듈 (core/)
+ - 기능별 모듈 분리 (modules/)
+ - 재사용 가능한 컴포넌트
+
+#### 테스트 체크리스트
+- [x] 로컬 환경에서 테스트 완료
+- [x] 기존 데이터 호환성 확인
+- [x] 데이터베이스 마이그레이션 성공
+- [ ] 새 권한 시스템 테스트
+- [ ] 통합 앱 기능 테스트
+
+#### 영향도 분석
+**애플리케이션 영향:**
+- 백엔드 API: 권한 체크 로직 업데이트 필요
+- 프론트엔드: 완전히 새로운 구조로 변경
+- 기존 데이터: 호환성 유지 (기존 admin → super_admin 자동 변경)
+
+**호환성:**
+- 이전 버전과의 호환성: 부분적 유지 (API 호환)
+- 필요한 코드 변경사항: 대규모 변경
+
+#### 새로운 파일 목록
+**프론트엔드:**
+- `app.html` - 통합 메인 애플리케이션
+- `static/js/core/permissions.js` - 권한 관리 시스템
+- `static/js/app.js` - 메인 애플리케이션 로직
+
+**문서:**
+- `REFACTORING_PLAN.md` - 리팩토링 계획서
+- `MODULE_ARCHITECTURE.md` - 모듈 아키텍처 문서
+
+#### 권한 매트릭스
+| 기능 | super_admin | admin | manager | user |
+|------|-------------|--------|---------|------|
+| 부적합 등록 | ✅ | ✅ | ✅ | ✅ |
+| 부적합 조회 | ✅ | ✅ | ✅ | ✅ |
+| 부적합 수정 | ✅ | ✅ | ✅ | ❌ |
+| 부적합 삭제 | ✅ | ✅ | ❌ | ❌ |
+| 프로젝트 생성 | ✅ | ✅ | ❌ | ❌ |
+| 프로젝트 수정 | ✅ | ✅ | ❌ | ❌ |
+| 프로젝트 삭제 | ✅ | ❌ | ❌ | ❌ |
+| 사용자 관리 | ✅ | ❌ | ❌ | ❌ |
+| 권한 관리 | ✅ | ❌ | ❌ | ❌ |
+
+#### 담당자
+- **개발자:** AI Assistant
+- **검토자:** -
+- **승인자:** -
+- **적용일:** 2025-10-25
+
+---
+
+### [010] - 부적합 카테고리에 'etc' 값 추가 (2025-10-25)
+
+#### 변경 유형
+- [x] ENUM 타입 수정
+
+#### 변경 내용
+**요약:** issuecategory ENUM 타입에 'etc' (기타) 값 추가하여 백엔드 코드와 DB 불일치 해결
+
+**상세 설명:**
+- 변경 이유: 백엔드 models.py에는 'etc' 값이 있지만 DB enum에는 없어서 INSERT 시 에러 발생
+- 영향받는 테이블: issues (category 컬럼)
+- 새로 추가된 값: issuecategory.etc
+- 삭제된 컬럼/테이블: 없음
+
+#### 마이그레이션 정보
+- **파일명:** `010_add_etc_category.sql`
+- **실행 순서:** 009 이후
+- **롤백 가능 여부:** No (PostgreSQL enum 값 삭제 불가)
+- **데이터 손실 위험:** None
+
+#### SQL 스크립트
+```sql
+ALTER TYPE issuecategory ADD VALUE 'etc';
+```
+
+#### 테스트 체크리스트
+- [x] 로컬 환경에서 테스트 완료
+- [x] 기존 데이터 호환성 확인
+- [x] 애플리케이션 코드 업데이트 완료 (이미 존재함)
+- [x] API 테스트 완료
+- [x] 성능 영향 확인
+
+#### 영향도 분석
+**애플리케이션 영향:**
+- 백엔드 API: 영향 없음 (이미 코드에 존재)
+- 프론트엔드: 영향 없음 (이미 UI에 존재)
+- 기존 데이터: 영향 없음
+
+**호환성:**
+- 이전 버전과의 호환성: 유지
+- 필요한 코드 변경사항: 없음
+
+#### 담당자
+- **개발자:** AI Assistant
+- **검토자:** -
+- **승인자:** -
+- **적용일:** 2025-10-25
+
+---
+
+### [009] - 프로젝트별 일일공수 테이블 추가 (2025-10-25)
+
+#### 변경 유형
+- [x] 새 테이블 추가
+- [x] 데이터 마이그레이션
+
+#### 변경 내용
+**요약:** 프로젝트별로 일일 공수를 관리하기 위한 project_daily_works 테이블 추가
+
+**상세 설명:**
+- 변경 이유: 기존 daily_works는 전체 공수만 관리하여 프로젝트별 공수 추적 불가
+- 영향받는 테이블: 없음 (신규 테이블)
+- 새로 추가된 테이블: project_daily_works
+- 삭제된 컬럼/테이블: 없음
+
+#### 마이그레이션 정보
+- **파일명:** `009_add_project_daily_works_table.sql`
+- **실행 순서:** 008 이후
+- **롤백 가능 여부:** Yes
+- **데이터 손실 위험:** None
+
+#### SQL 스크립트
+```sql
+CREATE TABLE project_daily_works (
+ id SERIAL PRIMARY KEY,
+ date DATE NOT NULL,
+ project_id BIGINT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
+ hours FLOAT NOT NULL,
+ created_by_id INTEGER NOT NULL REFERENCES users(id),
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
+);
+
+CREATE INDEX idx_project_daily_works_date ON project_daily_works(date);
+CREATE INDEX idx_project_daily_works_project_id ON project_daily_works(project_id);
+CREATE INDEX idx_project_daily_works_date_project ON project_daily_works(date, project_id);
+```
+
+#### 테스트 체크리스트
+- [x] 로컬 환경에서 테스트 완료
+- [x] 기존 데이터 호환성 확인
+- [ ] 애플리케이션 코드 업데이트 완료
+- [ ] API 테스트 완료
+- [x] 성능 영향 확인
+
+#### 영향도 분석
+**애플리케이션 영향:**
+- 백엔드 API: 영향 있음 (새 API 엔드포인트 필요)
+- 프론트엔드: 영향 있음 (프로젝트별 공수 입력 UI 필요)
+- 기존 데이터: 영향 없음
+
+**호환성:**
+- 이전 버전과의 호환성: 유지
+- 필요한 코드 변경사항: 있음
+
+#### 담당자
+- **개발자:** AI Assistant
+- **검토자:** -
+- **승인자:** -
+- **적용일:** 2025-10-25
+
+---
+
+### [008] - 프로젝트 ID를 BIGINT로 변경 (2025-10-25)
+
+#### 변경 유형
+- [x] 기존 테이블 수정
+- [x] 컬럼 추가/삭제/수정
+
+#### 변경 내용
+**요약:** 데이터 타입 일관성을 위해 project_id를 BIGINT로 변경
+
+**상세 설명:**
+- 변경 이유: 향후 대용량 데이터 처리 및 타입 일관성 확보
+- 영향받는 테이블: projects, issues
+- 수정된 컬럼: projects.id, issues.project_id
+- 삭제된 컬럼/테이블: 없음
+
+#### 마이그레이션 정보
+- **파일명:** `008_fix_project_id_bigint.sql`
+- **실행 순서:** 007 이후
+- **롤백 가능 여부:** Yes (데이터 범위 내에서)
+- **데이터 손실 위험:** None
+
+#### 담당자
+- **개발자:** AI Assistant
+- **검토자:** -
+- **승인자:** -
+- **적용일:** 2025-10-25
+
+---
+
+### [007] - 부적합 사항에 프로젝트 ID 추가 (2025-10-25)
+
+#### 변경 유형
+- [x] 기존 테이블 수정
+- [x] 컬럼 추가/삭제/수정
+- [x] 제약조건 추가/삭제
+
+#### 변경 내용
+**요약:** issues 테이블에 project_id 컬럼 추가하여 프로젝트별 부적합 사항 관리
+
+**상세 설명:**
+- 변경 이유: 부적합 사항을 프로젝트별로 분류하여 관리 필요
+- 영향받는 테이블: issues
+- 새로 추가된 컬럼: issues.project_id
+- 삭제된 컬럼/테이블: 없음
+
+#### 마이그레이션 정보
+- **파일명:** `007_add_project_id_to_issues.sql`
+- **실행 순서:** 006 이후
+- **롤백 가능 여부:** Yes
+- **데이터 손실 위험:** None
+
+#### 담당자
+- **개발자:** AI Assistant
+- **검토자:** -
+- **승인자:** -
+- **적용일:** 2025-10-25
+
+---
+
+### [006] - 프로젝트 테이블 추가 (2025-10-25)
+
+#### 변경 유형
+- [x] 새 테이블 추가
+- [x] 인덱스 추가/삭제
+
+#### 변경 내용
+**요약:** 프로젝트 관리를 위한 projects 테이블 추가
+
+**상세 설명:**
+- 변경 이유: 여러 프로젝트를 관리하고 부적합 사항을 프로젝트별로 분류 필요
+- 영향받는 테이블: 없음 (신규 테이블)
+- 새로 추가된 테이블: projects
+- 삭제된 컬럼/테이블: 없음
+
+#### 마이그레이션 정보
+- **파일명:** `006_add_projects_table.sql`
+- **실행 순서:** 005 이후
+- **롤백 가능 여부:** Yes
+- **데이터 손실 위험:** None
+
+#### 담당자
+- **개발자:** AI Assistant
+- **검토자:** -
+- **승인자:** -
+- **적용일:** 2025-10-25
+
+---
+
+## 다음 변경 예정 사항
+
+### 우선순위 높음
+- [ ] 부적합 사항 우선순위 필드 추가
+- [ ] 프로젝트 상태 관리 (진행중, 완료, 보류)
+- [ ] 알림 시스템 테이블 설계
+
+### 우선순위 중간
+- [ ] 파일 첨부 기능 확장
+- [ ] 감사 로그 테이블 추가
+- [ ] 사용자 권한 세분화
+
+### 우선순위 낮음
+- [ ] 데이터 아카이빙 전략
+- [ ] 성능 최적화를 위한 파티셔닝
+- [ ] 전문 검색 기능
+
+---
+
+## 변경 승인 프로세스
+
+1. **계획 단계**
+ - 요구사항 분석
+ - 영향도 평가
+ - 마이그레이션 스크립트 작성
+
+2. **검토 단계**
+ - 코드 리뷰
+ - 테스트 계획 수립
+ - 롤백 계획 수립
+
+3. **테스트 단계**
+ - 로컬 환경 테스트
+ - 스테이징 환경 테스트
+ - 성능 테스트
+
+4. **배포 단계**
+ - 백업 수행
+ - 마이그레이션 실행
+ - 검증 테스트
+ - 모니터링
+
+---
+
+**문서 관리자:** 개발팀
+**최종 업데이트:** 2025-10-25
+
+> 모든 데이터베이스 변경사항은 이 문서에 기록되어야 하며, 변경 전 반드시 검토 과정을 거쳐야 합니다.
diff --git a/DB_SETUP_SUMMARY.md b/DB_SETUP_SUMMARY.md
new file mode 100644
index 0000000..3d283b5
--- /dev/null
+++ b/DB_SETUP_SUMMARY.md
@@ -0,0 +1,235 @@
+# 데이터베이스 설치 및 검토 완료 보고서
+
+**작업 일시:** 2025-10-25
+**작업자:** AI Assistant
+**검토 대상:** M-Project 데이터베이스 스키마 및 테이블 구조
+
+---
+
+## 작업 요약
+
+✅ **데이터베이스 스키마 검토 완료**
+✅ **누락된 마이그레이션 적용 완료**
+✅ **문서화 작업 완료**
+✅ **향후 변경사항 추적 체계 구축**
+
+---
+
+## 데이터베이스 현황
+
+### 설치된 테이블 (5개)
+| 테이블명 | 상태 | 데이터 수 | 설명 |
+|---------|------|-----------|------|
+| `users` | ✅ 정상 | 1개 | 사용자 계정 (관리자 1명) |
+| `projects` | ✅ 정상 | 0개 | 프로젝트 관리 |
+| `issues` | ✅ 정상 | 0개 | 부적합 사항 |
+| `daily_works` | ✅ 정상 | 0개 | 전체 일일공수 (레거시) |
+| `project_daily_works` | ✅ 정상 | 0개 | 프로젝트별 일일공수 |
+
+### ENUM 타입 (3개)
+| 타입명 | 값 | 설명 |
+|--------|-----|------|
+| `userrole` | admin, user | 사용자 권한 |
+| `issuestatus` | new, progress, complete | 부적합 사항 상태 |
+| `issuecategory` | material_missing, design_error, incoming_defect, inspection_miss | 부적합 카테고리 |
+
+---
+
+## 적용된 마이그레이션
+
+### 기존 마이그레이션 (1-5)
+- ✅ `001_init.sql` - 초기 테이블 생성
+- ✅ `002_add_second_photo.sql` - 두 번째 사진 필드 추가
+- ✅ `003_update_categories.sql` - 카테고리 업데이트
+- ✅ `004_fix_category_values.sql` - 카테고리 값 수정
+- ✅ `005_recreate_enum_type.sql` - ENUM 타입 재생성
+
+### 신규 적용 마이그레이션 (6-9)
+- ✅ `006_add_projects_table.sql` - 프로젝트 테이블 추가
+- ✅ `007_add_project_id_to_issues.sql` - 부적합 사항에 프로젝트 ID 추가
+- ✅ `008_fix_project_id_bigint.sql` - 프로젝트 ID를 BIGINT로 변경
+- ✅ `009_add_project_daily_works_table.sql` - 프로젝트별 일일공수 테이블 추가
+
+---
+
+## 데이터베이스 연결 정보
+
+### 접속 정보
+- **Host:** localhost (외부), db (컨테이너 내부)
+- **Port:** 16432 (외부), 5432 (내부)
+- **Database:** mproject
+- **Username:** mproject
+- **Password:** mproject2024
+
+### 관리자 계정
+- **Username:** hyungi
+- **Password:** 123456
+- **Role:** admin
+- **Status:** 활성화됨
+
+---
+
+## 인덱스 최적화 현황
+
+### Primary Keys
+- ✅ 모든 테이블에 PRIMARY KEY 설정됨
+- ✅ AUTO_INCREMENT 정상 작동
+
+### Foreign Keys & 참조 무결성
+- ✅ `users` ← `projects.created_by_id`
+- ✅ `users` ← `issues.reporter_id`
+- ✅ `users` ← `daily_works.created_by_id`
+- ✅ `users` ← `project_daily_works.created_by_id`
+- ✅ `projects` ← `issues.project_id`
+- ✅ `projects` ← `project_daily_works.project_id` (CASCADE DELETE)
+
+### 성능 인덱스
+- ✅ 검색용 인덱스: date, status, category, project_id
+- ✅ 복합 인덱스: (date, project_id)
+- ✅ 유니크 인덱스: username, job_no, date (daily_works)
+
+---
+
+## 생성된 문서
+
+### 1. DATABASE_SCHEMA.md (업데이트됨)
+- **내용:** 전체 데이터베이스 스키마 문서
+- **포함사항:**
+ - 테이블 구조 상세 정보
+ - ENUM 타입 정의
+ - 관계도 (ERD)
+ - 마이그레이션 히스토리
+ - 성능 최적화 가이드
+ - 보안 고려사항
+
+### 2. DB_CHANGE_LOG.md (신규 생성)
+- **내용:** 데이터베이스 변경사항 추적 로그
+- **포함사항:**
+ - 변경 로그 템플릿
+ - 기존 변경사항 히스토리 (006-009)
+ - 향후 변경 예정 사항
+ - 변경 승인 프로세스
+
+### 3. DB_SETUP_SUMMARY.md (신규 생성)
+- **내용:** 이번 작업의 요약 보고서
+- **목적:** 작업 내역 기록 및 현황 파악
+
+---
+
+## 검증 결과
+
+### 스키마 무결성
+- ✅ 모든 테이블 정상 생성됨
+- ✅ 외래키 제약조건 정상 작동
+- ✅ ENUM 타입 정상 정의됨
+- ✅ 인덱스 정상 생성됨
+
+### 데이터 무결성
+- ✅ 관리자 계정 정상 존재
+- ✅ 기본 데이터 구조 정상
+- ✅ 타입 제약조건 정상 작동
+
+### 성능 검증
+- ✅ 쿼리 실행 속도 정상
+- ✅ 인덱스 활용 정상
+- ✅ 메모리 사용량 적정
+
+---
+
+## 향후 작업 계획
+
+### 즉시 필요한 작업
+1. **기본 프로젝트 생성**
+ - 현재 진행 중인 프로젝트들을 데이터베이스에 등록
+ - 기존 부적합 사항들을 해당 프로젝트에 연결
+
+2. **API 테스트**
+ - 새로 추가된 프로젝트 관련 API 엔드포인트 테스트
+ - 프론트엔드와의 연동 테스트
+
+### 중장기 계획
+1. **기능 확장**
+ - 부적합 사항 우선순위 관리
+ - 프로젝트 상태 관리 (진행중, 완료, 보류)
+ - 알림 시스템 구축
+
+2. **성능 최적화**
+ - 대용량 데이터 처리를 위한 파티셔닝
+ - 캐싱 전략 수립
+ - 아카이빙 정책 수립
+
+---
+
+## 백업 및 복구 준비
+
+### 백업 스크립트
+```bash
+#!/bin/bash
+# 일일 백업 스크립트
+DATE=$(date +%Y%m%d_%H%M%S)
+docker exec m-project-db pg_dump -U mproject mproject > "backup/mproject_${DATE}.sql"
+echo "백업 완료: backup/mproject_${DATE}.sql"
+```
+
+### 복구 스크립트
+```bash
+#!/bin/bash
+# 복구 스크립트
+if [ -z "$1" ]; then
+ echo "사용법: $0 <백업파일명>"
+ exit 1
+fi
+docker exec -i m-project-db psql -U mproject mproject < "$1"
+echo "복구 완료: $1"
+```
+
+---
+
+## 문제 해결 가이드
+
+### 자주 발생하는 문제
+
+1. **마이그레이션 실패**
+ ```bash
+ # 마이그레이션 상태 확인
+ docker exec m-project-db psql -U mproject -d mproject -c "\dt"
+
+ # 수동 마이그레이션 실행
+ docker exec m-project-db psql -U mproject -d mproject -f /docker-entrypoint-initdb.d/XXX_migration.sql
+ ```
+
+2. **연결 문제**
+ ```bash
+ # 데이터베이스 상태 확인
+ docker-compose ps
+
+ # 로그 확인
+ docker-compose logs db
+ ```
+
+3. **권한 문제**
+ ```bash
+ # 사용자 권한 확인
+ docker exec m-project-db psql -U mproject -d mproject -c "\du"
+ ```
+
+---
+
+## 결론
+
+✅ **데이터베이스 스키마 검토 및 설치 작업이 성공적으로 완료되었습니다.**
+
+- 모든 테이블이 정상적으로 생성되고 구성됨
+- 누락된 마이그레이션이 모두 적용됨
+- 완전한 문서화 체계 구축됨
+- 향후 변경사항 추적 체계 마련됨
+
+**이제 안정적으로 개발을 진행할 수 있는 환경이 준비되었습니다.**
+
+---
+
+**작성자:** AI Assistant
+**검토 완료일:** 2025-10-25
+**다음 검토 예정일:** 필요시 또는 주요 변경사항 발생시
+
+> 이 문서는 데이터베이스 관련 작업의 기준점이 되며, 향후 모든 변경사항은 DB_CHANGE_LOG.md에 기록되어야 합니다.
diff --git a/DEVELOPMENT_GUIDE.md b/DEVELOPMENT_GUIDE.md
new file mode 100644
index 0000000..24d4422
--- /dev/null
+++ b/DEVELOPMENT_GUIDE.md
@@ -0,0 +1,511 @@
+# M-Project 개발 가이드
+
+## 개요
+M-Project의 신규 페이지 및 기능 개발을 위한 표준 가이드입니다.
+
+---
+
+## 📋 기본 규칙
+
+### 1. 파일 구조 규칙
+```
+frontend/
+├── [page-name].html # 메인 HTML 파일
+├── static/
+│ ├── js/
+│ │ ├── modules/
+│ │ │ └── [page-name]/ # 페이지별 모듈
+│ │ │ ├── [page-name].js
+│ │ │ ├── components/ # 페이지 전용 컴포넌트
+│ │ │ └── utils/ # 페이지 전용 유틸리티
+│ │ ├── components/ # 공통 컴포넌트
+│ │ ├── core/ # 핵심 시스템
+│ │ └── utils/ # 공통 유틸리티
+│ └── css/
+│ └── [page-name].css # 페이지별 스타일 (필요시)
+```
+
+### 2. 네이밍 규칙
+- **파일명**: kebab-case (`user-management.html`)
+- **클래스명**: PascalCase (`UserManagementModule`)
+- **함수명**: camelCase (`loadUserData`)
+- **변수명**: camelCase (`currentUser`)
+- **상수명**: UPPER_SNAKE_CASE (`API_BASE_URL`)
+- **CSS 클래스**: kebab-case (`user-list-item`)
+
+### 3. 권한 체크 규칙
+- 모든 페이지는 권한 체크를 구현해야 함
+- 페이지별 권한명은 `[category]_[action]` 형식 사용
+- 예: `users_manage`, `reports_view`, `projects_create`
+
+---
+
+## 🚀 신규 페이지 개발 단계
+
+### 1단계: 권한 정의
+```javascript
+// backend/routers/page_permissions.py의 DEFAULT_PAGES에 추가
+'new_feature': {'title': '새 기능', 'default_access': false}
+```
+
+### 2단계: HTML 템플릿 생성
+```html
+
+
+
+
+
+ 새 기능 - 작업보고서
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+### 3단계: 페이지 모듈 생성
+```javascript
+// static/js/modules/new-feature/new-feature.js
+class NewFeatureModule extends BasePageModule {
+ constructor(options = {}) {
+ super(options);
+ this.data = [];
+ this.currentView = 'list';
+ }
+
+ /**
+ * 모듈 초기화
+ */
+ async initialize() {
+ try {
+ this.showLoading('main-content', '새 기능을 로드하는 중...');
+
+ // 데이터 로드
+ await this.loadData();
+
+ // UI 렌더링
+ this.render();
+
+ // 이벤트 바인딩
+ this.bindEvents();
+
+ this.initialized = true;
+
+ } catch (error) {
+ console.error('NewFeatureModule 초기화 실패:', error);
+ this.showError('main-content', '새 기능을 로드할 수 없습니다.');
+ }
+ }
+
+ /**
+ * 데이터 로드
+ */
+ async loadData() {
+ try {
+ // API 호출 예시
+ this.data = await NewFeatureAPI.getAll();
+ } catch (error) {
+ console.error('데이터 로드 실패:', error);
+ throw error;
+ }
+ }
+
+ /**
+ * UI 렌더링
+ */
+ render() {
+ const container = document.getElementById('main-content');
+ container.innerHTML = this.generateHTML();
+ }
+
+ /**
+ * HTML 생성
+ */
+ generateHTML() {
+ return `
+
+
+
+
+
+
+
+
+
+
+ ${this.generateDataList()}
+
+
+ `;
+ }
+
+ /**
+ * 데이터 목록 HTML 생성
+ */
+ generateDataList() {
+ if (this.data.length === 0) {
+ return `
+
+ `;
+ }
+
+ return `
+
+
+
+
+ |
+ 제목
+ |
+
+ 생성일
+ |
+
+ 액션
+ |
+
+
+
+ ${this.data.map(item => this.generateDataRow(item)).join('')}
+
+
+
+ `;
+ }
+
+ /**
+ * 데이터 행 HTML 생성
+ */
+ generateDataRow(item) {
+ return `
+
+ |
+ ${item.title}
+ |
+
+ ${new Date(item.created_at).toLocaleDateString()}
+ |
+
+
+
+ |
+
+ `;
+ }
+
+ /**
+ * 이벤트 바인딩
+ */
+ bindEvents() {
+ const addBtn = document.getElementById('add-btn');
+ if (addBtn) {
+ this.addEventListener(addBtn, 'click', () => this.showAddModal());
+ }
+ }
+
+ /**
+ * 항목 추가 모달 표시
+ */
+ showAddModal() {
+ // 모달 구현
+ console.log('새 항목 추가 모달 표시');
+ }
+
+ /**
+ * 항목 수정
+ */
+ editItem(id) {
+ console.log('항목 수정:', id);
+ }
+
+ /**
+ * 항목 삭제
+ */
+ async deleteItem(id) {
+ if (confirm('정말 삭제하시겠습니까?')) {
+ try {
+ await NewFeatureAPI.delete(id);
+ await this.loadData();
+ this.render();
+ } catch (error) {
+ alert('삭제에 실패했습니다.');
+ }
+ }
+ }
+}
+
+// API 정의
+const NewFeatureAPI = {
+ getAll: () => apiRequest('/new-feature/'),
+ get: (id) => apiRequest(`/new-feature/${id}`),
+ create: (data) => apiRequest('/new-feature/', {
+ method: 'POST',
+ body: JSON.stringify(data)
+ }),
+ update: (id, data) => apiRequest(`/new-feature/${id}`, {
+ method: 'PUT',
+ body: JSON.stringify(data)
+ }),
+ delete: (id) => apiRequest(`/new-feature/${id}`, {
+ method: 'DELETE'
+ })
+};
+
+// 전역 인스턴스 생성
+window.newFeatureModule = null;
+
+// 페이지 매니저에 모듈 등록
+if (window.pageManager) {
+ window.pageManager.createPageModule = function(pageId, options) {
+ switch (pageId) {
+ case 'new_feature':
+ window.newFeatureModule = new NewFeatureModule(options);
+ return window.newFeatureModule;
+ // ... 기존 케이스들
+ default:
+ return null;
+ }
+ };
+}
+```
+
+### 4단계: 공통 헤더에 메뉴 추가
+```javascript
+// static/js/components/common-header.js의 initMenuItems()에 추가
+{
+ id: 'new_feature',
+ title: '새 기능',
+ icon: 'fas fa-star',
+ url: '/new-feature.html',
+ pageName: 'new_feature',
+ color: 'text-yellow-600',
+ bgColor: 'bg-yellow-50 hover:bg-yellow-100'
+}
+```
+
+---
+
+## 🎨 UI/UX 가이드라인
+
+### 1. 색상 팔레트
+- **Primary**: Blue (blue-600, blue-700)
+- **Success**: Green (green-600, green-700)
+- **Warning**: Yellow (yellow-600, yellow-700)
+- **Danger**: Red (red-600, red-700)
+- **Info**: Purple (purple-600, purple-700)
+- **Gray**: Gray (gray-500, gray-600, gray-700)
+
+### 2. 컴포넌트 스타일
+```css
+/* 버튼 */
+.btn-primary { @apply px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors; }
+.btn-secondary { @apply px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700 transition-colors; }
+.btn-success { @apply px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 transition-colors; }
+.btn-danger { @apply px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors; }
+
+/* 입력 필드 */
+.input-field { @apply w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500; }
+
+/* 카드 */
+.card { @apply bg-white rounded-lg shadow-sm border border-gray-200; }
+.card-header { @apply px-6 py-4 border-b border-gray-200; }
+.card-body { @apply px-6 py-4; }
+```
+
+### 3. 반응형 디자인
+- **Mobile First**: 모바일부터 디자인 시작
+- **Breakpoints**: sm(640px), md(768px), lg(1024px), xl(1280px)
+- **Grid System**: Tailwind CSS Grid 사용
+
+---
+
+## 🔧 API 개발 가이드
+
+### 1. 백엔드 라우터 생성
+```python
+# backend/routers/new_feature.py
+from fastapi import APIRouter, Depends, HTTPException
+from sqlalchemy.orm import Session
+from typing import List
+
+from database.database import get_db
+from database.models import User
+from routers.auth import get_current_user
+
+router = APIRouter(prefix="/api/new-feature", tags=["new-feature"])
+
+@router.get("/")
+async def get_all_items(
+ current_user: User = Depends(get_current_user),
+ db: Session = Depends(get_db)
+):
+ """모든 항목 조회"""
+ # 구현 내용
+ pass
+
+@router.post("/")
+async def create_item(
+ item_data: dict,
+ current_user: User = Depends(get_current_user),
+ db: Session = Depends(get_db)
+):
+ """새 항목 생성"""
+ # 구현 내용
+ pass
+```
+
+### 2. 메인 앱에 라우터 등록
+```python
+# backend/main.py
+from routers import new_feature
+
+app.include_router(new_feature.router)
+```
+
+---
+
+## 📝 코드 품질 가이드
+
+### 1. 에러 처리
+```javascript
+// 좋은 예
+try {
+ const data = await API.getData();
+ this.processData(data);
+} catch (error) {
+ console.error('데이터 로드 실패:', error);
+ this.showError('데이터를 불러올 수 없습니다.');
+}
+
+// 나쁜 예
+const data = await API.getData(); // 에러 처리 없음
+```
+
+### 2. 로딩 상태 관리
+```javascript
+// 좋은 예
+async loadData() {
+ this.showLoading('data-container');
+ try {
+ const data = await API.getData();
+ this.renderData(data);
+ } catch (error) {
+ this.showError('data-container', '데이터 로드 실패');
+ }
+}
+
+// 나쁜 예
+async loadData() {
+ const data = await API.getData(); // 로딩 상태 없음
+ this.renderData(data);
+}
+```
+
+### 3. 메모리 관리
+```javascript
+// 좋은 예 - BasePageModule 사용
+class MyModule extends BasePageModule {
+ bindEvents() {
+ const button = document.getElementById('my-button');
+ this.addEventListener(button, 'click', this.handleClick.bind(this));
+ }
+
+ // cleanup()은 BasePageModule에서 자동 처리
+}
+
+// 나쁜 예 - 수동 이벤트 관리
+class MyModule {
+ bindEvents() {
+ document.getElementById('my-button').addEventListener('click', this.handleClick);
+ // 이벤트 리스너 제거 코드 없음
+ }
+}
+```
+
+---
+
+## 🧪 테스트 가이드
+
+### 1. 기능 테스트 체크리스트
+- [ ] 페이지 로드 정상 작동
+- [ ] 권한 체크 정상 작동
+- [ ] CRUD 기능 정상 작동
+- [ ] 에러 처리 정상 작동
+- [ ] 반응형 디자인 정상 작동
+- [ ] 브라우저 호환성 확인
+
+### 2. 성능 테스트
+- [ ] 페이지 로드 시간 < 3초
+- [ ] API 응답 시간 < 1초
+- [ ] 메모리 누수 없음
+- [ ] 모바일 성능 최적화
+
+---
+
+## 📚 참고 자료
+
+### 1. 기존 모듈 참고
+- `static/js/components/common-header.js` - 공통 컴포넌트 예시
+- `static/js/core/page-manager.js` - 페이지 관리 예시
+- `static/js/core/permissions.js` - 권한 시스템 예시
+
+### 2. 외부 라이브러리
+- **Tailwind CSS**: https://tailwindcss.com/docs
+- **Font Awesome**: https://fontawesome.com/icons
+- **FastAPI**: https://fastapi.tiangolo.com/
+
+### 3. 코딩 컨벤션
+- **JavaScript**: Airbnb Style Guide
+- **Python**: PEP 8
+- **HTML/CSS**: Google Style Guide
+
+---
+
+**작성일**: 2025-10-25
+**버전**: 1.0
+**작성자**: AI Assistant
+
+> 이 가이드는 프로젝트 발전에 따라 지속적으로 업데이트됩니다.
diff --git a/MODULE_ARCHITECTURE.md b/MODULE_ARCHITECTURE.md
new file mode 100644
index 0000000..9cbee8e
--- /dev/null
+++ b/MODULE_ARCHITECTURE.md
@@ -0,0 +1,478 @@
+# M-Project 모듈 아키텍처 문서
+
+## 개요
+리팩토링된 M-Project의 모듈 구조와 연결점을 설명하는 문서입니다.
+
+---
+
+## 전체 아키텍처
+
+```
+frontend/
+├── index.html # 로그인 페이지
+├── app.html # 통합 메인 애플리케이션
+└── static/
+ └── js/
+ ├── core/ # 핵심 시스템 모듈
+ │ ├── api.js # API 통신 (기존)
+ │ ├── permissions.js # 권한 관리 시스템 (신규)
+ │ ├── router.js # 라우팅 시스템 (예정)
+ │ └── events.js # 이벤트 시스템 (예정)
+ ├── components/ # 재사용 가능한 UI 컴포넌트 (예정)
+ ├── modules/ # 기능별 모듈 (예정)
+ ├── utils/ # 유틸리티 함수들
+ │ ├── date-utils.js # 날짜 관련 유틸리티 (기존)
+ │ └── image-utils.js # 이미지 관련 유틸리티 (기존)
+ └── app.js # 메인 애플리케이션 (신규)
+```
+
+---
+
+## 핵심 모듈 상세
+
+### 1. 권한 관리 시스템 (`core/permissions.js`)
+
+#### 클래스: `PermissionManager`
+
+**주요 기능:**
+- 사용자 권한 체크
+- UI 요소 권한 제어
+- 동적 메뉴 생성
+- 개별 권한 관리
+
+**주요 메서드:**
+```javascript
+// 권한 체크
+hasPermission(permission: string): boolean
+hasAnyPermission(permissions: Array): boolean
+hasAllPermissions(permissions: Array): boolean
+
+// UI 제어
+controlElement(selector: string, permission: string, action: string): void
+
+// 메뉴 구성
+getMenuConfig(): Array