init: SR System — Helpdesk & ITAM Portal

This commit is contained in:
pray4skylark
2026-06-02 13:50:39 +09:00
commit 832c9f096f
262 changed files with 30470 additions and 0 deletions
+220
View File
@@ -0,0 +1,220 @@
# 데이터베이스 설계서 (Database Schema)
## 1. 공통 원칙
- **Soft Delete:** 모든 테이블 `is_deleted CHAR(1) DEFAULT 'N'` — 물리 삭제 금지
- **Audit:** 모든 테이블 `created_at TIMESTAMP`, `updated_at TIMESTAMP` — 감사 로그
- **ID 생성:** `Sequence` + `allocationSize=50` — Oracle 11g 최적화
- **공통 코드:** 드롭다운/상태값은 Common Code 테이블에서 동적 관리
## 2. 공통 코드 인프라
### TB_COMMON_CODE_GROUP (대분류)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| GROUP_CODE | VARCHAR2(50) | PK | 'PROJECT_TYPE', 'ISSUE_STATUS' |
| GROUP_NAME | VARCHAR2(100) | NOT NULL | '프로젝트 유형', '이슈 상태' |
| DESCRIPTION | CLOB | NULLABLE | |
### TB_COMMON_CODE (소분류)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| CODE_ID | NUMBER | PK (Seq) | 시퀀스 자동 증가 |
| GROUP_CODE | VARCHAR2(50) | FK | TB_COMMON_CODE_GROUP 참조 |
| CODE_VALUE | VARCHAR2(50) | UNIQUE, NOT NULL | 내부 로직 코드 ('BUG', 'SI') |
| CODE_NAME | VARCHAR2(100) | NOT NULL | 화면 표시용 ('결함 및 장애') |
| OPTION_VAL_1 | VARCHAR2(100) | NULLABLE | UI 뱃지 색상 |
| OPTION_VAL_2 | VARCHAR2(100) | NULLABLE | SLA 가중치 |
| OPTION_VAL_3 | VARCHAR2(100) | NULLABLE | 연동 키 |
| SORT_ORDER | NUMBER | DEFAULT 1 | 노출 순서 |
| IS_ACTIVE | CHAR(1) | DEFAULT 'Y' | 'Y'/'N' |
| DESCRIPTION | CLOB | NULLABLE | |
**공통 코드 예시 데이터:**
| GROUP_CODE | CODE_VALUE | CODE_NAME | OPTION_VAL_1 (색상) | OPTION_VAL_2 (SLA) |
|------------|-----------|-----------|---------------------|--------------------|
| ISSUE_STATUS | OPEN | 접수 | blue | 48h |
| ISSUE_STATUS | IN_PROGRESS | 처리중 | orange | - |
| ISSUE_STATUS | RESOLVED | 해결 | green | - |
| ISSUE_STATUS | CLOSED | 종료 | gray | - |
| PRIORITY | CRITICAL | 긴급 | red | 4h |
| PRIORITY | HIGH | 높음 | orange | 24h |
| PRIORITY | NORMAL | 보통 | blue | 72h |
| PRIORITY | LOW | 낮음 | gray | 120h |
## 3. 도메인 테이블 명세
### TB_EMPLOYEE (직원 마스터)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| EMP_ID | NUMBER | PK (Seq) | 시스템 고유 사번 |
| LOGIN_ID | VARCHAR2(50) | UNIQUE, NOT NULL | 인증용 ID |
| PASSWORD | VARCHAR2(255) | NOT NULL | BCrypt 암호화 |
| NAME | VARCHAR2(50) | NOT NULL | 실명 |
| EMAIL | VARCHAR2(100) | UNIQUE, NOT NULL | 회사 이메일 |
| ROLE_CODE | VARCHAR2(20) | NOT NULL | ADMIN / MANAGER / EMPLOYEE |
| EMP_STATUS | VARCHAR2(20) | NOT NULL | ACTIVE / ON_LEAVE / RESIGNED |
| DISPATCH_STATUS | VARCHAR2(20) | NOT NULL | WAITING / DISPATCHED |
| JOINED_DATE | DATE | NOT NULL | 입사일 |
| LEFT_DATE | DATE | NULLABLE | 퇴사일 |
| IS_DELETED | CHAR(1) | DEFAULT 'N' | Soft Delete |
### TB_PROJECT (프로젝트 마스터)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| PROJECT_ID | NUMBER | PK (Seq) | |
| PROJECT_TYPE | VARCHAR2(20) | NOT NULL | SI / SM / MIGRATION |
| PROJECT_NAME | VARCHAR2(150) | NOT NULL | 공식 프로젝트명 |
| CONTRACT_COMPANY | VARCHAR2(100) | NOT NULL | 원청 계약사 |
| END_USER_COMPANY | VARCHAR2(100) | NOT NULL | 최종 고객사 |
| CONTRACT_TYPE | VARCHAR2(20) | NOT NULL | TURN_KEY / MM |
| STATUS | VARCHAR2(20) | NOT NULL | PREPARING / ONGOING / COMPLETED / HOLD |
| START_DATE | DATE | NOT NULL | |
| END_DATE | DATE | NOT NULL | |
| WORK_LOCATION_TYPE | VARCHAR2(20) | NOT NULL | ON_SITE / REMOTE / HYBRID |
| WORK_ADDRESS | VARCHAR2(255) | NOT NULL | 파견지 물리 주소 |
| TECH_ENVIRONMENT | CLOB | NULLABLE | 기술 스택 묶음 |
| MAIN_TASK_DESC | CLOB | NOT NULL | 구축 목적 요약 |
| CLIENT_PM_NAME | VARCHAR2(50) | NULLABLE | |
| CLIENT_PM_CONTACT | VARCHAR2(100) | NULLABLE | |
| INTERNAL_MANAGER_ID | NUMBER | FK → TB_EMPLOYEE | 내부 영업 담당자 |
### TB_DISPATCH_HISTORY (파견 투입 이력 = 포트폴리오)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| DISPATCH_ID | NUMBER | PK (Seq) | 포트폴리오 라인 단건 |
| EMP_ID | NUMBER | FK → TB_EMPLOYEE | |
| PROJECT_ID | NUMBER | FK → TB_PROJECT | |
| START_DATE | DATE | NOT NULL | 실제 투입일 |
| END_DATE | DATE | NULLABLE | NULL=현재 투입중 |
| ROLE_TITLE | VARCHAR2(50) | NOT NULL | PM / PL / BACKEND / FRONTEND / DBA |
| CONTRIBUTION_RATE | NUMBER | DEFAULT 100 | 투입률(%) |
| INDIVIDUAL_TECH | VARCHAR2(255) | NOT NULL | 개인이 직접 사용한 기술 |
| PERFORMED_TASKS | CLOB | NOT NULL | 상세 수행 업무 |
| ACHIEVEMENTS | CLOB | NULLABLE | 트러블슈팅 사례 |
| CLIENT_FEEDBACK | CLOB | NULLABLE | 고객사 PM 평가 (본사 은닉) |
| INTERNAL_RATING | NUMBER | NULLABLE | 1~5 |
### TB_ISSUE_TICKET (SR 티켓 마스터)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| TICKET_ID | NUMBER | PK (Seq) | 고유 식별 번호 |
| PROJECT_ID | NUMBER | FK → TB_PROJECT | 발생 현장 |
| REQUESTER_ID | NUMBER | FK → TB_EMPLOYEE | SOS 발행 직원 |
| ASSIGNEE_ID | NUMBER | FK → TB_EMPLOYEE | 본사 해결사 |
| CATEGORY | VARCHAR2(30) | NOT NULL | BUG / FEATURE / SUPPORT / QA |
| PRIORITY | VARCHAR2(20) | NOT NULL | LOW / NORMAL / HIGH / CRITICAL |
| TITLE | VARCHAR2(255) | NOT NULL | |
| DESCRIPTION | CLOB | NOT NULL | 에러 재현 경로 |
| STATUS | VARCHAR2(20) | NOT NULL | OPEN / ASSIGNED / IN_PROGRESS / RESOLVED / CLOSED |
| DUE_DATE | DATE | NULLABLE | SLA 데드라인 |
| RESOLVED_AT | TIMESTAMP | NULLABLE | 해결 일시 |
| RESOLUTION_NOTE | CLOB | NULLABLE | 조치 내역 |
| SLA_WARN_FLAG | CHAR(1) | DEFAULT 'N' | 배치 알림 중복 방지 |
### TB_TICKET_COMMENT (티켓 타임라인 댓글)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| COMMENT_ID | NUMBER | PK (Seq) | |
| TICKET_ID | NUMBER | FK → TB_ISSUE_TICKET | |
| USER_ID | NUMBER | FK → TB_EMPLOYEE | 작성자 |
| COMMENT_TEXT | CLOB | NOT NULL | 분석 의견 |
| ATTACHED_FILE_URL | VARCHAR2(255) | NULLABLE | 첨부파일 경로 |
### TB_WORK_REPORT (업무 보고서)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| REPORT_ID | NUMBER | PK (Seq) | |
| DISPATCH_ID | NUMBER | FK → TB_DISPATCH_HISTORY | |
| USER_ID | NUMBER | FK → TB_EMPLOYEE | 작성자 |
| REPORT_TYPE | VARCHAR2(20) | NOT NULL | DAILY / WEEKLY / MONTHLY / RETURN |
| TARGET_DATE | DATE | NOT NULL | 기준일 |
| COMPLETED_TASKS | CLOB | NOT NULL | SR 연동 자동 취합 영역 |
| PLANNED_TASKS | CLOB | NOT NULL | 차기 계획 |
| ISSUES_AND_RISKS | CLOB | NULLABLE | 특이사항 |
| SUPPORT_REQUESTED | CLOB | NULLABLE | 본사 지원 요청 |
| STATUS | VARCHAR2(20) | NOT NULL | DRAFT / SUBMITTED / APPROVED / REJECTED |
| REVIEWER_ID | NUMBER | FK → TB_EMPLOYEE | 결재자 |
| REVIEW_COMMENT | CLOB | NULLABLE | 반려 사유 |
### TB_EQUIPMENT (IT 자산 마스터)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| EQUIPMENT_ID | NUMBER | PK (Seq) | |
| EQUIPMENT_TYPE | VARCHAR2(50) | NOT NULL | LAPTOP / MONITOR / TEST_DEVICE / ACCESSORY |
| MANUFACTURER | VARCHAR2(50) | NOT NULL | Apple / LG / Samsung |
| MODEL_NAME | VARCHAR2(100) | NOT NULL | MacBook Pro 16 M3 |
| SERIAL_NUMBER | VARCHAR2(100) | UNIQUE, NOT NULL | 기기 고유 바코드 |
| ASSET_CODE | VARCHAR2(50) | UNIQUE, NOT NULL | HQ-LP-2026-0001 |
| SPECIFICATIONS | CLOB (JSON) | NOT NULL | JSON 다품종 사양 |
| STATUS | VARCHAR2(20) | NOT NULL | AVAILABLE / IN_USE / REPAIRING / RETIRED / LOST |
| PURCHASE_DATE | DATE | NOT NULL | |
| WARRANTY_EXP_DATE | DATE | NOT NULL | |
| VERSION | NUMBER | DEFAULT 0 | **낙관적 락** |
### TB_EQUIPMENT_ASSIGNMENT (장비 지급/반납 이력)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| ASSIGNMENT_ID | NUMBER | PK (Seq) | |
| EQUIPMENT_ID | NUMBER | FK → TB_EQUIPMENT | |
| USER_ID | NUMBER | FK → TB_EMPLOYEE | 지급 대상 |
| ASSIGNED_DATE | DATE | NOT NULL | 출고일 |
| RETURNED_DATE | DATE | NULLABLE | NULL=사용중 |
| COND_ON_ASSIGN | VARCHAR2(255) | NOT NULL | 지급시 상태 |
| COND_ON_RETURN | VARCHAR2(255) | NULLABLE | 반납시 상태 |
### TB_EQUIPMENT_MAINTENANCE (장비 유지보수 이력)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| MAINTENANCE_ID | NUMBER | PK (Seq) | |
| EQUIPMENT_ID | NUMBER | FK → TB_EQUIPMENT | |
| REPORTED_BY | NUMBER | FK → TB_EMPLOYEE | 고장 접수자 |
| MAINTENANCE_TYPE | VARCHAR2(30) | NOT NULL | REPAIR / UPGRADE / INSPECTION / DISPOSAL |
| ISSUE_DESCRIPTION | CLOB | NOT NULL | 고장 증상 |
| ACTION_TAKEN | CLOB | NULLABLE | 조치 내역 |
| COST | NUMBER | DEFAULT 0 | 발생 비용 |
| REPORTED_DATE | DATE | NOT NULL | |
| RESOLVED_DATE | DATE | NULLABLE | |
### TB_TRAINING_PROGRESS (교육 진도)
| 컬럼 | 타입 | 제약 | 설명 |
|------|------|------|------|
| PROGRESS_ID | NUMBER | PK (Seq) | |
| USER_ID | NUMBER | FK → TB_EMPLOYEE | |
| COURSE_NAME | VARCHAR2(100) | NOT NULL | 과정명 |
| PROGRESS_RATE | NUMBER | DEFAULT 0 | 0~100 |
| STATUS | VARCHAR2(20) | NOT NULL | NOT_STARTED / ONGOING / COMPLETED |
## 4. ER 관계 요약
```
TB_EMPLOYEE ──1:N── TB_DISPATCH_HISTORY ──N:1── TB_PROJECT
└──1:N── TB_WORK_REPORT
│
└──1:N── TB_ISSUE_TICKET ──1:N── TB_TICKET_COMMENT
│
└──1:N── TB_EQUIPMENT_ASSIGNMENT ──N:1── TB_EQUIPMENT
│ └──1:N── TB_EQUIPMENT_MAINTENANCE
└──1:N── TB_TRAINING_PROGRESS
```
## 5. DDL 생성 참고 사항
- 모든 `SEQUENCE`: `INCREMENT BY 50` (Hibernate `allocationSize=50`과 정합)
- 모든 시퀀스명 컨벤션: `SEQ_TB_XXX`
- 모든 PK 컬럼: `NUMBER` 타입, 시퀀스 자동 할당
- `SPECIFICATIONS` (TB_EQUIPMENT): `CLOB`에 JSON 문자열 저장, 애플리케이션 레벨 직렬화/역직렬화
- 물리 스키마 DDL 파일: `src/main/resources/ddl/oracle_11g_schema.sql` 별도 관리