✅ 백엔드 구조 개선: - DatabaseService: 공통 DB 쿼리 로직 통합 - FileUploadService: 파일 업로드 로직 모듈화 및 트랜잭션 관리 개선 - 서비스 레이어 패턴 도입으로 코드 재사용성 향상 ✅ 프론트엔드 컴포넌트 개선: - LoadingSpinner, ErrorMessage, ConfirmDialog 공통 컴포넌트 생성 - 재사용 가능한 컴포넌트 라이브러리 구축 - deprecated/backup 파일들 완전 제거 ✅ 성능 최적화: - optimize_database.py: 핵심 DB 인덱스 자동 생성 - 쿼리 최적화 및 통계 업데이트 자동화 - VACUUM ANALYZE 자동 실행 ✅ 코드 정리: - 개별 SQL 마이그레이션 파일들을 legacy/ 폴더로 정리 - 중복된 마이그레이션 스크립트 정리 - 깔끔하고 체계적인 프로젝트 구조 완성 ✅ 자동 마이그레이션 시스템 강화: - complete_migrate.py: SQLAlchemy 기반 완전한 마이그레이션 - analyze_and_fix_schema.py: 백엔드 코드 분석 기반 스키마 수정 - fix_missing_tables.py: 누락된 테이블/컬럼 자동 생성 - start.sh: 배포 시 자동 실행 순서 최적화
This commit is contained in:
142
backend/scripts/legacy/19_add_user_tracking_fields.sql
Normal file
142
backend/scripts/legacy/19_add_user_tracking_fields.sql
Normal file
@@ -0,0 +1,142 @@
|
||||
-- 사용자 추적 및 담당자 기록 필드 추가
|
||||
-- 생성일: 2025.01
|
||||
-- 목적: RULES 가이드라인에 따른 사용자 추적 시스템 구축
|
||||
|
||||
-- ================================
|
||||
-- 1. 기존 테이블에 담당자 필드 추가
|
||||
-- ================================
|
||||
|
||||
-- files 테이블 수정 (uploaded_by는 이미 존재)
|
||||
ALTER TABLE files
|
||||
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
|
||||
|
||||
-- jobs 테이블 수정
|
||||
ALTER TABLE jobs
|
||||
ADD COLUMN IF NOT EXISTS created_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS assigned_to VARCHAR(100);
|
||||
|
||||
-- materials 테이블 수정
|
||||
ALTER TABLE materials
|
||||
ADD COLUMN IF NOT EXISTS classified_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS classified_at TIMESTAMP,
|
||||
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100);
|
||||
|
||||
-- ================================
|
||||
-- 2. 사용자 활동 로그 테이블 생성
|
||||
-- ================================
|
||||
|
||||
CREATE TABLE IF NOT EXISTS user_activity_logs (
|
||||
id SERIAL PRIMARY KEY,
|
||||
user_id INTEGER, -- users 테이블 참조 (외래키 제약 없음 - 유연성)
|
||||
username VARCHAR(100) NOT NULL, -- 사용자명 (필수)
|
||||
|
||||
-- 활동 정보
|
||||
activity_type VARCHAR(50) NOT NULL, -- 'FILE_UPLOAD', 'PROJECT_CREATE', 'PURCHASE_CONFIRM' 등
|
||||
activity_description TEXT, -- 상세 활동 내용
|
||||
|
||||
-- 대상 정보
|
||||
target_id INTEGER, -- 대상 ID (파일, 프로젝트 등)
|
||||
target_type VARCHAR(50), -- 'FILE', 'PROJECT', 'MATERIAL', 'PURCHASE' 등
|
||||
|
||||
-- 세션 정보
|
||||
ip_address VARCHAR(45), -- IP 주소
|
||||
user_agent TEXT, -- 브라우저 정보
|
||||
|
||||
-- 추가 메타데이터 (JSON)
|
||||
metadata JSONB, -- 추가 정보 (파일 크기, 처리 시간 등)
|
||||
|
||||
-- 시간 정보
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
-- ================================
|
||||
-- 3. 구매 관련 테이블 수정
|
||||
-- ================================
|
||||
|
||||
-- purchase_items 테이블 수정 (이미 created_by 존재하는지 확인 후 추가)
|
||||
ALTER TABLE purchase_items
|
||||
ADD COLUMN IF NOT EXISTS updated_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS approved_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS approved_at TIMESTAMP;
|
||||
|
||||
-- material_purchase_tracking 테이블 수정 (이미 confirmed_by 존재)
|
||||
ALTER TABLE material_purchase_tracking
|
||||
ADD COLUMN IF NOT EXISTS ordered_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS ordered_at TIMESTAMP,
|
||||
ADD COLUMN IF NOT EXISTS approved_by VARCHAR(100),
|
||||
ADD COLUMN IF NOT EXISTS approved_at TIMESTAMP;
|
||||
|
||||
-- ================================
|
||||
-- 4. 인덱스 생성 (성능 최적화)
|
||||
-- ================================
|
||||
|
||||
-- 사용자 활동 로그 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_username ON user_activity_logs(username);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_activity_type ON user_activity_logs(activity_type);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_created_at ON user_activity_logs(created_at);
|
||||
CREATE INDEX IF NOT EXISTS idx_user_activity_logs_target ON user_activity_logs(target_type, target_id);
|
||||
|
||||
-- 담당자 필드 인덱스
|
||||
CREATE INDEX IF NOT EXISTS idx_files_uploaded_by ON files(uploaded_by);
|
||||
CREATE INDEX IF NOT EXISTS idx_files_updated_by ON files(updated_by);
|
||||
CREATE INDEX IF NOT EXISTS idx_jobs_created_by ON jobs(created_by);
|
||||
CREATE INDEX IF NOT EXISTS idx_jobs_assigned_to ON jobs(assigned_to);
|
||||
CREATE INDEX IF NOT EXISTS idx_materials_classified_by ON materials(classified_by);
|
||||
|
||||
-- ================================
|
||||
-- 5. 트리거 생성 (자동 updated_at 갱신)
|
||||
-- ================================
|
||||
|
||||
-- files 테이블 updated_at 자동 갱신
|
||||
CREATE OR REPLACE FUNCTION update_files_updated_at()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = CURRENT_TIMESTAMP;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ language 'plpgsql';
|
||||
|
||||
DROP TRIGGER IF EXISTS trigger_files_updated_at ON files;
|
||||
CREATE TRIGGER trigger_files_updated_at
|
||||
BEFORE UPDATE ON files
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_files_updated_at();
|
||||
|
||||
-- jobs 테이블 updated_at 자동 갱신
|
||||
CREATE OR REPLACE FUNCTION update_jobs_updated_at()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
NEW.updated_at = CURRENT_TIMESTAMP;
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ language 'plpgsql';
|
||||
|
||||
DROP TRIGGER IF EXISTS trigger_jobs_updated_at ON jobs;
|
||||
CREATE TRIGGER trigger_jobs_updated_at
|
||||
BEFORE UPDATE ON jobs
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION update_jobs_updated_at();
|
||||
|
||||
-- ================================
|
||||
-- 6. 기본 데이터 설정
|
||||
-- ================================
|
||||
|
||||
-- 기존 데이터에 기본 담당자 설정 (시스템 마이그레이션용)
|
||||
UPDATE files SET uploaded_by = 'system' WHERE uploaded_by IS NULL;
|
||||
UPDATE jobs SET created_by = 'system' WHERE created_by IS NULL;
|
||||
|
||||
-- ================================
|
||||
-- 7. 권한 및 보안 설정
|
||||
-- ================================
|
||||
|
||||
-- 활동 로그 테이블은 INSERT만 허용 (수정/삭제 방지)
|
||||
-- 실제 운영에서는 별도 권한 관리 필요
|
||||
|
||||
COMMENT ON TABLE user_activity_logs IS '사용자 활동 로그 - 모든 업무 활동 추적';
|
||||
COMMENT ON COLUMN user_activity_logs.activity_type IS '활동 유형: FILE_UPLOAD, PROJECT_CREATE, PURCHASE_CONFIRM, MATERIAL_CLASSIFY 등';
|
||||
COMMENT ON COLUMN user_activity_logs.metadata IS '추가 정보 JSON: 파일크기, 처리시간, 변경내용 등';
|
||||
|
||||
-- 완료 메시지
|
||||
SELECT 'User tracking system tables created successfully!' as result;
|
||||
Reference in New Issue
Block a user