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