데이터베이스 설계서 (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' |
배치 알림 중복 방지 |
| 컬럼 |
타입 |
제약 |
설명 |
| 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 관계 요약
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 별도 관리