Files
M-Project/backend/migrations/014_add_user_department.sql
Hyungi Ahn 236e1ca493 feat: 사용자 관리에 부서 정보 추가 및 편집 기능 구현
🏢 Department Management System:
- 5개 부서 지원: 생산, 품질, 구매, 설계, 영업
- 사용자 생성/수정 시 부서 선택 가능
- 부서별 사용자 분류 및 표시

📊 Database Schema Updates:
- department_type ENUM 추가 (production, quality, purchasing, design, sales)
- users 테이블에 department 컬럼 추가
- idx_users_department 인덱스 생성 (성능 최적화)
- 014_add_user_department.sql 마이그레이션 실행

🔧 Backend Enhancements:
- DepartmentType ENUM 클래스 추가 (models.py, schemas.py)
- User 모델에 department 필드 추가
- UserBase, UserUpdate 스키마에 department 필드 포함
- 기존 API 엔드포인트 자동 호환

🎨 Frontend UI Improvements:
- 사용자 추가 폼에 부서 선택 드롭다운 추가
- 사용자 목록에 부서 정보 배지 표시 (녹색 배경)
- 사용자 편집 모달 새로 구현
- 부서명 한글 변환 함수 (AuthAPI.getDepartmentLabel)

 User Management Features:
- 편집 버튼으로 사용자 정보 수정 가능
- 부서, 이름, 권한 실시간 변경
- 사용자 ID는 수정 불가 (읽기 전용)
- 모달 기반 직관적 UI

🔍 Visual Enhancements:
- 부서 정보 아이콘 (fas fa-building)
- 색상 코딩: 부서(녹색), 권한(빨강/파랑)
- 반응형 레이아웃 (flex-1, gap-3)
- 호버 효과 및 트랜지션

🚀 API Integration:
- AuthAPI.getDepartments() - 부서 목록 반환
- AuthAPI.getDepartmentLabel() - 부서명 변환
- AuthAPI.updateUser() - 부서 정보 포함 업데이트
- 기존 createUser API 확장 지원

Expected Result:
 사용자 생성 시 부서 선택 가능
 사용자 목록에 부서 정보 표시
 편집 버튼으로 부서 변경 가능
 5개 부서 분류 시스템 완성
 직관적인 사용자 관리 UI
2025-10-25 13:29:47 +09:00

93 lines
4.1 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 014_add_user_department.sql
-- 사용자 부서 정보 추가
BEGIN;
-- migration_log 테이블 생성 (멱등성)
CREATE TABLE IF NOT EXISTS migration_log (
id SERIAL PRIMARY KEY,
migration_file VARCHAR(255) NOT NULL UNIQUE,
executed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
status VARCHAR(50),
notes TEXT,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 마이그레이션 파일 이름
DO $$
DECLARE
migration_name VARCHAR(255) := '014_add_user_department.sql';
migration_notes TEXT := '사용자 부서 정보 추가: department ENUM 타입 및 users 테이블에 department 컬럼 추가';
current_status VARCHAR(50);
BEGIN
SELECT status INTO current_status FROM migration_log WHERE migration_file = migration_name;
IF current_status IS NULL THEN
RAISE NOTICE '--- 마이그레이션 % 시작 ---', migration_name;
-- department ENUM 타입 생성
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'department_type') THEN
CREATE TYPE department_type AS ENUM (
'production', -- 생산
'quality', -- 품질
'purchasing', -- 구매
'design', -- 설계
'sales' -- 영업
);
RAISE NOTICE '✅ department_type ENUM 타입이 생성되었습니다.';
ELSE
RAISE NOTICE ' department_type ENUM 타입이 이미 존재합니다.';
END IF;
-- users 테이블에 department 컬럼 추가
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'department') THEN
ALTER TABLE users ADD COLUMN department department_type;
RAISE NOTICE '✅ users.department 컬럼이 추가되었습니다.';
ELSE
RAISE NOTICE ' users.department 컬럼이 이미 존재합니다.';
END IF;
-- 인덱스 추가 (부서별 조회 성능 향상)
IF NOT EXISTS (SELECT 1 FROM pg_indexes WHERE tablename = 'users' AND indexname = 'idx_users_department') THEN
CREATE INDEX idx_users_department ON users (department) WHERE department IS NOT NULL;
RAISE NOTICE '✅ idx_users_department 인덱스가 생성되었습니다.';
ELSE
RAISE NOTICE ' idx_users_department 인덱스가 이미 존재합니다.';
END IF;
-- 마이그레이션 검증
DECLARE
col_count INTEGER;
enum_count INTEGER;
idx_count INTEGER;
BEGIN
SELECT COUNT(*) INTO col_count FROM information_schema.columns WHERE table_name = 'users' AND column_name = 'department';
SELECT COUNT(*) INTO enum_count FROM pg_type WHERE typname = 'department_type';
SELECT COUNT(*) INTO idx_count FROM pg_indexes WHERE tablename = 'users' AND indexname = 'idx_users_department';
RAISE NOTICE '=== 마이그레이션 검증 결과 ===';
RAISE NOTICE '추가된 컬럼: %/1개', col_count;
RAISE NOTICE '생성된 ENUM: %/1개', enum_count;
RAISE NOTICE '생성된 인덱스: %/1개', idx_count;
IF col_count = 1 AND enum_count = 1 AND idx_count = 1 THEN
RAISE NOTICE '✅ 마이그레이션이 성공적으로 완료되었습니다!';
INSERT INTO migration_log (migration_file, status, notes) VALUES (migration_name, 'SUCCESS', migration_notes);
ELSE
RAISE EXCEPTION '❌ 마이그레이션 검증 실패!';
END IF;
END;
-- 부서 ENUM 값 확인
RAISE NOTICE '=== 부서 ENUM 값 ===';
PERFORM dblink_exec('dbname=' || current_database(), 'SELECT enumlabel FROM pg_enum WHERE enumtypid = ''department_type''::regtype ORDER BY enumsortorder');
ELSIF current_status = 'SUCCESS' THEN
RAISE NOTICE ' 마이그레이션 %는 이미 성공적으로 실행되었습니다. 스킵합니다.', migration_name;
ELSE
RAISE NOTICE '⚠️ 마이그레이션 %는 이전에 실패했습니다. 수동 확인이 필요합니다.', migration_name;
END IF;
END $$;
COMMIT;