# [Specification] GUARDiA 데이터베이스 스키마 설계서 > **DBMS:** PostgreSQL 15+ > **원칙:** root 계정 금지. 전용 서비스 계정 사용. 비밀번호 컬럼 AES-256 암호화 필수. --- ## 1. 인프라 자산 영역 (CMDB) ### TB_INST_META (관공서 마스터) ```sql CREATE TABLE TB_INST_META ( inst_id VARCHAR(20) PRIMARY KEY, -- 기관 코드 (예: MOF, MOIS) inst_name VARCHAR(100) NOT NULL, -- 기관명 (예: 기획재정부) pm_contact VARCHAR(50), -- 담당 PM 사번 phone VARCHAR(20), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### TB_SERVER_INFO (서버 노드 마스터) ```sql CREATE TABLE TB_SERVER_INFO ( server_id VARCHAR(30) PRIMARY KEY, -- 서버 고유 ID (예: MOF-WAS-01) inst_id VARCHAR(20) REFERENCES TB_INST_META(inst_id), system_name VARCHAR(100) NOT NULL, -- 업무 시스템명 layer VARCHAR(10) NOT NULL, -- WEB | WAS | DB | ESB hostname VARCHAR(100), ip_address VARCHAR(45) NOT NULL, ssh_port INT DEFAULT 22, ftp_path VARCHAR(255), -- 배포 기본 경로 os_user VARCHAR(50), -- SSH 접속 계정 os_pw_enc TEXT, -- AES-256 암호화된 비밀번호 os_type VARCHAR(20) DEFAULT 'LINUX', -- LINUX | WINDOWS status VARCHAR(20) DEFAULT 'ACTIVE', last_check TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_server_inst ON TB_SERVER_INFO(inst_id, layer); ``` ### TB_SYSTEM_OWNER (시스템 담당자 매핑) ```sql CREATE TABLE TB_SYSTEM_OWNER ( system_id VARCHAR(30) PRIMARY KEY, inst_id VARCHAR(20) REFERENCES TB_INST_META(inst_id), owner_id VARCHAR(50) NOT NULL, -- 1순위 승인권자 사번 deputy_id VARCHAR(50), -- 2순위 대리 승인자 supervisor_id VARCHAR(50), -- 3순위 상위 관리자 sla_minutes INT DEFAULT 10, -- 승인 대기 SLA (분) is_active CHAR(1) DEFAULT 'Y' -- Y: 근무중 / N: 부재중 ); ``` --- ## 2. 운영 작업 영역 (Ops Task) ### TB_OPS_TASK (운영 작업 헤더) ```sql CREATE TABLE TB_OPS_TASK ( task_id VARCHAR(30) PRIMARY KEY, -- 예: OPS-20260523-001 task_category VARCHAR(50) NOT NULL, -- DEPLOY | INFRA | DATA | MAINTENANCE task_sub_type VARCHAR(50), -- SSL_REPLACE | LOG_ANALYSIS | RESTART raw_request TEXT NOT NULL, -- 사용자 원문 자연어 status VARCHAR(30) DEFAULT 'RECEIVED', requester_id VARCHAR(50) NOT NULL, inst_id VARCHAR(20) REFERENCES TB_INST_META(inst_id), playbook_id VARCHAR(50), -- 실행 플레이북 ID created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 상태값: RECEIVED | PARSED | PENDING_APPROVAL | ESCALATED | APPROVED | IN_PROGRESS | PENDING_PM_VALIDATION | COMPLETED | FAILED_ROLLBACK CREATE INDEX idx_task_status ON TB_OPS_TASK(status, created_at DESC); ``` ### TB_DEPLOY_HISTORY (배포 상세 이력) ```sql CREATE TABLE TB_DEPLOY_HISTORY ( deploy_id BIGSERIAL PRIMARY KEY, task_id VARCHAR(30) REFERENCES TB_OPS_TASK(task_id), server_id VARCHAR(30) REFERENCES TB_SERVER_INFO(server_id), user_id VARCHAR(50) NOT NULL, sr_no VARCHAR(30), artifact_list JSONB, -- 배포된 파일 목록 deploy_status CHAR(1) DEFAULT 'P', -- P:대기 S:성공 F:실패 backup_path VARCHAR(255), result_hash CHAR(64), -- SHA-256 deployed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- ## 3. 거버넌스 승인 영역 ### TB_APPROVAL_FLOW (다단계 승인 이력) ```sql CREATE TABLE TB_APPROVAL_FLOW ( flow_id BIGSERIAL PRIMARY KEY, task_id VARCHAR(30) REFERENCES TB_OPS_TASK(task_id), step_order INT NOT NULL, -- 1, 2, 3... approver_id VARCHAR(50) NOT NULL, approval_status CHAR(1) DEFAULT 'P', -- P:대기 A:승인 R:반려 comments VARCHAR(500), escalation_type VARCHAR(20), -- DIRECT | DEPUTY | SUPERVISOR approved_at TIMESTAMP ); CREATE INDEX idx_approval_task ON TB_APPROVAL_FLOW(task_id, step_order); ``` --- ## 4. 감사 영역 (Audit — 위변조 방지) ### TB_AUDIT_LOG (SHA-256 해시 체인) ```sql CREATE TABLE TB_AUDIT_LOG ( log_id BIGSERIAL PRIMARY KEY, task_id VARCHAR(30) REFERENCES TB_OPS_TASK(task_id), server_ip VARCHAR(45), exec_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, command TEXT NOT NULL, exit_code INT, result_hash CHAR(64), -- SHA256(현재 결과 + 이전 hash) operator_id VARCHAR(50) ); -- 해시 체이닝: Log[n].result_hash = SHA256(Log[n].output || Log[n-1].result_hash) ``` ### TB_SR_REQUEST (SR 티켓 — 레거시 호환) ```sql CREATE TABLE TB_SR_REQUEST ( sr_no VARCHAR(30) PRIMARY KEY, -- SR-2026-001 requester VARCHAR(100), system_id VARCHAR(30) REFERENCES TB_SERVER_INFO(server_id), raw_text TEXT, task_type VARCHAR(50), -- UI_FIX | DEPLOY | LOG_ANALYSIS status VARCHAR(20) DEFAULT 'PENDING', assigned_ai VARCHAR(50), -- 에이전트 실행 ID created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- ## 5. 메신저 채팅 영역 ### TB_MSG_ROOMS (대화방) ```sql CREATE TABLE TB_MSG_ROOMS ( room_id VARCHAR(50) PRIMARY KEY, room_name VARCHAR(100) NOT NULL, inst_id VARCHAR(20) REFERENCES TB_INST_META(inst_id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` ### TB_MSG_CHAT_LOG (채팅 이력) ```sql CREATE TABLE TB_MSG_CHAT_LOG ( chat_id BIGSERIAL PRIMARY KEY, room_id VARCHAR(50) REFERENCES TB_MSG_ROOMS(room_id), sender_id VARCHAR(50) NOT NULL, sender_name VARCHAR(100), sender_type VARCHAR(20) NOT NULL, -- HUMAN | BOT | AGENT message_text TEXT, is_command BOOLEAN DEFAULT FALSE, task_id VARCHAR(30), itsm_ticket_id VARCHAR(50), -- 향후 ITSM 연동용 (null 허용) asset_code VARCHAR(50), -- 인프라 자산 코드 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` --- ## 6. 더미 데이터 (로컬 테스트용) ```sql -- 관공서 기관 INSERT INTO TB_INST_META (inst_id, inst_name, pm_contact) VALUES ('MOF', '기획재정부', 'PM001'), ('MOIS', '행정안전부', 'PM002'), ('MSS', '중소벤처기업부', 'PM003'); -- 서버 노드 INSERT INTO TB_SERVER_INFO (server_id, inst_id, system_name, layer, ip_address, ssh_port, ftp_path, os_user) VALUES ('MOF-WAS-01', 'MOF', '예산시스템', 'WAS', '192.168.10.11', 22, '/app/mof/webapps/ROOT', 'mofadmin'), ('MOF-WAS-02', 'MOF', '예산시스템', 'WAS', '192.168.10.12', 22, '/app/mof/webapps/ROOT', 'mofadmin'), ('MOF-DB-01', 'MOF', '예산시스템', 'DB', '192.168.10.13', 5432, '/var/lib/postgresql', 'postgres'); -- 담당자 매핑 INSERT INTO TB_SYSTEM_OWNER (system_id, inst_id, owner_id, deputy_id, supervisor_id) VALUES ('MOF-WAS-01', 'MOF', 'EMP-0101', 'EMP-0102', 'EMP-0100'), ('MOF-DB-01', 'MOF', 'EMP-0201', NULL, 'EMP-0200'); ```