refactor: standardize modal system, unify hardware DB schemas, and implement automatic asset reclassification

This commit is contained in:
2026-04-20 17:56:19 +09:00
parent 5372cda59f
commit 5248b494e9
24 changed files with 5453 additions and 1318 deletions

View File

@@ -10,50 +10,28 @@ async function initDB() {
host: DB_HOST,
user: DB_USER,
password: DB_PASS,
port: parseInt(DB_PORT || '3306')
database: DB_NAME,
port: parseInt(DB_PORT || '3306'),
multipleStatements: true
});
console.log('🚀 DB 초기화 시작...');
console.log('🔄 DB 초기화 시작 (표준화 스키마 적용)...');
// 1. 데이터베이스 생성
await connection.query(`CREATE DATABASE IF NOT EXISTS ${DB_NAME};`);
await connection.query(`USE ${DB_NAME};`);
console.log(`✅ 데이터베이스 생성 완료: ${DB_NAME}`);
// 기존 테이블 삭제
const tablesToDrop = ['pc_assets', 'server_assets', 'storage_assets', 'equip_assets', 'mobile_assets', 'sw_sub_assets', 'sw_perm_assets', 'sw_users'];
for (const table of tablesToDrop) {
await connection.query(`DROP TABLE IF EXISTS ${table}`);
}
// 2. 개인PC 테이블
const createPcTable = `
CREATE TABLE IF NOT EXISTS pc_assets (
id VARCHAR(50) PRIMARY KEY,
corp VARCHAR(100) COMMENT '구매법인',
asset_code VARCHAR(100) COMMENT '자산번호/코드',
user VARCHAR(100) COMMENT '사용자',
location VARCHAR(255) COMMENT '설치위치',
cpu VARCHAR(255),
gpu VARCHAR(255),
ram VARCHAR(100),
ssd1 VARCHAR(100),
ssd2 VARCHAR(100),
hdd1 VARCHAR(100),
hdd2 VARCHAR(100),
ip_address VARCHAR(100),
hw_spec TEXT COMMENT 'HW사양 상세',
purchase_date VARCHAR(50),
price VARCHAR(100),
vendor VARCHAR(255),
doc_name VARCHAR(255),
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
// 3. 서버 테이블
const createServerTable = `
CREATE TABLE IF NOT EXISTS server_assets (
// 공통 하드웨어 테이블 생성 함수
const createHardwareTable = (tableName, comment) => `
CREATE TABLE ${tableName} (
id VARCHAR(50) PRIMARY KEY,
corp VARCHAR(100) COMMENT '구매법인',
asset_code VARCHAR(100) COMMENT '자산번호',
purchase_date VARCHAR(50) COMMENT '구매일자',
type VARCHAR(50) DEFAULT '물리' COMMENT '물리/가상',
type VARCHAR(50) COMMENT '유형',
detail_purpose VARCHAR(50) COMMENT '상세용도',
purpose VARCHAR(255) COMMENT '용도',
details TEXT COMMENT '상세내용',
current_org VARCHAR(255) COMMENT '현 사용조직',
@@ -74,122 +52,74 @@ async function initDB() {
storage2 VARCHAR(255),
storage3 VARCHAR(255),
monitoring VARCHAR(100),
price VARCHAR(100) COMMENT '금액',
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='${comment}';
`;
// 4. 스토리지 테이블
const createStorageTable = `
CREATE TABLE IF NOT EXISTS storage_assets (
id VARCHAR(50) PRIMARY KEY,
corp VARCHAR(100) COMMENT '구매법인',
type VARCHAR(50) COMMENT '유형',
asset_code VARCHAR(100) COMMENT '자산코드',
asset_name VARCHAR(255) COMMENT '명칭',
location VARCHAR(255) COMMENT '설치위치',
model_name VARCHAR(255),
capacity VARCHAR(100) COMMENT '용량',
manager_main VARCHAR(100) COMMENT '담당자(정)',
manager_sub VARCHAR(100) COMMENT '담당자(부)',
ip_address VARCHAR(100),
mac_address VARCHAR(100),
purchase_date VARCHAR(50),
price VARCHAR(100),
vendor VARCHAR(255),
doc_name VARCHAR(255),
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
await connection.query(createHardwareTable('pc_assets', '개인PC 자산'));
await connection.query(createHardwareTable('server_assets', '서버 자산'));
await connection.query(createHardwareTable('storage_assets', '스토리지 자산'));
await connection.query(createHardwareTable('equip_assets', '전산비품 자산'));
await connection.query(createHardwareTable('mobile_assets', '모바일기기 자산'));
// 5. 전산비품 테이블
const createEquipTable = `
CREATE TABLE IF NOT EXISTS equip_assets (
id VARCHAR(50) PRIMARY KEY,
corp VARCHAR(100) COMMENT '구매법인',
type VARCHAR(50) COMMENT '비품유형',
asset_code VARCHAR(100) COMMENT '자산코드',
asset_name VARCHAR(255) COMMENT '명칭',
location VARCHAR(255) COMMENT '설치위치',
manager VARCHAR(100) COMMENT '관리자',
ip_address VARCHAR(100),
mac_address VARCHAR(100),
hw_spec TEXT,
os VARCHAR(100),
purchase_date VARCHAR(50),
price VARCHAR(100),
vendor VARCHAR(255),
doc_name VARCHAR(255),
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
// 6. 구독SW 테이블
// 소프트웨어 구독 테이블
const createSubSwTable = `
CREATE TABLE IF NOT EXISTS subscription_sw (
CREATE TABLE sw_sub_assets (
id VARCHAR(50) PRIMARY KEY,
category VARCHAR(100) COMMENT '분야',
corp VARCHAR(100) COMMENT '구매법인',
dept VARCHAR(100) COMMENT '부서',
product_name VARCHAR(255) NOT NULL,
purchase_date VARCHAR(50),
subscription_date VARCHAR(50),
price VARCHAR(100),
quantity INT DEFAULT 1,
account_id VARCHAR(255) COMMENT '계정명',
vendor VARCHAR(255),
remarks TEXT,
asset_code VARCHAR(100) COMMENT '자산번호',
product_name VARCHAR(255) COMMENT '제품명',
license_type VARCHAR(100) COMMENT '라이선스 유형',
quantity INT COMMENT '수량',
price VARCHAR(100) COMMENT '금액',
purchase_date VARCHAR(50) COMMENT '구매일',
expiry_date VARCHAR(50) COMMENT '만료일',
vendor VARCHAR(255) COMMENT '납품업체',
remarks TEXT COMMENT '비고',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
// 7. 영구SW 테이블
// 소프트웨어 영구 테이블
const createPermSwTable = `
CREATE TABLE IF NOT EXISTS permanent_sw (
CREATE TABLE sw_perm_assets (
id VARCHAR(50) PRIMARY KEY,
category VARCHAR(100) COMMENT '분야',
corp VARCHAR(100) COMMENT '구매법인',
dept VARCHAR(100) COMMENT '부서',
product_name VARCHAR(255) NOT NULL,
purchase_date VARCHAR(50),
maintenance_status TINYINT(1) DEFAULT 0,
price VARCHAR(100),
quantity INT DEFAULT 1,
account_id VARCHAR(255) COMMENT '계정명',
vendor VARCHAR(255),
remarks TEXT,
asset_code VARCHAR(100) COMMENT '자산번호',
product_name VARCHAR(255) COMMENT '제품명',
license_key VARCHAR(255) COMMENT '라이선스 키',
quantity INT COMMENT '수량',
price VARCHAR(100) COMMENT '금액',
purchase_date VARCHAR(50) COMMENT '구매일',
vendor VARCHAR(255) COMMENT '납품업체',
remarks TEXT COMMENT '비고',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
// 8. SW 사용자 매핑 테이블 (FK 제약조건 제거하여 유연하게 관리)
// 소프트웨어 사용자 매핑 테이블
const createSwUsersTable = `
CREATE TABLE IF NOT EXISTS sw_users (
id VARCHAR(50) PRIMARY KEY,
sw_id VARCHAR(50),
corp VARCHAR(100),
dept VARCHAR(100),
team VARCHAR(100),
position VARCHAR(50),
name VARCHAR(100),
usage_period VARCHAR(100),
doc_name VARCHAR(255)
CREATE TABLE sw_users (
id INT AUTO_INCREMENT PRIMARY KEY,
sw_id VARCHAR(50) COMMENT 'SW 자산 ID',
corp VARCHAR(100) COMMENT '법인',
dept VARCHAR(100) COMMENT '부서',
position VARCHAR(50) COMMENT '직위',
user_name VARCHAR(100) COMMENT '이름',
usage_period VARCHAR(100) COMMENT '사용기간',
doc_name VARCHAR(255) COMMENT '신청서명',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
await connection.query(createPcTable);
await connection.query(createServerTable);
await connection.query(createStorageTable);
await connection.query(createEquipTable);
await connection.query(createSubSwTable);
await connection.query(createPermSwTable);
await connection.query(createSwUsersTable);
console.log('✅ 6개 전용 테이블 생성 완료!');
console.log('✅ 모든 테이블이 표준화된 스키마로 재생성되었습니다.');
await connection.end();
console.log('🏁 DB 초기화 프로세스 종료.');
}
initDB().catch(err => {