feat: 테이블 참조 관계 조회 로직 개선 및 로깅 강화

- getReferencedByTables 함수에서 현재 사용자의 company_code를 우선적으로 사용하도록 로직을 개선하였습니다.
- SQL 쿼리에서 ROW_NUMBER를 활용하여 같은 테이블/컬럼 조합에서 회사코드 우선순위로 하나만 선택하도록 하였습니다.
- 로깅 메시지에 회사코드를 포함시켜, 조회 시 어떤 회사의 데이터가 사용되었는지 명확히 기록하도록 하였습니다.
This commit is contained in:
kjs 2026-02-05 10:58:27 +09:00
parent 2fb6dd0c32
commit 21a663a99b
1 changed files with 37 additions and 15 deletions

View File

@ -2344,6 +2344,8 @@ export async function getTableEntityRelations(
* *
* table_type_columns에서 reference_table이 * table_type_columns에서 reference_table이
* FK . * FK .
*
* 우선순위: 현재 company_code > ('*')
*/ */
export async function getReferencedByTables( export async function getReferencedByTables(
req: AuthenticatedRequest, req: AuthenticatedRequest,
@ -2351,9 +2353,11 @@ export async function getReferencedByTables(
): Promise<void> { ): Promise<void> {
try { try {
const { tableName } = req.params; const { tableName } = req.params;
// 현재 사용자의 회사 코드 (없으면 '*' 사용)
const userCompanyCode = req.user?.companyCode || "*";
logger.info( logger.info(
`=== 테이블 참조 관계 조회 시작: ${tableName} 을 참조하는 테이블 ===` `=== 테이블 참조 관계 조회 시작: ${tableName} 을 참조하는 테이블 (회사코드: ${userCompanyCode}) ===`
); );
if (!tableName) { if (!tableName) {
@ -2371,23 +2375,41 @@ export async function getReferencedByTables(
// table_type_columns에서 reference_table이 현재 테이블인 레코드 조회 // table_type_columns에서 reference_table이 현재 테이블인 레코드 조회
// input_type이 'entity'인 것만 조회 (실제 FK 관계) // input_type이 'entity'인 것만 조회 (실제 FK 관계)
// 우선순위: 현재 사용자의 company_code > 공통('*')
// ROW_NUMBER를 사용해서 같은 테이블/컬럼 조합에서 회사코드 우선순위로 하나만 선택
const sqlQuery = ` const sqlQuery = `
WITH ranked AS (
SELECT
ttc.table_name,
ttc.column_name,
ttc.column_label,
ttc.reference_table,
ttc.reference_column,
ttc.display_column,
ttc.company_code,
ROW_NUMBER() OVER (
PARTITION BY ttc.table_name, ttc.column_name
ORDER BY CASE WHEN ttc.company_code = $2 THEN 1 ELSE 2 END
) as rn
FROM table_type_columns ttc
WHERE ttc.reference_table = $1
AND ttc.input_type = 'entity'
AND ttc.company_code IN ($2, '*')
)
SELECT DISTINCT SELECT DISTINCT
ttc.table_name, table_name,
ttc.column_name, column_name,
ttc.column_label, column_label,
ttc.reference_table, reference_table,
ttc.reference_column, reference_column,
ttc.display_column, display_column,
ttc.table_name as table_label table_name as table_label
FROM table_type_columns ttc FROM ranked
WHERE ttc.reference_table = $1 WHERE rn = 1
AND ttc.input_type = 'entity' ORDER BY table_name, column_name
AND ttc.company_code = '*'
ORDER BY ttc.table_name, ttc.column_name
`; `;
const result = await query(sqlQuery, [tableName]); const result = await query(sqlQuery, [tableName, userCompanyCode]);
const referencedByTables = result.map((row: any) => ({ const referencedByTables = result.map((row: any) => ({
tableName: row.table_name, tableName: row.table_name,
@ -2400,7 +2422,7 @@ export async function getReferencedByTables(
})); }));
logger.info( logger.info(
`테이블 참조 관계 조회 완료: ${referencedByTables.length}개 발견` `테이블 참조 관계 조회 완료: ${referencedByTables.length}개 발견 (회사코드: ${userCompanyCode})`
); );
const response: ApiResponse<any> = { const response: ApiResponse<any> = {