Files
M-Project/REFACTORING_PLAN.md
Hyungi Ahn d3333c4dc2 docs: 프로젝트 문서화 및 개발 가이드 추가
- 데이터베이스 스키마 및 변경 로그 문서화
- 신규 페이지 개발 가이드 작성
- 모듈 아키텍처 설계 문서 추가
- 성능 최적화 전략 문서화
- 리팩토링 계획 및 진행 상황 정리

Documentation:
- DATABASE_SCHEMA.md: 전체 DB 스키마 구조
- DB_CHANGE_LOG.md: 마이그레이션 변경 이력
- DEVELOPMENT_GUIDE.md: 신규 기능 개발 표준
- MODULE_ARCHITECTURE.md: 프론트엔드 모듈 구조
- PERFORMANCE_OPTIMIZATION.md: 성능 최적화 가이드
- REFACTORING_PLAN.md: 리팩토링 진행 상황

Test Files:
- app.html, app.js: SPA 테스트 파일
- test_api.html: API 테스트 페이지
2025-10-25 09:01:54 +09:00

9.8 KiB

M-Project 리팩토링 계획서

개요

사용자 권한 시스템을 세분화하고, 코드를 모듈화하여 유지보수성을 향상시키는 리팩토링 작업


1. 권한 시스템 개선

현재 문제점

  • 단순한 2단계 권한 (admin/user)
  • 하드코딩된 권한 체크
  • 페이지별로 다른 권한 체크 로직

개선 방향

1.1 새로운 권한 구조

// 기존
enum UserRole {
    admin = "admin",
    user = "user"
}

// 개선
enum UserRole {
    super_admin = "super_admin",     // 최고 관리자
    admin = "admin",                 // 관리자
    manager = "manager",             // 매니저
    user = "user"                    // 일반 사용자
}

// 권한별 기능 매트릭스
const PERMISSIONS = {
    // 부적합 사항 관리
    'issues.create': ['super_admin', 'admin', 'manager', 'user'],
    'issues.view': ['super_admin', 'admin', 'manager', 'user'],
    'issues.edit': ['super_admin', 'admin', 'manager'],
    'issues.delete': ['super_admin', 'admin'],
    'issues.review': ['super_admin', 'admin', 'manager'],
    
    // 프로젝트 관리
    'projects.create': ['super_admin', 'admin'],
    'projects.view': ['super_admin', 'admin', 'manager', 'user'],
    'projects.edit': ['super_admin', 'admin'],
    'projects.delete': ['super_admin'],
    
    // 일일 공수 관리
    'daily_work.create': ['super_admin', 'admin', 'manager'],
    'daily_work.view': ['super_admin', 'admin', 'manager', 'user'],
    'daily_work.edit': ['super_admin', 'admin', 'manager'],
    'daily_work.delete': ['super_admin', 'admin'],
    
    // 보고서
    'reports.view': ['super_admin', 'admin', 'manager'],
    'reports.export': ['super_admin', 'admin'],
    
    // 사용자 관리
    'users.create': ['super_admin'],
    'users.view': ['super_admin', 'admin'],
    'users.edit': ['super_admin'],
    'users.delete': ['super_admin'],
    'users.change_role': ['super_admin']
}

1.2 데이터베이스 스키마 변경

-- 새로운 권한 ENUM 타입
ALTER TYPE userrole ADD VALUE 'super_admin';
ALTER TYPE userrole ADD VALUE 'manager';

-- 사용자별 개별 권한 테이블 (선택적)
CREATE TABLE user_permissions (
    id SERIAL PRIMARY KEY,
    user_id INTEGER 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(),
    UNIQUE(user_id, permission)
);

2. 페이지 통합 계획

현재 문제점

  • 사용자/관리자별 별도 페이지
  • 중복된 코드와 로직
  • 일관성 없는 UI/UX

통합 방향

2.1 단일 페이지 구조

기존:
- index.html (사용자용)
- admin.html (관리자용)
- project-management.html (관리자용)
- issue-view.html (공통)
- daily-work.html (관리자용)

개선:
- app.html (통합 메인 애플리케이션)
  ├── 부적합 등록 (모든 사용자)
  ├── 부적합 조회 (모든 사용자)
  ├── 프로젝트 관리 (권한별 제한)
  ├── 일일 공수 (권한별 제한)
  ├── 보고서 (권한별 제한)
  └── 사용자 관리 (최고 관리자만)

2.2 동적 메뉴 시스템

// 권한 기반 메뉴 구성
const MENU_CONFIG = {
    'issues': {
        title: '부적합 사항',
        icon: 'fas fa-exclamation-triangle',
        permission: 'issues.view',
        children: [
            { title: '등록', path: '#issues/create', permission: 'issues.create' },
            { title: '조회', path: '#issues/list', permission: 'issues.view' },
            { title: '관리', path: '#issues/manage', permission: 'issues.edit' }
        ]
    },
    'projects': {
        title: '프로젝트',
        icon: 'fas fa-folder-open',
        permission: 'projects.view',
        children: [
            { title: '목록', path: '#projects/list', permission: 'projects.view' },
            { title: '관리', path: '#projects/manage', permission: 'projects.edit' }
        ]
    }
    // ... 기타 메뉴
}

3. 코드 모듈화 계획

현재 문제점

  • 긴 HTML 파일 (1000+ 라인)
  • 중복된 JavaScript 코드
  • 하드코딩된 로직

모듈화 구조

3.1 디렉토리 구조

frontend/
├── index.html (로그인 페이지)
├── app.html (메인 애플리케이션)
├── static/
│   ├── js/
│   │   ├── core/
│   │   │   ├── api.js (API 통신)
│   │   │   ├── auth.js (인증/권한)
│   │   │   ├── router.js (라우팅)
│   │   │   └── permissions.js (권한 체크)
│   │   ├── components/
│   │   │   ├── header.js (공통 헤더)
│   │   │   ├── sidebar.js (사이드바)
│   │   │   ├── modal.js (모달 컴포넌트)
│   │   │   └── form-validator.js (폼 검증)
│   │   ├── modules/
│   │   │   ├── issues/
│   │   │   │   ├── issue-list.js
│   │   │   │   ├── issue-form.js
│   │   │   │   └── issue-detail.js
│   │   │   ├── projects/
│   │   │   │   ├── project-list.js
│   │   │   │   └── project-form.js
│   │   │   ├── reports/
│   │   │   │   └── report-generator.js
│   │   │   └── users/
│   │   │       ├── user-list.js
│   │   │       └── user-form.js
│   │   ├── utils/
│   │   │   ├── date-utils.js
│   │   │   ├── image-utils.js
│   │   │   └── format-utils.js
│   │   └── app.js (메인 애플리케이션)
│   └── css/
│       ├── components/
│       └── modules/

3.2 모듈 간 연결점 (Interface)

3.2.1 이벤트 시스템
// 중앙 이벤트 버스
class EventBus {
    constructor() {
        this.events = {};
    }
    
    on(event, callback) {
        if (!this.events[event]) {
            this.events[event] = [];
        }
        this.events[event].push(callback);
    }
    
    emit(event, data) {
        if (this.events[event]) {
            this.events[event].forEach(callback => callback(data));
        }
    }
    
    off(event, callback) {
        if (this.events[event]) {
            this.events[event] = this.events[event].filter(cb => cb !== callback);
        }
    }
}

// 전역 이벤트 버스
window.eventBus = new EventBus();

// 사용 예시
// 부적합 등록 완료 시
eventBus.emit('issue.created', { id: 123, title: '새 부적합' });

// 부적합 목록에서 수신
eventBus.on('issue.created', (data) => {
    refreshIssueList();
});
3.2.2 상태 관리
// 중앙 상태 관리
class StateManager {
    constructor() {
        this.state = {
            user: null,
            projects: [],
            issues: [],
            currentProject: null
        };
        this.subscribers = {};
    }
    
    setState(key, value) {
        this.state[key] = value;
        this.notify(key, value);
    }
    
    getState(key) {
        return this.state[key];
    }
    
    subscribe(key, callback) {
        if (!this.subscribers[key]) {
            this.subscribers[key] = [];
        }
        this.subscribers[key].push(callback);
    }
    
    notify(key, value) {
        if (this.subscribers[key]) {
            this.subscribers[key].forEach(callback => callback(value));
        }
    }
}

// 전역 상태 관리자
window.stateManager = new StateManager();
3.2.3 모듈 로더
// 동적 모듈 로딩
class ModuleLoader {
    constructor() {
        this.loadedModules = new Set();
    }
    
    async loadModule(modulePath) {
        if (this.loadedModules.has(modulePath)) {
            return;
        }
        
        return new Promise((resolve, reject) => {
            const script = document.createElement('script');
            script.src = modulePath;
            script.onload = () => {
                this.loadedModules.add(modulePath);
                resolve();
            };
            script.onerror = reject;
            document.head.appendChild(script);
        });
    }
    
    async loadModules(modules) {
        const promises = modules.map(module => this.loadModule(module));
        return Promise.all(promises);
    }
}

// 전역 모듈 로더
window.moduleLoader = new ModuleLoader();

4. 구현 단계

Phase 1: 권한 시스템 개선

  1. 데이터베이스 스키마 업데이트
  2. 백엔드 권한 체크 로직 개선
  3. 프론트엔드 권한 관리 모듈 개발

Phase 2: 코어 모듈 개발

  1. 이벤트 시스템 구현
  2. 상태 관리 시스템 구현
  3. 라우터 시스템 구현
  4. 권한 체크 모듈 구현

Phase 3: 컴포넌트 모듈화

  1. 공통 컴포넌트 분리
  2. 기능별 모듈 분리
  3. 유틸리티 함수 분리

Phase 4: 페이지 통합

  1. 통합 메인 페이지 개발
  2. 동적 메뉴 시스템 구현
  3. 기존 페이지 마이그레이션

Phase 5: 테스트 및 최적화

  1. 기능 테스트
  2. 성능 최적화
  3. 문서화 완료

5. 예상 효과

개발 효율성

  • 코드 재사용성 증가
  • 유지보수 비용 감소
  • 새 기능 개발 속도 향상

사용자 경험

  • 일관된 UI/UX
  • 권한별 맞춤 인터페이스
  • 빠른 페이지 전환

시스템 안정성

  • 명확한 권한 체계
  • 모듈 간 낮은 결합도
  • 높은 테스트 가능성

6. 위험 요소 및 대응 방안

위험 요소

  1. 기존 기능 호환성 문제
  2. 개발 기간 연장
  3. 사용자 적응 시간

대응 방안

  1. 단계별 점진적 마이그레이션
  2. 기존 기능 유지하면서 새 기능 추가
  3. 충분한 테스트 및 문서화

작성일: 2025-10-25
작성자: AI Assistant
검토자: -
승인자: -