Files
vexplor/화면관리_검증_시스템_사용_가이드.md

9.2 KiB

화면관리 검증 시스템 사용 가이드

📋 개요

이 문서는 화면관리에서 입력 폼 저장 시 발생하던 타입 불일치와 컬럼 오류 문제를 해결하기 위해 개발된 개선된 검증 시스템의 사용 방법을 안내합니다.

🚀 주요 개선 사항

해결된 문제점

  • 타입 불일치 오류: WebType 정의 통합으로 프론트엔드-백엔드 타입 일관성 확보
  • 없는 컬럼 참조: 클라이언트 사전 검증으로 존재하지 않는 컬럼 접근 방지
  • 불명확한 오류 메시지: 사용자 친화적인 상세 오류 메시지 제공
  • 느린 저장 성능: 캐싱 및 사전 검증으로 불필요한 서버 호출 최소화

🎯 새로운 기능

  • 실시간 폼 검증: 입력과 동시에 유효성 검사
  • 스마트 오류 제안: 오타나 잘못된 컬럼명에 대한 추천
  • 향상된 타입 변환: PostgreSQL 타입에 맞는 안전한 데이터 변환
  • 성능 최적화: 테이블 컬럼 정보 캐싱으로 빠른 응답

🛠️ 기술 스택

프론트엔드

  • TypeScript: 통합 타입 정의 (unified-web-types.ts)
  • React Hooks: 실시간 검증 (useFormValidation)
  • Validation Utils: 클라이언트 검증 로직 (formValidation.ts)
  • Enhanced Service: 통합 폼 서비스 (enhancedFormService.ts)

백엔드

  • Enhanced Service: 개선된 동적 폼 서비스 (enhancedDynamicFormService.ts)
  • Table Management API: 테이블 관리 API (tableManagementController.ts)
  • Type Safety: 통합 웹타입 정의 (unified-web-types.ts)

🎮 사용 방법

1. 데모 페이지에서 테스트

개선된 검증 시스템을 직접 체험할 수 있는 데모 페이지가 제공됩니다:

http://localhost:9771/admin/validation-demo

데모 기능

  • 유효한 데이터 입력: 모든 검증을 통과하는 테스트 데이터
  • 잘못된 데이터 입력: 다양한 검증 오류를 확인할 수 있는 데이터
  • 실시간 검증: 입력과 동시에 검증 결과 확인
  • 상세 검증 상태: 필드별 검증 상태 및 오류 메시지

2. 기존 화면에서 검증 기능 활성화

기존 InteractiveScreenViewer 컴포넌트에 검증 기능을 추가할 수 있습니다:

<InteractiveScreenViewer
  component={component}
  allComponents={allComponents}
  formData={formData}
  onFormDataChange={handleFormDataChange}
  screenInfo={screenInfo}
  // 검증 기능 활성화
  enableEnhancedValidation={true}
  tableColumns={tableColumns}
  showValidationPanel={true}
  validationOptions={{
    enableRealTimeValidation: true,
    validationDelay: 300,
    enableAutoSave: false,
    showToastMessages: true,
  }}
/>

3. 새로운 Enhanced 컴포넌트 사용

완전히 새로운 검증 기능을 위해서는 EnhancedInteractiveScreenViewer를 사용하세요:

import { EnhancedInteractiveScreenViewer } from "@/components/screen/EnhancedInteractiveScreenViewer";

<EnhancedInteractiveScreenViewer
  component={component}
  allComponents={allComponents}
  formData={formData}
  onFormDataChange={handleFormDataChange}
  screenInfo={screenInfo}
  tableColumns={tableColumns}
  showValidationPanel={true}
  showDeveloperInfo={false} // 개발 모드에서만 true
/>;

⚙️ 설정 옵션

검증 옵션 (validationOptions)

interface ValidationOptions {
  enableRealTimeValidation?: boolean; // 실시간 검증 활성화 (기본: true)
  validationDelay?: number; // 검증 지연 시간 ms (기본: 300)
  enableAutoSave?: boolean; // 자동 저장 (기본: false)
  autoSaveDelay?: number; // 자동 저장 지연 시간 ms (기본: 2000)
  showToastMessages?: boolean; // 토스트 메시지 표시 (기본: true)
  validateOnMount?: boolean; // 마운트 시 검증 (기본: false)
}

표시 옵션

interface DisplayOptions {
  showValidationPanel?: boolean; // 검증 패널 표시 (기본: false)
  compactValidation?: boolean; // 간소화된 검증 UI (기본: false)
  showDeveloperInfo?: boolean; // 개발자 정보 표시 (기본: false)
}

🔧 개발자 가이드

1. 새로운 WebType 추가

새로운 웹타입을 추가하려면 양쪽 모두 업데이트해야 합니다:

프론트엔드 (frontend/types/unified-web-types.ts):

export type BaseWebType =
  | "text"
  | "number"
  // ... 기존 타입들
  | "new-type"; // 새 타입 추가

백엔드 (backend-node/src/types/unified-web-types.ts):

export type BaseWebType =
  | "text"
  | "number"
  // ... 기존 타입들
  | "new-type"; // 동일하게 추가

2. 커스텀 검증 규칙 추가

formValidation.ts에서 새로운 검증 로직을 추가할 수 있습니다:

const validateCustomField = (
  fieldName: string,
  value: any,
  config?: Record<string, any>
): FieldValidationResult => {
  // 커스텀 검증 로직
  if (customValidationFails) {
    return {
      isValid: false,
      error: {
        field: fieldName,
        code: "CUSTOM_ERROR",
        message: "커스텀 오류 메시지",
        severity: "error",
        value,
      },
    };
  }

  return { isValid: true };
};

3. 테이블 컬럼 정보 캐싱

시스템은 자동으로 테이블 컬럼 정보를 캐싱합니다:

  • 클라이언트: 10분간 캐싱
  • 서버: 10분간 캐싱
  • 수동 캐시 클리어: enhancedFormService.clearTableCache(tableName)

🚨 트러블슈팅

자주 발생하는 문제

1. "테이블 정보를 찾을 수 없습니다"

해결책:
1. 테이블명이 정확한지 확인
2. table_type_columns 테이블에 해당 테이블 정보가 있는지 확인
3. 데이터베이스 연결 상태 확인 (http://localhost:8080/api/table-management/health)

2. "컬럼이 존재하지 않습니다"

해결책:
1. WidgetComponent의 columnName 속성 확인
2. 데이터베이스 스키마와 일치하는지 확인
3. 제안된 유사한 컬럼명 사용 고려

3. "타입 변환 오류"

해결책:
1. webType과 PostgreSQL 데이터 타입 호환성 확인
2. detailSettings의 제약조건 검토
3. 입력값 형식 확인 (예: 날짜는 YYYY-MM-DD)

4. 검증이 작동하지 않음

해결책:
1. enableEnhancedValidation={true} 설정 확인
2. tableColumns 배열이 올바르게 전달되었는지 확인
3. screenInfo에 id와 tableName이 있는지 확인

로그 분석

개발 모드에서는 상세한 로그가 제공됩니다:

// 클라이언트 로그
console.log("🔍 개선된 검증 시스템 사용");
console.log("💾 폼 데이터 저장 요청:", formData);

// 서버 로그
logger.info("개선된 폼 저장 시작: tableName");
logger.debug("Data after validation:", transformedData);

📊 성능 모니터링

성능 지표

시스템은 다음 성능 지표를 추적합니다:

  • 검증 시간: 클라이언트 검증 수행 시간
  • 저장 시간: 서버 저장 처리 시간
  • 전체 시간: 요청부터 응답까지 총 시간
  • 캐시 히트율: 테이블 컬럼 정보 캐시 사용률

성능 최적화 팁

  1. 테이블 컬럼 정보 사전 로드:

    // 화면 로드 시 테이블 정보 미리 캐싱
    await enhancedFormService.getTableColumns(tableName);
    
  2. 검증 지연 시간 조정:

    // 빠른 응답이 필요한 경우
    validationOptions={{ validationDelay: 100 }}
    
    // 서버 부하를 줄이려는 경우
    validationOptions={{ validationDelay: 1000 }}
    
  3. 불필요한 실시간 검증 비활성화:

    // 단순한 폼의 경우
    validationOptions={{ enableRealTimeValidation: false }}
    

🔄 마이그레이션 가이드

기존 코드에서 새 시스템으로

  1. 단계별 마이그레이션:

    // 1단계: 기존 코드 유지하면서 검증만 추가
    <InteractiveScreenViewer
      {...existingProps}
      enableEnhancedValidation={true}
      tableColumns={tableColumns}
    />
    
    // 2단계: 검증 패널 추가
    <InteractiveScreenViewer
      {...existingProps}
      enableEnhancedValidation={true}
      tableColumns={tableColumns}
      showValidationPanel={true}
    />
    
    // 3단계: 완전 마이그레이션
    <EnhancedInteractiveScreenViewer
      {...existingProps}
      tableColumns={tableColumns}
      showValidationPanel={true}
    />
    
  2. API 호출 변경:

    // 기존 방식
    await dynamicFormApi.saveFormData(formData);
    
    // 새로운 방식 (권장)
    await dynamicFormApi.saveData(formData);
    

📞 지원 및 문의

개발 지원

  • 데모 페이지: /admin/validation-demo
  • API 상태 확인: /api/table-management/health
  • 로그 레벨: 개발 환경에서 DEBUG 로그 활성화

추가 개발 계획

  1. Phase 2: 웹타입별 상세 설정 UI
  2. Phase 3: 고급 검증 규칙 (정규식, 범위 등)
  3. Phase 4: 조건부 필드 및 계산 필드
  4. Phase 5: 실시간 협업 기능

이 가이드는 화면관리 검증 시스템의 핵심 기능과 사용법을 다룹니다. 추가 질문이나 개선 제안은 개발팀에 문의해주세요! 🚀