/** * 컬럼 매핑 유틸리티 * 다중 데이터 소스 통합 시 컬럼명을 통일하기 위한 함수 */ /** * 데이터에 컬럼 매핑 적용 * @param data 원본 데이터 배열 * @param columnMapping 컬럼 매핑 객체 { 원본컬럼: 표시이름 } * @returns 매핑이 적용된 데이터 배열 * * @example * const data = [{ name: "상품A", amount: 1000 }]; * const mapping = { name: "product", amount: "value" }; * const result = applyColumnMapping(data, mapping); * // result: [{ product: "상품A", value: 1000 }] */ export function applyColumnMapping( data: any[], columnMapping?: Record ): any[] { // 매핑이 없거나 빈 객체면 원본 그대로 반환 if (!columnMapping || Object.keys(columnMapping).length === 0) { return data; } console.log("🔄 컬럼 매핑 적용 중...", { rowCount: data.length, mappingCount: Object.keys(columnMapping).length, mapping: columnMapping, }); // 각 행에 매핑 적용 const mappedData = data.map((row) => { const mappedRow: any = {}; // 모든 컬럼 순회 Object.keys(row).forEach((originalCol) => { // 매핑이 있으면 매핑된 이름 사용, 없으면 원본 이름 사용 const mappedCol = columnMapping[originalCol] || originalCol; mappedRow[mappedCol] = row[originalCol]; }); return mappedRow; }); console.log("✅ 컬럼 매핑 완료", { originalColumns: Object.keys(data[0] || {}), mappedColumns: Object.keys(mappedData[0] || {}), }); return mappedData; } /** * 여러 데이터 소스의 데이터를 병합 * 각 데이터 소스의 컬럼 매핑을 적용한 후 병합 * * @param dataSets 데이터셋 배열 [{ data, columnMapping, source }] * @returns 병합된 데이터 배열 * * @example * const dataSets = [ * { * data: [{ name: "A", amount: 100 }], * columnMapping: { name: "product", amount: "value" }, * source: "DB1" * }, * { * data: [{ product_name: "B", total: 200 }], * columnMapping: { product_name: "product", total: "value" }, * source: "DB2" * } * ]; * const result = mergeDataSources(dataSets); * // result: [ * // { product: "A", value: 100, _source: "DB1" }, * // { product: "B", value: 200, _source: "DB2" } * // ] */ export function mergeDataSources( dataSets: Array<{ data: any[]; columnMapping?: Record; source?: string; }> ): any[] { console.log(`🔗 ${dataSets.length}개의 데이터 소스 병합 중...`); const mergedData: any[] = []; dataSets.forEach(({ data, columnMapping, source }) => { // 각 데이터셋에 컬럼 매핑 적용 const mappedData = applyColumnMapping(data, columnMapping); // 소스 정보 추가 const dataWithSource = mappedData.map((row) => ({ ...row, _source: source || "unknown", // 어느 데이터 소스에서 왔는지 표시 })); mergedData.push(...dataWithSource); }); console.log(`✅ 데이터 병합 완료: 총 ${mergedData.length}개 행`); return mergedData; }