React 부서관리 기능 보완 계획
작성일: 2026-03-12
목적: React 부서관리(/hr/department-management)를 MNG 부서관리와 동일 기능 수준으로 보완
기준 문서: docs/rules/department-tree-api.md, MNG DepartmentController 분석
상태: 🔄 Phase 1~2 승인 완료 — 작업 대기
📍 현재 진행 상태
| 항목 |
내용 |
| 마지막 완료 작업 |
Phase 1~2 구현 완료 |
| 다음 작업 |
검증 (브라우저 테스트) |
| 진행률 |
7/7 (100%) — Phase 1~2 완료 |
| 마지막 업데이트 |
2026-03-13 |
1. 개요
1.1 배경
MNG(mng.sam.kr/departments)와 React(dev.sam.kr/hr/department-management)에 동일한 부서관리 기능이 존재하지만, React 쪽이 기능적으로 많이 부족한 상태. 관리 플랫폼이 달라도 같은 수준의 CRUD와 관리 기능을 제공해야 함.
1.2 현재 상태 비교
React에 누락된 기능:
| # |
누락 기능 |
심각도 |
비고 |
| 1 |
부서 코드(code) 필드 |
🔴 |
폼에 아예 없음 |
| 2 |
설명(description) 필드 |
🟡 |
폼에 아예 없음 |
| 3 |
정렬순서(sort_order) 필드 |
🟡 |
폼에 아예 없음 |
| 4 |
활성상태(is_active) 관리 |
🔴 |
폼/리스트 모두 없음 |
| 5 |
검색 필터링 |
🔴 |
UI만 있고 실제 동작 안함 |
| 6 |
상태 필터 (활성/비활성) |
🟡 |
없음 |
| 7 |
Soft Delete 복원 |
🟡 |
없음 |
| 8 |
영구삭제 (슈퍼관리자) |
🟢 |
없음 (admin 전용이라 후순위 가능) |
| 9 |
삭제 상태 필터 |
🟡 |
없음 |
| 10 |
트리 리스트에 상태 뱃지 |
🟡 |
없음 |
| 11 |
트리 리스트에 부서코드 표시 |
🟡 |
없음 |
React가 이미 잘 된 부분:
- ✅ 트리 구조 시각화 (펼치기/접기)
- ✅ 통계 카드
- ✅ 행 단위 하위부서 추가 버튼
- ✅ 전체 선택/다중 선택
1.3 성공 기준
1.4 변경 승인 정책
| 분류 |
예시 |
승인 |
| ✅ 즉시 가능 |
타입 확장, 필드 추가, UI 컴포넌트 수정 |
불필요 |
| ⚠️ 컨펌 필요 |
API 호출 추가, 새 서버액션 추가 |
필수 |
| 🔴 금지 |
DB 스키마 변경, API 컨트롤러 수정 |
별도 협의 |
1.5 기준 원칙
1.6 준수 규칙
docs/frontend/v1/02-api-pattern.md — API 통신 패턴
docs/frontend/v1/05-form-pattern.md — 폼 패턴 (Zod + react-hook-form)
docs/frontend/v1/03-component-design.md — 컴포넌트 설계
docs/rules/department-tree-api.md — 부서 트리 API 규칙
docs/dev/standards/quality-checklist.md — 품질 체크리스트
2. 대상 범위
2.1 Phase 1: 타입 & 폼 필드 보강 (핵심)
| # |
작업 항목 |
상태 |
비고 |
| 1.1 |
types.ts 확장 — code, description, isActive, sortOrder 추가 |
✅ |
Department + DepartmentFormData + StatusFilter 추가 |
| 1.2 |
actions.ts — 이미 전체 필드 매핑 완료 확인 |
✅ |
변경 불필요 (ApiDepartment→DepartmentRecord 이미 완전) |
| 1.3 |
DepartmentDialog 폼 필드 추가 — code, description, sortOrder, isActive |
✅ |
Zod v4 + react-hook-form 적용 |
| 1.4 |
DepartmentTreeItem에 코드, 상태 뱃지 표시 |
✅ |
Badge 컴포넌트 활용 |
2.2 Phase 2: 검색 & 필터 (실질 기능)
| # |
작업 항목 |
상태 |
비고 |
| 2.1 |
DepartmentToolbar 검색 실제 동작 구현 |
✅ |
클라이언트사이드 트리 필터링 (filterDepartmentTree) |
| 2.2 |
상태 필터 추가 (전체/활성/비활성) |
✅ |
Select 드롭다운 |
| 2.3 |
필터 적용 로직 (index.tsx) |
✅ |
filteredDepartments useMemo |
2.3 Phase 3: 삭제 & 복원 — ⏭️ 추후 작업 (현재 MNG에서 관리)
결정: 삭제/복원은 현재 MNG에서 관리. 추후 React에서 직접 관리 시 진행.
전제조건: V1 API에 restore 엔드포인트 추가, tree API에 with_trashed 파라미터 추가 필요.
| # |
작업 항목 |
상태 |
비고 |
| 3.1 |
삭제 상태 필터 추가 (일반/삭제포함/삭제만) |
⏭️ |
API 변경 필요: tree에 with_trashed 파라미터 |
| 3.2 |
삭제된 부서 표시 UI (배경색, 뱃지) |
⏭️ |
React만 |
| 3.3 |
복원 기능 — actions.ts + 복원 버튼 |
⏭️ |
API 추가 필요: POST /v1/departments/{id}/restore |
| 3.4 |
일괄 복원 |
⏭️ |
API 추가 필요 |
2.4 Phase 4: 편의 기능 — ⏭️ 추후 작업
| # |
작업 항목 |
상태 |
비고 |
| 4.1 |
통계 카드 확장 (활성/비활성 카운트) |
⏭️ |
React만, API 불필요 |
| 4.2 |
영구삭제 (슈퍼관리자 전용) |
⏭️ |
API 추가 필요 |
| 4.3 |
부서 이동 (parentId 변경) UI |
⏭️ |
API는 이미 지원 (PATCH parent_id) |
3. 작업 절차
3.1 단계별 절차
4. 상세 작업 내용
4.1 Phase 1 상세
1.1 types.ts 확장
1.3 DepartmentDialog 폼 — Zod 스키마
1.4 DepartmentTreeItem UI 예시
4.2 Phase 3 상세 — ⏭️ 추후 작업 시 참고
2026-03-13 확인 완료: V1 API에 restore, force-delete, with_trashed 모두 없음.
Phase 3 진행 시 API 변경 필수 (api/ 저장소).
필요한 API 변경:
POST /v1/departments/{id}/restore — 라우트 + 컨트롤러 + 서비스 추가
GET /v1/departments/tree?with_trashed=1 — tree()에 withTrashed 스코프 추가
- Department 모델
$hidden에서 deleted_at 조건부 노출
5. 컨펌 대기 목록
| # |
항목 |
변경 내용 |
영향 범위 |
상태 |
| 1 |
Phase 1~2 진행 |
React만 수정, API 변경 없음 |
react/ |
✅ 승인됨 |
| 2 |
Phase 3~4 보류 |
추후 MNG→React 이관 시 진행 (API 변경 필요) |
api/ + react/ |
⏭️ 보류 |
6. 변경 이력
| 날짜 |
항목 |
변경 내용 |
파일 |
승인 |
| 2026-03-12 |
- |
계획 문서 초안 작성 |
- |
- |
7. 참고 문서
- 부서 트리 API 규칙:
docs/rules/department-tree-api.md
- 프론트엔드 API 패턴:
docs/frontend/v1/02-api-pattern.md
- 프론트엔드 폼 패턴:
docs/frontend/v1/05-form-pattern.md
- 프론트엔드 컴포넌트 설계:
docs/frontend/v1/03-component-design.md
- 품질 체크리스트:
docs/dev/standards/quality-checklist.md
참고 소스 경로
React (수정 대상):
MNG (참고용):
API (확인 대상):
8. 일정 산정
| Phase |
작업량 |
수정 범위 |
비고 |
| Phase 1 |
중간 |
React 4개 파일 |
API 변경 없음 |
| Phase 2 |
가벼움 |
React 2개 파일 |
API 변경 없음 |
| Phase 3 |
무거움 |
API 4개 + React 4개 파일 |
⏭️ 추후 |
| Phase 4 |
가벼움 |
React 2~3개 파일 |
⏭️ 추후 |
현재 스코프: Phase 1 → Phase 2 (순차, React만 수정)
수정 대상 파일: types.ts, actions.ts, DepartmentDialog.tsx, DepartmentTreeItem.tsx, DepartmentToolbar.tsx, index.tsx
9. 검증 결과
작업 완료 후 이 섹션에 검증 결과 추가
9.1 테스트 체크리스트
| 테스트 항목 |
예상 결과 |
실제 결과 |
상태 |
| 부서 생성 (전체 필드) |
code, name, description, sortOrder, isActive 저장 |
|
⏳ |
| 부서 수정 (전체 필드) |
모든 필드 수정 반영 |
|
⏳ |
| 부서 코드 중복 검증 |
에러 메시지 표시 |
|
⏳ |
| 검색 (이름) |
매칭 부서만 트리에 표시 |
|
⏳ |
| 검색 (코드) |
매칭 부서만 트리에 표시 |
|
⏳ |
| 상태 필터 (활성만) |
비활성 부서 숨김 |
|
⏳ |
| 상태 필터 (비활성만) |
활성 부서 숨김 |
|
⏳ |
| 삭제된 부서 표시 |
빨간 배경 + "삭제됨" 뱃지 |
|
⏳ |
| 삭제된 부서 복원 |
정상 복원, 트리 갱신 |
|
⏳ |
| 트리 펼치기/접기 |
기존 기능 유지 |
|
⏳ |
| 전체 선택/해제 |
기존 기능 유지 |
|
⏳ |
9.2 성공 기준 달성 현황
| 기준 |
달성 |
비고 |
| MNG CRUD 동일 수준 |
⏳ |
|
| 전체 필드 폼 포함 |
⏳ |
|
| 검색/필터 동작 |
⏳ |
|
| 삭제 부서 복원 가능 |
⏳ |
|
| 트리 리스트 정보 표시 |
⏳ |
|
10. 자기완결성 점검 결과
10.1 체크리스트 검증
| # |
검증 항목 |
상태 |
비고 |
| 1 |
작업 목적이 명확한가? |
✅ |
1.1 배경 |
| 2 |
성공 기준이 정의되어 있는가? |
✅ |
1.3 성공 기준 |
| 3 |
작업 범위가 구체적인가? |
✅ |
섹션 2 전체 |
| 4 |
의존성이 명시되어 있는가? |
✅ |
컨펌 대기 목록 |
| 5 |
참고 파일 경로가 정확한가? |
✅ |
섹션 7 |
| 6 |
단계별 절차가 실행 가능한가? |
✅ |
섹션 3 |
| 7 |
검증 방법이 명시되어 있는가? |
✅ |
섹션 9 |
| 8 |
모호한 표현이 없는가? |
✅ |
|
10.2 새 세션 시뮬레이션 테스트
| 질문 |
답변 가능 |
참조 섹션 |
| Q1. 이 작업의 목적은 무엇인가? |
✅ |
1.1 배경 |
| Q2. 어디서부터 시작해야 하는가? |
✅ |
3.1 단계별 절차 |
| Q3. 어떤 파일을 수정해야 하는가? |
✅ |
7. 참고 소스 경로 |
| Q4. 작업 완료 확인 방법은? |
✅ |
9. 검증 결과 |
| Q5. 막혔을 때 참고 문서는? |
✅ |
7. 참고 문서 |
이 문서는 /plan 스킬로 생성되었습니다.