테이블 컬럼 표시문제 수정

This commit is contained in:
kjs 2025-09-24 15:02:54 +09:00
parent 649ed5c6d7
commit 0d9ee4c40f
3 changed files with 71 additions and 11 deletions

View File

@ -233,6 +233,9 @@ export class EntityJoinService {
"master_sabun", "master_sabun",
"location", "location",
"data_type", "data_type",
"company_name",
"sales_yn",
"status",
].includes(col); ].includes(col);
if (isJoinTableColumn) { if (isJoinTableColumn) {
@ -256,6 +259,9 @@ export class EntityJoinService {
"master_sabun", "master_sabun",
"location", "location",
"data_type", "data_type",
"company_name",
"sales_yn",
"status",
].includes(col); ].includes(col);
if (isJoinTableColumn) { if (isJoinTableColumn) {

View File

@ -2074,38 +2074,78 @@ export class TableManagementService {
); );
for (const additionalColumn of options.additionalJoinColumns) { for (const additionalColumn of options.additionalJoinColumns) {
// 기존 조인 설정에서 같은 참조 테이블을 사용하는 설정 찾기 // 🔍 sourceColumn을 기준으로 기존 조인 설정 찾기 (dept_code로 찾기)
const baseJoinConfig = joinConfigs.find( const baseJoinConfig = joinConfigs.find(
(config) => config.referenceTable === additionalColumn.sourceTable (config) => config.sourceColumn === additionalColumn.sourceColumn
); );
if (baseJoinConfig) { if (baseJoinConfig) {
// joinAlias에서 실제 컬럼명 추출 (예: dept_code_location_name -> location_name) // joinAlias에서 실제 컬럼명 추출 (예: dept_code_location_name -> location_name)
// sourceColumn을 제거한 나머지 부분이 실제 컬럼명 // sourceColumn을 제거한 나머지 부분이 실제 컬럼명
const sourceColumn = baseJoinConfig.sourceColumn; // dept_code const sourceColumn = baseJoinConfig.sourceColumn; // dept_code
const joinAlias = additionalColumn.joinAlias; // dept_code_location_name const joinAlias = additionalColumn.joinAlias; // dept_code_company_name
const actualColumnName = joinAlias.replace(`${sourceColumn}_`, ""); // location_name const actualColumnName = joinAlias.replace(`${sourceColumn}_`, ""); // company_name
logger.info(`🔍 조인 컬럼 상세 분석:`, {
sourceColumn,
joinAlias,
actualColumnName,
referenceTable: additionalColumn.sourceTable,
});
// 🚨 기본 Entity 조인과 중복되지 않도록 체크
const isBasicEntityJoin =
additionalColumn.joinAlias ===
`${baseJoinConfig.sourceColumn}_name`;
if (isBasicEntityJoin) {
logger.info(
`⚠️ 기본 Entity 조인과 중복: ${additionalColumn.joinAlias} - 건너뜀`
);
continue; // 기본 Entity 조인과 중복되면 추가하지 않음
}
// 추가 조인 컬럼 설정 생성 // 추가 조인 컬럼 설정 생성
const additionalJoinConfig: EntityJoinConfig = { const additionalJoinConfig: EntityJoinConfig = {
sourceTable: tableName, sourceTable: tableName,
sourceColumn: baseJoinConfig.sourceColumn, // 원본 컬럼 (dept_code) sourceColumn: baseJoinConfig.sourceColumn, // 원본 컬럼 (dept_code)
referenceTable: additionalColumn.sourceTable, // 참조 테이블 (dept_info) referenceTable:
(additionalColumn as any).referenceTable ||
baseJoinConfig.referenceTable, // 참조 테이블 (dept_info)
referenceColumn: baseJoinConfig.referenceColumn, // 참조 키 (dept_code) referenceColumn: baseJoinConfig.referenceColumn, // 참조 키 (dept_code)
displayColumns: [actualColumnName], // 표시할 컬럼들 (location_name) displayColumns: [actualColumnName], // 표시할 컬럼들 (company_name)
displayColumn: actualColumnName, // 하위 호환성 displayColumn: actualColumnName, // 하위 호환성
aliasColumn: additionalColumn.joinAlias, // 별칭 (dept_code_location_name) aliasColumn: additionalColumn.joinAlias, // 별칭 (dept_code_company_name)
separator: " - ", // 기본 구분자 separator: " - ", // 기본 구분자
}; };
joinConfigs.push(additionalJoinConfig); joinConfigs.push(additionalJoinConfig);
logger.info( logger.info(
`추가 조인 컬럼 설정 추가: ${additionalJoinConfig.aliasColumn} -> ${actualColumnName}` `추가 조인 컬럼 설정 추가: ${additionalJoinConfig.aliasColumn} -> ${actualColumnName}`
); );
logger.info(`🔍 추가된 조인 설정 상세:`, {
sourceTable: additionalJoinConfig.sourceTable,
sourceColumn: additionalJoinConfig.sourceColumn,
referenceTable: additionalJoinConfig.referenceTable,
displayColumns: additionalJoinConfig.displayColumns,
aliasColumn: additionalJoinConfig.aliasColumn,
});
} }
} }
} }
// 최종 조인 설정 배열 로깅
logger.info(`🎯 최종 joinConfigs 배열 (${joinConfigs.length}개):`);
joinConfigs.forEach((config, index) => {
logger.info(
` ${index + 1}. ${config.sourceColumn} -> ${config.referenceTable} AS ${config.aliasColumn}`,
{
displayColumns: config.displayColumns,
displayColumn: config.displayColumn,
}
);
});
if (joinConfigs.length === 0) { if (joinConfigs.length === 0) {
logger.info(`Entity 조인 설정이 없음: ${tableName}`); logger.info(`Entity 조인 설정이 없음: ${tableName}`);
const basicResult = await this.getTableData(tableName, options); const basicResult = await this.getTableData(tableName, options);
@ -2119,8 +2159,21 @@ export class TableManagementService {
} }
// 조인 전략 결정 (테이블 크기 기반) // 조인 전략 결정 (테이블 크기 기반)
const strategy = // 🚨 additionalJoinColumns가 있는 경우 강제로 full_join 사용 (캐시 안정성 보장)
await entityJoinService.determineJoinStrategy(joinConfigs); let strategy: "full_join" | "cache_lookup" | "hybrid";
if (
options.additionalJoinColumns &&
options.additionalJoinColumns.length > 0
) {
strategy = "full_join";
console.log(
`🔧 additionalJoinColumns 감지: 강제로 full_join 전략 사용 (${options.additionalJoinColumns.length}개 추가 조인)`
);
} else {
strategy = await entityJoinService.determineJoinStrategy(joinConfigs);
}
console.log( console.log(
`🎯 선택된 조인 전략: ${strategy} (${joinConfigs.length}개 Entity 조인)` `🎯 선택된 조인 전략: ${strategy} (${joinConfigs.length}개 Entity 조인)`
); );

View File

@ -322,9 +322,10 @@ export const TableListComponent: React.FC<TableListComponentProps> = ({
console.log(`🔗 조인 설정: ${col.columnName} -> ${sourceColumn} (${referenceTable})`); console.log(`🔗 조인 설정: ${col.columnName} -> ${sourceColumn} (${referenceTable})`);
return { return {
sourceTable: referenceTable, sourceTable: tableConfig.selectedTable || "unknown", // 기본 테이블 (user_info)
sourceColumn: sourceColumn, sourceColumn: sourceColumn,
joinAlias: col.columnName, joinAlias: col.columnName,
referenceTable: referenceTable, // 참조 테이블 정보도 추가
}; };
}), }),
]; ];