테이블관리

This commit is contained in:
kjs
2025-08-25 14:08:08 +09:00
parent ce130ee225
commit eb1a6aa206
13 changed files with 1485 additions and 3 deletions

View File

@@ -952,6 +952,294 @@ public Map<String, Object> changeUserStatus(Map<String, Object> paramMap)
**시작 지점**: 사용자 목록 조회 API부터 실제 데이터베이스 연동으로 구현
## 🗄️ 테이블 타입관리 백엔드 Node.js 리팩토링 계획
### 📋 테이블 타입관리 기능 Node.js 리팩토링 개요
**목표**: 기존 Java Spring Boot의 테이블 타입관리 기능을 Node.js + TypeScript로 완전 리팩토링
**기존 Java 백엔드 (`@backend/`) 분석**
- Spring Framework 기반의 `TableManagementController``TableManagementService`
- MyBatis를 사용한 PostgreSQL 메타데이터 조회
- `table_labels`, `column_labels` 테이블을 통한 테이블/컬럼 설정 관리
- `information_schema` 활용한 데이터베이스 구조 자동 조회
**현재 Node.js 백엔드 (`@backend-node/`) 상황**
- 테이블 타입관리 기능 미구현
- PostgreSQL 메타데이터 조회 기능 부재
- 컬럼 설정 관리 기능 부재
**🎯 리팩토링 목표**
1. **기존 Java 백엔드의 테이블 타입관리 기능을 Node.js로 완전 이전**
2. **PostgreSQL `information_schema` 활용한 메타데이터 조회**
3. **`table_labels`, `column_labels` 테이블을 통한 설정 관리**
4. **기존 API 응답 형식과 호환성 유지**
**🛠️ 단계별 구현 계획**
**Phase 2-5-1: 데이터베이스 스키마 및 모델 정리 (1일)**
- [ ] Prisma 스키마에 `table_labels`, `column_labels` 테이블 정의
- [ ] PostgreSQL 메타데이터 조회를 위한 권한 설정 확인
- [ ] 데이터 타입 및 관계 정의
**Phase 2-5-2: 핵심 테이블 타입관리 API 구현 (3일)**
**테이블 메타데이터 API**
```typescript
// 기존 Java TableManagementController의 핵심 메서드들
- GET /api/table-management/tables - (information_schema )
- GET /api/table-management/tables/:tableName/columns -
- POST /api/table-management/tables/:tableName/columns/:columnName/settings -
- POST /api/table-management/tables/:tableName/columns/settings -
```
**PostgreSQL 메타데이터 조회**
```typescript
// information_schema를 활용한 테이블 목록 조회
const getTableList = async (): Promise<TableInfo[]> => {
const query = `
SELECT
t.table_name as "tableName",
COALESCE(tl.table_label, t.table_name) as "displayName",
COALESCE(tl.description, '') as "description",
(SELECT COUNT(*) FROM information_schema.columns
WHERE table_name = t.table_name AND table_schema = 'public') as "columnCount"
FROM information_schema.tables t
LEFT JOIN table_labels tl ON t.table_name = tl.table_name
WHERE t.table_schema = 'public'
AND t.table_type = 'BASE TABLE'
AND t.table_name NOT LIKE 'pg_%'
AND t.table_name NOT LIKE 'sql_%'
ORDER BY t.table_name
`;
const result = await client.query(query);
return result.rows;
};
```
**Phase 2-5-3: 서비스 레이어 구현 (2일)**
**TableManagementService 확장**
```typescript
// 기존 Java TableManagementService의 핵심 메서드들
- getTableList() - (information_schema )
- getColumnList(tableName) -
- updateColumnSettings() -
- updateAllColumnSettings() -
```
**데이터베이스 연동**
```typescript
- PostgreSQL
-
-
```
**Phase 2-5-4: 컬럼 설정 관리 기능 (1일)**
**컬럼 설정 데이터 구조**
```typescript
interface ColumnSettings {
columnLabel: string; // 컬럼 표시명
webType: string; // 웹 입력 타입 (text, number, date, code, entity)
detailSettings: string; // 상세 설정
codeCategory: string; // 코드 카테고리
codeValue: string; // 코드 값
referenceTable: string; // 참조 테이블
referenceColumn: string; // 참조 컬럼
}
```
**UPSERT 방식으로 컬럼 설정 저장**
```typescript
const updateColumnSettings = async (
tableName: string,
columnName: string,
settings: ColumnSettings
): Promise<void> => {
const query = `
INSERT INTO column_labels (
table_name, column_name, column_label, web_type,
detail_settings, code_category, code_value,
reference_table, reference_column
) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
ON CONFLICT (table_name, column_name) DO UPDATE SET
column_label = EXCLUDED.column_label,
web_type = EXCLUDED.web_type,
detail_settings = EXCLUDED.detail_settings,
code_category = EXCLUDED.code_category,
code_value = EXCLUDED.code_value,
reference_table = EXCLUDED.reference_table,
reference_column = EXCLUDED.reference_column,
updated_date = now()
`;
await client.query(query, [
tableName,
columnName,
settings.columnLabel,
settings.webType,
settings.detailSettings,
settings.codeCategory,
settings.codeValue,
settings.referenceTable,
settings.referenceColumn,
]);
};
```
**🔄 구현 우선순위**
**High Priority (1-2일차)**
1. 테이블 목록 조회 API (information_schema 활용)
2. 컬럼 정보 조회 API
3. 기본적인 에러 핸들링
**Medium Priority (3-4일차)**
1. 개별 컬럼 설정 업데이트 API
2. 전체 컬럼 설정 일괄 업데이트 API
3. 테이블/컬럼 라벨 자동 생성 기능
**Low Priority (5일차)**
1. 컬럼 설정 검증 로직
2. 메타데이터 캐싱 기능
3. 고급 검색 및 필터링
**🔧 기술적 고려사항**
**PostgreSQL 메타데이터 조회**
- `information_schema` 접근 권한 확인
- 시스템 테이블 제외 로직 (`pg_*`, `sql_*` 테이블 제외)
- 성능 최적화를 위한 인덱스 활용
**데이터베이스 연동**
- Prisma ORM 대신 PostgreSQL 클라이언트 직접 사용
- 메타데이터 조회를 위한 특수 쿼리 처리
- 트랜잭션 관리 및 롤백 처리
**API 호환성**
- 기존 Java 백엔드와 동일한 응답 형식 유지
- 프론트엔드 변경 최소화
- 점진적 마이그레이션 지원
**📊 테스트 계획**
1. **단위 테스트**: 각 서비스 메서드별 테스트
2. **통합 테스트**: API 엔드포인트별 테스트
3. **데이터베이스 테스트**: 실제 PostgreSQL 메타데이터 조회 테스트
4. **성능 테스트**: 대용량 테이블/컬럼 조회 테스트
**📝 기존 Java 코드 분석 결과**
**TableManagementController 주요 메서드**
```java
// 테이블 목록 조회
@GetMapping("/tables")
public ResponseEntity<Map<String, Object>> getTableList(HttpServletRequest request)
// 컬럼 정보 조회
@GetMapping("/tables/{tableName}/columns")
public ResponseEntity<Map<String, Object>> getColumnList(
HttpServletRequest request, @PathVariable String tableName)
// 컬럼 설정 업데이트
@PostMapping("/tables/{tableName}/columns/{columnName}/settings")
public ResponseEntity<Map<String, Object>> updateColumnSettings(
HttpServletRequest request, @PathVariable String tableName,
@PathVariable String columnName, @RequestBody Map<String, Object> settings)
// 전체 컬럼 설정 일괄 업데이트
@PostMapping("/tables/{tableName}/columns/settings")
public ResponseEntity<Map<String, Object>> updateAllColumnSettings(
HttpServletRequest request, @PathVariable String tableName,
@RequestBody List<Map<String, Object>> columnSettings)
```
**TableManagementService 주요 메서드**
```java
// 테이블 목록 조회
public List<Map<String, Object>> getTableList()
// 컬럼 정보 조회
public List<Map<String, Object>> getColumnList(String tableName)
// 컬럼 설정 업데이트
public void updateColumnSettings(String tableName, String columnName, Map<String, Object> settings)
// 전체 컬럼 설정 일괄 업데이트
public void updateAllColumnSettings(String tableName, List<Map<String, Object>> columnSettings)
```
**MyBatis Mapper 주요 쿼리**
```xml
<!-- 테이블 목록 조회 -->
<select id="selectTableList" resultType="map">
SELECT
t.table_name as "tableName",
COALESCE(tl.table_label, t.table_name) as "displayName",
COALESCE(tl.description, '') as "description",
(SELECT COUNT(*) FROM information_schema.columns
WHERE table_name = t.table_name AND table_schema = 'public') as "columnCount"
FROM information_schema.tables t
LEFT JOIN table_labels tl ON t.table_name = tl.table_name
WHERE t.table_schema = 'public'
AND t.table_type = 'BASE TABLE'
AND t.table_name NOT LIKE 'pg_%'
AND t.table_name NOT LIKE 'sql_%'
ORDER BY t.table_name
</select>
<!-- 컬럼 정보 조회 -->
<select id="selectColumnList" parameterType="map" resultType="map">
SELECT
c.column_name as "columnName",
COALESCE(cl.column_label, c.column_name) as "displayName",
c.data_type as "dbType",
COALESCE(cl.web_type, 'text') as "webType",
COALESCE(cl.detail_settings, '') as "detailSettings",
COALESCE(cl.description, '') as "description",
c.is_nullable as "isNullable",
c.column_default as "defaultValue",
c.character_maximum_length as "maxLength",
c.numeric_precision as "numericPrecision",
c.numeric_scale as "numericScale",
cl.code_category as "codeCategory",
cl.code_value as "codeValue",
cl.reference_table as "referenceTable",
cl.reference_column as "referenceColumn"
FROM information_schema.columns c
LEFT JOIN column_labels cl ON c.table_name = cl.table_name AND c.column_name = cl.column_name
WHERE c.table_name = #{tableName}
ORDER BY c.ordinal_position
</select>
```
**📋 다음 단계**
이 계획에 따라 **Phase 2-5**를 시작하여 단계적으로 테이블 타입관리 기능을 구현하겠습니다.
**시작 지점**: 테이블 목록 조회 API부터 PostgreSQL 메타데이터 조회로 구현
#### **Phase 2-2A: 메뉴 관리 API (완료 ✅)**
- [x] 관리자 메뉴 조회 API (`GET /api/admin/menus`) - **완료: 기존 `AdminController.getAdminMenuList()` 포팅**
@@ -975,7 +1263,13 @@ public Map<String, Object> changeUserStatus(Map<String, Object> paramMap)
- [ ] 권한 관리 API (`authority_master`, `rel_menu_auth` 테이블 기반)
- [ ] 사용자별 메뉴 권한 조회 API
#### **Phase 2-5: 다국어 및 공통 관리 API (1주)**
#### **Phase 2-5: 테이블 타입관리 API (1주)**
- [ ] 테이블 타입관리 API (`table_labels`, `column_labels` 테이블 기반)
- [ ] PostgreSQL 메타데이터 조회 API (`information_schema` 활용)
- [ ] 컬럼 설정 관리 API (웹 타입, 참조 테이블, 코드 카테고리 등)
#### **Phase 2-6: 다국어 및 공통 관리 API (1주)**
- [ ] 다국어 관리 API (`multi_lang_key_master`, `multi_lang_text` 테이블 기반)
- [ ] 공통 코드 관리 API (`comm_code` 테이블 기반)
@@ -1414,6 +1708,6 @@ export const authenticateToken = (
---
**마지막 업데이트**: 2024년 12월 20일
**버전**: 1.9.0
**버전**: 2.0.0
**작성자**: AI Assistant
**현재 상태**: Phase 1 완료, Phase 2-1A 완료, Phase 2-1B 완료, Phase 2-2A 완료 ✅ (메뉴 API 구현 완료, 어드민 메뉴 인증 문제 해결, 토큰 인증 문제 완전 해결)
**현재 상태**: Phase 1 완료, Phase 2-1A 완료, Phase 2-1B 완료, Phase 2-2A 완료 ✅ (메뉴 API 구현 완료, 어드민 메뉴 인증 문제 해결, 토큰 인증 문제 완전 해결), Phase 2-5 계획 수립 ✅ (테이블 타입관리 백엔드 Node.js 리팩토링 계획 완성)