docs: add project docs and test updates

This commit is contained in:
taekyoungc
2026-04-08 00:23:55 +09:00
parent 06fedc866a
commit 06aa401048
238 changed files with 8373 additions and 148 deletions

View File

@@ -0,0 +1,244 @@
# 관리자단 기능 개발 설계서
> 웹 기능목록 CSV(관리자단 PWB-020000) 기준 · Auth 프로젝트와 동일한 방식으로 구현
**참조 CSV**: `docs/종량제 관련 자료/종량제 개발목록/종량제_개발목록_20260127(웹 기능목록) (1).csv`
**참조 구현**: `app/Controllers/Auth.php`, `app/Views/auth/`, `app/Models/MemberModel.php`, `app/Config/Routes.php`
---
## 1. Auth 프로젝트 구조 (참조 패턴)
### 1.1 디렉터리/파일 구조
```
app/
├── Controllers/
│ └── Auth.php # showLoginForm, login, logout, showRegisterForm, register
├── Models/
│ ├── MemberModel.php # 회원 CRUD, findByLoginId
│ └── MemberLogModel.php # 로그인 이력
├── Views/
│ └── auth/
│ ├── login.php # 로그인 폼
│ └── register.php # 회원가입 폼
└── Config/
└── Routes.php # login, logout, register 라우트
```
### 1.2 네이밍 규칙
| 구분 | 규칙 | 예시 |
|------|------|------|
| 컨트롤러 | PascalCase, 단수/역할명 | `Auth`, `Home` |
| 메서드 | camelCase, 동사+명사 | `showLoginForm`, `login` |
| 뷰 폴더 | 컨트롤러명 소문자 | `auth/`, `home/` |
| 뷰 파일 | 소문자+언더스코어 | `login.php`, `register.php` |
| 라우트 URI | 소문자, 케밥 또는 경로 | `login`, `logout`, `register` |
| 모델 | PascalCase + Model | `MemberModel`, `MemberLogModel` |
### 1.3 라우트 패턴 (Auth 기준)
```php
// GET = 폼 표시 (showXxxForm 또는 index)
// POST = 처리 (login, register)
$routes->get('login', 'Auth::showLoginForm');
$routes->post('login', 'Auth::login');
$routes->get('logout', 'Auth::logout');
$routes->get('register', 'Auth::showRegisterForm');
$routes->post('register', 'Auth::register');
```
### 1.4 컨트롤러 메서드 패턴
- **폼 표시**: `showXxxForm()``return view('auth/xxx');`
- **처리**: `xxx()` → 유효성 검사 → Model 호출 → `redirect()->to(...)->with(...)`
- **유효성**: `$this->validate($rules, $messages)` 사용
- **에러 시**: `redirect()->back()->withInput()->with('errors', ...)`
### 1.5 뷰 공통 사항
- `base_url()`, `csrf_field()`, `esc()`, `old()` 사용
- 플래시: `session()->getFlashdata('success')`, `getFlashdata('error')`, `getFlashdata('errors')`
---
## 2. 관리자단 기능 목록 (CSV 매핑)
| No | SFR 2레벨 | SFR 3레벨 | 기능 ID | 기능명 | 비고 |
|----|-----------|-----------|---------|--------|------|
| 4 | PWB-020100 | PWB-020101 | PWB-020101-001 | 사용자 권한 관리 | 권한 등록/수정/삭제, 역할별 설명 |
| 5 | PWB-020200 | PWB-020201 | PWB-020201-001 | 사용자 관리 | 사용자 등록/수정/삭제(삭제상태 5년 유지) |
| 6 | PWB-020300 | PWB-020301 | PWB-020301-001 | 사용자 로그인 이력 확인 | 기간 지정 조회 |
| 7 | PWB-020300 | PWB-020301 | PWB-020301-001 | 사용자 권한 승인 | 브라우저 회원가입 시 권한 승인 루틴 |
| 8 | PWB-020400 | PWB-020401 | PWB-020401-001 | 메뉴 관리 | 메뉴 등록/수정/삭제, "전체 메뉴" 시트 참고 |
| 9 | PWB-020400 | PWB-020401 | PWB-020401-001 | 메뉴 별 권한 설정 | 메뉴별 사용자 접근 권한 설정 |
---
## 3. 관리자단 구현 설계 (Auth 방식 적용)
### 3.1 URL/라우트 구조
관리자 전용 prefix `admin` 사용, 인증 필터 적용 대상.
```
admin/ # 관리자 대시보드 (선택)
admin/users # 사용자 관리 목록 (GET)
admin/users/create # 사용자 등록 폼 (GET)
admin/users/store # 사용자 등록 처리 (POST)
admin/users/(:num)/edit # 사용자 수정 폼 (GET)
admin/users/(:num)/update # 사용자 수정 처리 (POST)
admin/users/(:num)/delete # 사용자 삭제(상태변경) (POST)
admin/roles # 사용자 권한 관리 (목록/등록/수정/삭제)
admin/roles/create
admin/roles/store
admin/roles/(:num)/edit
admin/roles/(:num)/update
admin/roles/(:num)/delete
admin/access # 사용자 접근 관리 (하위: 로그인이력, 권한승인)
admin/access/login-history # 로그인 이력 조회 (GET, 기간 조건)
admin/access/approvals # 권한 승인 대기 목록 (GET)
admin/access/approvals/(:num) # 권한 승인/반려 처리 (POST)
admin/menus # 메뉴 관리 (목록/등록/수정/삭제)
admin/menus/create
admin/menus/store
admin/menus/(:num)/edit
admin/menus/(:num)/update
admin/menus/(:num)/delete
admin/menus/permissions # 메뉴별 권한 설정
```
### 3.2 컨트롤러 구성 (Auth와 동일 패턴)
| 컨트롤러 | 파일 | 역할 | 주요 메서드 |
|----------|------|------|-------------|
| Admin\Dashboard | `Controllers/Admin/Dashboard.php` | 관리자 첫 화면 | `index()` |
| Admin\User | `Controllers/Admin/User.php` | 사용자 관리 | `index()`, `create()`, `store()`, `edit($id)`, `update($id)`, `delete($id)` |
| Admin\Role | `Controllers/Admin/Role.php` | 사용자 권한 관리 | `index()`, `create()`, `store()`, `edit($id)`, `update($id)`, `delete($id)` |
| Admin\Access | `Controllers/Admin/Access.php` | 접근 관리 | `loginHistory()`, `approvals()`, `approve($id)`, `reject($id)` |
| Admin\Menu | `Controllers/Admin/Menu.php` | 메뉴 관리 | `index()`, `create()`, `store()`, `edit($id)`, `update($id)`, `delete($id)`, `permissions()` |
- **목록/폼**: GET → `view('admin/xxx/yyy')`
- **저장/수정/삭제**: POST → `validate` → Model → `redirect()->to(...)->with(...)`
- **에러**: `redirect()->back()->withInput()->with('errors', ...)` (Auth와 동일)
### 3.3 모델 구성
| 모델 | 파일 | 테이블 | 비고 |
|------|------|--------|------|
| MemberModel | (기존) | member | 사용자 관리에서 재사용 |
| MemberLogModel | (기존) | member_log | 로그인 이력에서 재사용 |
| RoleModel | `Models/RoleModel.php` | role (신규) | 권한/역할 마스터 |
| MenuModel | `Models/MenuModel.php` | menu (신규) | 메뉴 마스터 |
| MenuPermissionModel | `Models/MenuPermissionModel.php` | menu_permission (신규) | 메뉴별 권한 |
- `member.mb_level``Roles` 설정과 연동 유지.
- 권한 테이블(role)이 있으면 `member.mb_level`과 매핑 또는 확장.
### 3.4 뷰 디렉터리 구조
```
app/Views/
└── admin/
├── layout.php # 관리자 공통 레이아웃 (선택)
├── dashboard/
│ └── index.php
├── user/
│ ├── index.php # 목록
│ ├── create.php # 등록 폼
│ └── edit.php # 수정 폼
├── role/
│ ├── index.php
│ ├── create.php
│ └── edit.php
├── access/
│ ├── login_history.php # 로그인 이력 조회
│ └── approvals.php # 권한 승인 목록/처리
└── menu/
├── index.php
├── create.php
├── edit.php
└── permissions.php # 메뉴별 권한 설정
```
- 공통: `base_url()`, `csrf_field()`, `esc()`, `old()`, 플래시 메시지 (Auth와 동일).
### 3.5 인증/권한
- **관리자 구분**: `mb_level``Roles::LEVEL_SUPER_ADMIN` 또는 `LEVEL_LOCAL_ADMIN`인 경우만 `admin/*` 접근 허용.
- **필터**: `app/Config/Filters.php``adminAuth` 등 필터 등록 후, `admin/*` before에 적용.
- **필터 내부**: `session()->get('logged_in')``session()->get('mb_level')` 확인 후 미인증/비관리자면 `redirect()->to('login')` 또는 전용 에러 페이지.
---
## 4. Routes.php 등록 예시
```php
// 관리자단 (admin prefix, 인증 필터 적용)
$routes->group('admin', ['filter' => 'adminAuth'], static function ($routes) {
$routes->get('/', 'Admin\Dashboard::index');
$routes->get('users', 'Admin\User::index');
$routes->get('users/create', 'Admin\User::create');
$routes->post('users/store', 'Admin\User::store');
$routes->get('users/(:num)/edit', 'Admin\User::edit/$1');
$routes->post('users/(:num)/update', 'Admin\User::update/$1');
$routes->post('users/(:num)/delete', 'Admin\User::delete/$1');
$routes->get('roles', 'Admin\Role::index');
$routes->get('roles/create', 'Admin\Role::create');
$routes->post('roles/store', 'Admin\Role::store');
$routes->get('roles/(:num)/edit', 'Admin\Role::edit/$1');
$routes->post('roles/(:num)/update', 'Admin\Role::update/$1');
$routes->post('roles/(:num)/delete', 'Admin\Role::delete/$1');
$routes->get('access/login-history', 'Admin\Access::loginHistory');
$routes->get('access/approvals', 'Admin\Access::approvals');
$routes->post('access/approvals/(:num)', 'Admin\Access::approve/$1');
$routes->get('menus', 'Admin\Menu::index');
$routes->get('menus/create', 'Admin\Menu::create');
$routes->post('menus/store', 'Admin\Menu::store');
$routes->get('menus/(:num)/edit', 'Admin\Menu::edit/$1');
$routes->post('menus/(:num)/update', 'Admin\Menu::update/$1');
$routes->post('menus/(:num)/delete', 'Admin\Menu::delete/$1');
$routes->get('menus/permissions', 'Admin\Menu::permissions');
$routes->post('menus/permissions', 'Admin\Menu::savePermissions');
});
```
- `adminAuth`는 별도 필터 클래스에서 로그인 + 관리자 레벨 체크.
---
## 5. 구현 순서 제안
1. **관리자 필터**
- `Filters.php``adminAuth` 등록, 필터 클래스에서 `logged_in` + `mb_level` 검사.
2. **사용자 관리 (PWB-020201)**
- `Admin\User` 컨트롤러, `admin/user` 뷰, 기존 `MemberModel` 활용.
- 삭제는 상태값 변경, 5년 유지 정책은 정책/스케줄로 처리.
3. **사용자 권한 관리 (PWB-020101)**
- `Role` 테이블/모델 정비, `Admin\Role` 컨트롤러·뷰.
- `member.mb_level`과 역할 매핑 유지.
4. **사용자 접근 관리 (PWB-020301)**
- 로그인 이력: `Admin\Access::loginHistory`, 기간 조건, `MemberLogModel` 조회.
- 권한 승인: 대기 목록용 테이블/플로우 정한 뒤 `approvals`, `approve`/`reject` 구현.
5. **메뉴 관리 (PWB-020401)**
- `menu`, `menu_permission` 테이블, `MenuModel`, `MenuPermissionModel`.
- `Admin\Menu` CRUD + `permissions`/`savePermissions`.
---
## 6. 정리
- **웹 기능목록 CSV**의 관리자단(No 4~9)을 **Auth와 같은 방식**으로 구현한다.
- **컨트롤러**: GET은 폼/목록, POST는 처리; 유효성 검사 후 Model 호출, 실패 시 `redirect()->back()->withInput()->with('errors', ...)`.
- **뷰**: `auth`와 동일하게 `base_url()`, `csrf_field()`, `esc()`, `old()`, 플래시 메시지 사용.
- **라우트**: `admin` 그룹 + 필터로 인증/권한 통제.
- **모델**: 기존 Member/MemberLog 활용하고, 권한·메뉴·메뉴권한은 신규 테이블/모델로 추가.
이 설계에 따라 단위 기능별로 Controller → Model → View → Route 순으로 구현하면 Auth와 일관된 관리자단을 만들 수 있다.