221 lines
9.8 KiB
Markdown
221 lines
9.8 KiB
Markdown
# 데이터베이스 설계서 (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` 별도 관리
|