feat: 모든 카테고리(HW, SW, SW 사용자) DB 일괄 덮어쓰기 저장 기능 구현

This commit is contained in:
2026-04-17 15:07:54 +09:00
parent a805d9ce06
commit c5c6acea6a
27 changed files with 2863 additions and 996 deletions

107
db_init.js Normal file
View File

@@ -0,0 +1,107 @@
import mysql from 'mysql2/promise';
import dotenv from 'dotenv';
dotenv.config();
const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env;
async function initDB() {
const connection = await mysql.createConnection({
host: DB_HOST,
user: DB_USER,
password: DB_PASS,
port: parseInt(DB_PORT || '3306')
});
console.log('🚀 DB 초기화 시작...');
// 1. 데이터베이스 생성
await connection.query(`CREATE DATABASE IF NOT EXISTS ${DB_NAME};`);
await connection.query(`USE ${DB_NAME};`);
console.log(`✅ 데이터베이스 생성 완료: ${DB_NAME}`);
// 2. 하드웨어 자산 테이블
const createHwTable = `
CREATE TABLE IF NOT EXISTS hw_assets (
id VARCHAR(50) PRIMARY KEY,
type VARCHAR(50) NOT NULL COMMENT '개인PC, 서버, 스토리지, 전산비품',
corp VARCHAR(100) COMMENT '구매법인',
asset_code VARCHAR(100) COMMENT '자산번호/코드',
asset_name VARCHAR(255) COMMENT '명칭/용도',
location VARCHAR(255) COMMENT '설치위치',
current_org VARCHAR(255) COMMENT '현 사용조직',
prev_org VARCHAR(255) COMMENT '이전 사용조직',
manager_main VARCHAR(100) COMMENT '담당자(정)',
manager_sub VARCHAR(100) COMMENT '담당자(부)',
ip_address VARCHAR(100) COMMENT 'IP 주소 1',
ip_address2 VARCHAR(100) COMMENT 'IP 주소 2',
mac_address VARCHAR(100) COMMENT 'MAC 주소',
os VARCHAR(100),
cpu VARCHAR(255),
ram VARCHAR(100),
storage1 VARCHAR(255),
storage2 VARCHAR(255),
model_name VARCHAR(255),
purchase_date VARCHAR(50),
price VARCHAR(100),
vendor VARCHAR(255) COMMENT '납품업체',
doc_name VARCHAR(255) COMMENT '품의서명',
remote_tool VARCHAR(100) COMMENT '원격도구',
server_id VARCHAR(100),
server_pw VARCHAR(100),
monitoring VARCHAR(100),
remarks TEXT COMMENT '비고',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
// 3. 소프트웨어 자산 테이블
const createSwTable = `
CREATE TABLE IF NOT EXISTS sw_assets (
id VARCHAR(50) PRIMARY KEY,
type VARCHAR(50) NOT NULL COMMENT '구독SW, 영구SW',
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),
maintenance_status TINYINT(1) DEFAULT 0,
price VARCHAR(100),
quantity INT DEFAULT 1,
account_id VARCHAR(255) COMMENT '계정명',
vendor VARCHAR(255),
remarks TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
// 4. 소프트웨어 사용자 매핑 테이블
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),
FOREIGN KEY (sw_id) REFERENCES sw_assets(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
`;
await connection.query(createHwTable);
await connection.query(createSwTable);
await connection.query(createSwUsersTable);
console.log('✅ 테이블 생성 완료!');
await connection.end();
console.log('🏁 DB 초기화 프로세스 종료.');
}
initDB().catch(err => {
console.error('❌ DB 초기화 실패:', err);
process.exit(1);
});