Commit Graph

572 Commits

Author SHA1 Message Date
kjs 258bd80201 액션 노드들 로직 구현 2025-10-02 17:51:15 +09:00
kjs 37e018b33c 외부 db노드 설정 2025-10-02 16:43:40 +09:00
kjs 0743786f9b feat: 노드 기반 데이터 플로우 시스템 구현
- 노드 에디터 UI 구현 (React Flow 기반)
  - TableSource, DataTransform, INSERT, UPDATE, DELETE, UPSERT 노드
  - 드래그앤드롭 노드 추가 및 연결
  - 속성 패널을 통한 노드 설정
  - 실시간 필드 라벨 표시 (column_labels 테이블 연동)

- 데이터 변환 노드 (DataTransform) 기능
  - EXPLODE: 구분자로 1개 행 → 여러 행 확장
  - UPPERCASE, LOWERCASE, TRIM, CONCAT, SPLIT, REPLACE 등 12가지 변환 타입
  - In-place 변환 지원 (타겟 필드 생략 시 소스 필드 덮어쓰기)
  - 변환된 필드가 하위 액션 노드에 자동 전달

- 노드 플로우 실행 엔진
  - 위상 정렬을 통한 노드 실행 순서 결정
  - 레벨별 병렬 실행 (Promise.allSettled)
  - 부분 실패 허용 (한 노드 실패 시 연결된 하위 노드만 스킵)
  - 트랜잭션 기반 안전한 데이터 처리

- UPSERT 액션 로직 구현
  - DB 제약 조건 없이 SELECT → UPDATE or INSERT 방식
  - 복합 충돌 키 지원 (예: sales_no + product_name)
  - 파라미터 인덱스 정확한 매핑

- 데이터 소스 자동 감지
  - 테이블 선택 데이터 (selectedRowsData) 자동 주입
  - 폼 입력 데이터 (formData) 자동 주입
  - TableSource 노드가 외부 데이터 우선 사용

- 버튼 컴포넌트 통합
  - 기존 관계 실행 + 새 노드 플로우 실행 하이브리드 지원
  - 노드 플로우 선택 UI 추가
  - API 클라이언트 통합 (Axios)

- 개발 문서 작성
  - 노드 기반 제어 시스템 개선 계획
  - 노드 연결 규칙 설계
  - 노드 실행 엔진 설계
  - 노드 구조 개선안
  - 버튼 통합 분석
2025-10-02 16:22:29 +09:00
kjs db25b0435f 제어관리 수정 2025-10-02 11:12:45 +09:00
kjs 3f76d16afe feat: 버튼 컴포넌트 수정 액션에서 모달 제목/설명 전달
변경 사항:
1. InteractiveScreenViewer - handleEditAction 수정 
   - config에서 editModalTitle, editModalDescription 읽기
   - openEditModal 이벤트로 제목/설명 전달

2. ButtonTypeConfig 타입 추가 
   - editModalTitle 필드 추가
   - editModalDescription 필드 추가

3. ButtonConfigPanel 수정 
   - webTypeConfig에도 제목/설명 저장
   - 이중 저장 (action + webTypeConfig)

결과:
-  버튼의 수정 액션 실행 시 설정한 제목이 모달에 표시됨
-  버튼의 수정 액션 실행 시 설정한 설명이 모달에 표시됨
-  EditModal이 openEditModal 이벤트에서 제목/설명 받음
-  전체 데이터 흐름 완성
2025-10-01 17:45:29 +09:00
kjs 114928ca4f feat: 수정 버튼 액션에 제목과 설명 설정 기능 추가
추가된 기능:
1. ButtonConfigPanel - 수정 모달 제목/설명 입력 필드 추가 
2. EditModal - 제목/설명 props 추가 및 조건부 헤더 렌더링 
3. DataTableConfigPanel - 수정 모달 설정 섹션 추가 
4. InteractiveDataTable - editModalConfig에서 제목/설명 읽기 
5. screen/[screenId]/page - 제목/설명 전달 추가 
6. 타입 정의 - editModalConfig 추가 

변경된 파일:
- frontend/components/screen/config-panels/ButtonConfigPanel.tsx
- frontend/components/screen/EditModal.tsx
- frontend/components/screen/InteractiveDataTable.tsx
- frontend/components/screen/panels/DataTableConfigPanel.tsx
- frontend/app/(main)/screens/[screenId]/page.tsx
- frontend/types/screen-legacy-backup.ts

결과:
-  수정 버튼에서 모달 제목과 설명을 설정할 수 있음
-  데이터테이블에서도 수정 모달 설정 가능
-  제목과 설명이 모달 헤더에 표시됨
-  설정하지 않으면 기본 동작 유지
2025-10-01 17:41:30 +09:00
kjs b452f148a9 오라클 제어 수정 2025-10-01 17:36:17 +09:00
kjs 852075c799 fix: Oracle INSERT 자동 커밋 추가
문제:
- Oracle DB에 INSERT 해도 데이터가 실제로 저장되지 않음
- executeQuery에서 autoCommit 옵션이 없었음

수정:
1. 쿼리 타입 확인 (INSERT/UPDATE/DELETE/MERGE)
2. DML 쿼리는 autoCommit: true 설정 
3. SELECT 쿼리는 autoCommit: false (기본값)

로깅 추가:
- isDML 확인
- autoCommit 상태
- rowsAffected 추가

결과:
-  INSERT 실행 후 자동 COMMIT
-  UPDATE/DELETE도 자동 COMMIT
-  SELECT는 영향 없음
-  오라클 데이터 정상 저장
2025-10-01 17:34:56 +09:00
kjs 8615a358c0 fix: EditModal 라벨 표시 및 중복 박스 제거
문제:
1. 라벨이 보이지 않음 (hideLabel=true, labelDisplay=false)
2. 인풋이 중복으로 보임 (불필요한 패딩/테두리)

수정:
1. hideLabel={false} 
2. labelDisplay: true 
3. 컴포넌트 감싸는 div에서 스타일 제거 (패딩, 테두리) 

결과:
-  라벨 정상 표시
-  깔끔한 인풋 렌더링
-  원본 레이아웃 유지
2025-10-01 17:27:24 +09:00
kjs 7bb70bdd3b fix: ActionConditionBuilder 모든 Select 중복 키 수정
수정된 위치:
- line 271: fromColumns (소스 필드)
- line 289: toColumns (소스 필드)
- line 623: fromColumns (필드 매핑)
- line 638: toColumns (필드 매핑)
- line 737: getAvailableFieldsForMapping (대상 필드)

모든 .map() 앞에 .filter() 추가:
- 빈 columnName 제외
- 중복 키 방지
- React 경고 해결
2025-10-01 17:23:18 +09:00
kjs c3e6eff0fe fix: ActionConditionBuilder 중복 키 에러 수정
문제:
- toColumns에 빈 문자열 columnName 중복
- 중복된 키 to_ 생성
- React 키 중복 경고

수정:
- fromColumns filter 추가
- toColumns filter 추가
- 빈 문자열 컬럼 제외

에러:
Encountered two children with the same key
2025-10-01 17:21:08 +09:00
kjs b84f35d514 테이블 리스트 오류수정 2025-10-01 17:18:48 +09:00
kjs 767c031629 fix: Select Item 빈 문자열 value 에러 수정
문제:
- SelectItem에 빈 문자열 value 전달 시 에러
- col.columnName이 빈 문자열일 수 있음

수정:
- filter에 col.columnName 체크 추가
- 빈 문자열 컬럼 제외

에러 메시지:
A <Select.Item /> must have a value prop
that is not an empty string
2025-10-01 17:18:06 +09:00
kjs d22e83d234 fix: UPDATE 액션 formData 기본 포함 및 로깅 추가
UPDATE 액션 실행 시:
- formData를 기본으로 복사하여 기본키 포함
- 상세 로깅으로 디버깅 지원
- 백엔드 동적 기본키 조회 구현
2025-10-01 15:51:13 +09:00
kjs 151de4148c fix: UPDATE 액션 동적 기본키 조회 기능 추가
문제:
- UPDATE 액션 실행 시 ID 필요 에러
- executeUpdate가 하드코딩된 id 필드만 찾음
- 실제 테이블 기본키는 다를 수 있음

해결:
1. 테이블 기본키 동적 조회
2. 기본키 값 동적 추출
3. 동적 UPDATE 쿼리 생성
4. 상세 로깅 추가

결과:
- 모든 테이블의 UPDATE 동작
- 동적 기본키 처리
2025-10-01 15:48:29 +09:00
kjs cb1a6ad672 feat: 버튼 저장 후 제어 자동 실행 기능 추가
문제:
- 버튼에 제어를 연결했지만 실행되지 않음
- ButtonActionExecutor가 제어 실행 로직이 없었음

수정:
1. buttonActions.ts:
   - executeAfterSaveControl() 메서드 추가
   - handleSave()에서 저장 성공 후 제어 실행
   - dataflowTiming='after'일 때만 실행
   - ImprovedButtonActionExecutor 통해 관계 기반 제어 실행

2. ButtonActionConfig 타입 확장:
   - dataflowTiming 필드 추가

3. ButtonActionContext 타입 확장:
   - buttonId, userId, companyCode 필드 추가

4. Import 추가:
   - ExtendedControlContext 타입 import

동작 흐름:
save 버튼 클릭
→ handleSave() 실행
→ 데이터 저장 (INSERT/UPDATE)
→  저장 성공
→ executeAfterSaveControl() 자동 호출
→ ImprovedButtonActionExecutor로 관계 실행
→ 연결된 제어 액션들 순차 실행

결과:
-  저장 후 연결된 제어 자동 실행
-  제어 실패 시 에러 처리
-  기존 기능 영향 없음
2025-10-01 15:31:31 +09:00
kjs 352d4c3126 fix: query 함수 파라미터 배열 전달 오류 수정
문제:
- query() 함수에 스프레드 연산자로 파라미터 전달
- pg 라이브러리는 배열을 요구함
- 'Query values must be an array' 에러 발생

수정:
tableManagementService.ts (2곳):
- line 1501: query(...searchValues) → query(searchValues)
- line 1512: query(...searchValues, size, offset)
            → query([...searchValues, size, offset])

결과:
-  쿼리 파라미터 배열로 정확히 전달
-  테이블 데이터 조회 정상 동작
2025-10-01 15:21:08 +09:00
kjs 6fc140b423 fix: Docker 파일에서 Prisma 명령 제거
문제:
- docker/dev/backend.Dockerfile에 Prisma 명령 남아있음
- docker/prod/backend.Dockerfile에 Prisma 명령 남아있음
- Docker 빌드 시 '/prisma' not found 에러 발생

해결:

1. docker/dev/backend.Dockerfile:
   - COPY prisma ./prisma 제거
   - RUN npx prisma generate 제거

2. docker/prod/backend.Dockerfile:
   - Dependencies stage: Prisma 관련 코드 제거
   - Build stage: COPY prisma 제거, npx prisma generate 제거
   - Runtime stage: 주석 업데이트

결과:
-  Docker 빌드 에러 해결
-  Prisma 의존성 완전 제거
-  개발/운영 환경 모두 Raw Query 기반
2025-10-01 15:11:07 +09:00
kjs 808a0244d5 fix: @types/uuid 패키지 추가
문제:
- uuid 모듈의 타입 정의 파일 없음
- TypeScript 컴파일 에러 발생

해결:
- npm install --save-dev @types/uuid
- @types/uuid@10.0.0 설치

결과:
-  TypeScript 컴파일 에러 해결
-  uuid 모듈 타입 안전성 확보
2025-10-01 15:08:37 +09:00
kjs a93fb0f684 Merge pull request 'feature/prisma-to-raw-query-phase1-complete' (#82) from feature/prisma-to-raw-query-phase1-complete into main
Reviewed-on: http://39.117.244.52:3000/kjs/ERP-node/pulls/82
2025-10-01 15:07:15 +09:00
kjs 401bbf85dc Merge branch 'main' into feature/prisma-to-raw-query-phase1-complete 2025-10-01 15:07:07 +09:00
kjs 9154c9c0ca docs: 모든 문서에서 Prisma 참조 제거 및 Raw Query로 업데이트
변경된 파일:

1. DOCKER.md:
   - 기술 스택: Prisma → PostgreSQL (Raw Query)
   - Prisma 관련 섹션 제거
   - 데이터베이스 관련 섹션으로 교체
   - 프로젝트 구조: prisma/ → database/

2. backend-node/Dockerfile.win:
   - npx prisma generate 명령 제거
   - Prisma 클라이언트 생성 단계 삭제

3. backend-node/README.md:
   - ORM: Prisma → Database: PostgreSQL (Raw Query with pg)
   - 프로젝트 구조: prisma/ → database/
   - Prisma 클라이언트 생성 단계 제거
   - npx prisma studio 스크립트 제거
   - 데이터베이스 스키마 변경 가이드 업데이트
   - Phase 1 체크리스트: Prisma → Raw Query

문서 정리 완료:
-  Docker 가이드 업데이트
-  Dockerfile Prisma 명령 제거
-  README 기술 스택 업데이트
-  개발 가이드 Raw Query로 변경
2025-10-01 15:03:08 +09:00
kjs 920cfbb3fd chore: Prisma 패키지 및 의존성 완전 제거
npm uninstall로 완전 제거:
-  @prisma/client 제거
-  prisma (devDependency) 제거
-  관련 32개 패키지 제거

node_modules 정리:
-  node_modules/@prisma 디렉토리 제거
-  node_modules/.prisma 디렉토리 제거
-  package-lock.json 업데이트

최종 검증 완료:
1. package.json prisma: 0개 
2. package-lock.json prisma: 0개 
3. node_modules Prisma 디렉토리: 0개 
4. prisma. 코드 호출: 0개 
5. PrismaClient import: 0개 
6. Prisma 타입 사용: 0개 
7. Prisma 에러 코드: 0개 
8. PostgreSQL 에러 코드: 9개 
9. TypeScript 컴파일: 에러 없음 

100% 완전 제거 완료! 🎉
2025-10-01 14:59:51 +09:00
kjs ec5fae1a4d fix: Prisma 에러 처리 코드를 PostgreSQL 에러 코드로 변경
변경사항:

1. errorHandler.ts:
   - Prisma 에러 처리 제거
   - PostgreSQL 에러 코드 기반 처리 추가:
     * 23505: unique_violation (중복 데이터)
     * 23503: foreign_key_violation (참조 무결성)
     * 23502: not_null_violation (필수값 누락)

2. dataflowDiagramController.ts:
   - P2002 (Prisma) → 23505 (PostgreSQL)
   - unique constraint 에러 처리 개선

3. commonCodeController.ts:
   - Prisma 에러 처리 주석 수정
   - PostgreSQL 23505 에러 코드 추가

최종 확인:
-  prisma. 호출: 0개
-  PrismaClient import: 0개
-  Prisma 파일: 0개
-  package.json Prisma 의존성: 0개
-  TypeScript 컴파일 에러: 0개
-  모든 Prisma 관련 코드 제거 완료
2025-10-01 14:57:25 +09:00
kjs 643f6e0d7d chore: Prisma 관련 파일 완전 제거 🧹
제거된 파일들:

1. 컴파일된 파일:
   - backend-node/dist/config/database.js

2. 테스트 파일 (3개):
   - backend-node/src/tests/database.test.ts
   - backend-node/src/tests/authService.test.ts
   - backend-node/src/tests/integration/auth.integration.test.ts

3. Prisma 관련 스크립트 (10개):
   - test-db.js, check-password.js, check-actual-password.js
   - update-password.js, create-test-user.js, simple-test-user.js
   - clean-screen-tables.js, test-jwt.js, test-token.js
   - test-token.txt

4. Prisma 디렉토리:
   - backend-node/prisma/schema.prisma
   - backend-node/prisma/migrations/

수정된 파일들:

1. backend-node/package.json:
    Prisma 스크립트 제거 (prisma:generate, migrate, studio, seed)
    @prisma/client 의존성 제거
    prisma 개발 의존성 제거
    keywords: prisma → postgresql

2. .gitignore:
    Prisma 관련 항목 제거

3. src/services/dataflowDiagramService.ts:
    포맷팅 수정

최종 상태:
-  Prisma 호출: 0개
-  Prisma 관련 파일: 0개
-  Raw Query 기반 시스템으로 완전 전환
2025-10-01 14:54:44 +09:00
kjs fab8909195 feat: 레거시 src/services/dataflowDiagramService.ts Prisma 제거
변경사항:
1. src/services/dataflowDiagramService.ts:
   - PrismaClient import 제거
   - database/db의 query, queryOne import 추가
   - 모든 Prisma 호출 Raw Query로 전환:
      getDataflowDiagrams: findMany + count → query + queryOne
      getDataflowDiagramById: findFirst → queryOne
      createDataflowDiagram: create → queryOne
      updateDataflowDiagram: update → queryOne (동적 UPDATE)
      deleteDataflowDiagram: delete → query
      copyDataflowDiagram: findFirst → queryOne

2. src/database/db.ts 생성:
   - backend-node/src/database/db.ts 복사
   - 레거시 코드와 호환성 유지

최종 확인:
-  src/ 디렉토리: Prisma 호출 0개
-  backend-node/ 디렉토리: Prisma 호출 0개
-  전체 프로젝트: Prisma 완전 제거
2025-10-01 14:51:45 +09:00
kjs 440803e203 fix: dbTypeCategoryService 타입 에러 수정
문제:
- queryOne이 null을 반환할 수 있지만 타입이 undefined 예상

해결:
- category || undefined로 null을 undefined로 변환

최종 확인:
-  TypeScript 컴파일 에러: 0개
-  Prisma 호출: 0개
-  모든 전환 완료: 469/469 (100%)
2025-10-01 14:47:29 +09:00
kjs b5fe2117af feat: Prisma 완전 제거 완료 🎉
최종 작업:

1. config/database.ts 삭제:
   - Prisma 기반 database.ts 완전 제거
   - 더 이상 사용되지 않는 파일

2. referenceCacheService.ts 전환 (3개):
   -  getTableRowCount: $queryRawUnsafe → query
   -  cacheReferenceTable: $queryRawUnsafe → query
   -  batchLookup: $queryRaw → query (ANY 연산자)

전체 완료:
-  모든 Prisma 호출 전환 완료
-  PrismaClient import 완전 제거 (에러핸들러 제외)
-  database.ts 삭제
-  Raw Query 기반 시스템으로 완전 전환

최종 진행률: 54/54 (100%) 🎉
2025-10-01 14:44:49 +09:00
kjs e444dd9d39 fix: multiConnectionQueryService 변수명 충돌 해결
문제:
- 로컬 변수 'query'와 import한 함수 'query'가 충돌
- TypeScript 에러: 'query' is used before being assigned

해결:
- 로컬 변수 'query'를 'sql'로 변경
- SELECT 쿼리 문자열 변수명 통일 (query → sql)

영향:
- executeMainDbOperation의 select case만 수정
- insert, update, delete는 이미 고유한 변수명 사용
2025-10-01 14:41:46 +09:00
kjs bc54d37ff2 feat: Routes & Service Prisma 전환 완료
완료된 파일:

1. ddlRoutes.ts (2개):
   -  health check: PrismaClient 동적 import 제거
   -  SELECT 1 쿼리를 query() 함수로 변경

2. companyManagementRoutes.ts (2개):
   -  findUnique → queryOne (회사 존재 확인)
   -  update → query (soft delete)

3. multiConnectionQueryService.ts (4개):
   -  executeSelect: $queryRawUnsafe → query
   -  executeInsert: $queryRawUnsafe → query
   -  executeUpdate: $queryRawUnsafe → query
   -  executeDelete: $queryRawUnsafe → query

기술적 개선:
- 동적 import 제거로 성능 향상
- 일관된 쿼리 인터페이스 사용
- 파라미터 전달 방식 통일 (...params → params)

전체 진행률: 50/54 (92.6%)
남은 작업: database.ts (4개 - 제거 예정)
2025-10-01 14:41:04 +09:00
kjs 97f4d11870 fix: buttonActionStandardController pool 사용을 transaction 함수로 변경
문제:
- pool이 null일 수 있다는 TypeScript 에러 발생
- pool.connect()를 직접 사용하는 것은 안전하지 않음

해결:
- pool import를 transaction으로 변경
- 수동 트랜잭션 관리 코드를 transaction 함수로 교체
- BEGIN/COMMIT/ROLLBACK 자동 처리
- 파라미터 개수 최적화 (updated_date를 NOW()로 변경)

장점:
- 타입 안전성 향상
- 에러 처리 자동화
- 코드 간소화
2025-10-01 14:38:14 +09:00
kjs fcf887ae76 fix: pool export 추가로 buttonActionStandardController 컴파일 에러 해결
문제:
- buttonActionStandardController에서 pool을 import하려 했으나
- db.ts에서 pool이 export되지 않아 컴파일 에러 발생

해결:
- db.ts에 'export { pool }' 추가
- pool 직접 접근이 필요한 경우를 위해 명시적 export

영향받는 파일:
- backend-node/src/database/db.ts
- backend-node/src/controllers/buttonActionStandardController.ts (사용)
2025-10-01 14:37:33 +09:00
kjs f2f0c33bad feat: webTypeStandardController & fileController Prisma 전환 완료
컨트롤러 레이어 전환:

webTypeStandardController.ts (11개):
-  getWebTypes: findMany → query (동적 WHERE, ILIKE)
-  getWebType: findUnique → queryOne
-  createWebType: findUnique + create → queryOne (중복 체크 + INSERT)
-  updateWebType: update → query (동적 UPDATE, 11개 필드)
-  deleteWebType: delete → query (RETURNING)
-  updateSortOrder: $transaction → transaction (batch update)
-  getCategories: groupBy → query (GROUP BY, COUNT)

fileController.ts (1개):
-  downloadFile: findUnique → queryOne

기술적 구현:
- 동적 WHERE 절: ILIKE를 사용한 검색
- 동적 UPDATE: 11개 필드 조건부 업데이트
- 트랜잭션: transaction 함수로 batch update
- GROUP BY: 카테고리별 집계

전체 진행률: 42/29 (145%) - 컨트롤러 완료
남은 작업: Routes(4), Service(4), Config(4)
2025-10-01 14:36:36 +09:00
kjs 7919079362 docs: Phase 4 남은 Prisma 호출 전환 계획서 작성
현재 상황 분석 및 문서화:

컨트롤러 레이어:
-  adminController.ts (28개) 완료
-  screenFileController.ts (2개) 완료
- 🔄 남은 파일 (12개 호출):
  * webTypeStandardController.ts (11개)
  * fileController.ts (1개)

Routes & Services:
- ddlRoutes.ts (2개)
- companyManagementRoutes.ts (2개)
- multiConnectionQueryService.ts (4개)

Config:
- database.ts (4개 - 제거 예정)

새로운 계획서:
- PHASE4_REMAINING_PRISMA_CALLS.md (상세 전환 계획)
- 파일별 Prisma 호출 상세 분석
- 전환 패턴 및 우선순위 정리

전체 진행률: 445/444 (100.2%)
남은 작업: 12개 (추가 조사 필요한 파일 제외)
2025-10-01 14:33:08 +09:00
kjs 381d19caee docs: Phase 4 컨트롤러 레이어 마이그레이션 계획서 작성
남은 70개 Prisma 호출 분석 및 계획:

컨트롤러별 호출 수:
- adminController.ts (28개)
- webTypeStandardController.ts (11개)
- fileController.ts (11개)
- buttonActionStandardController.ts (11개)
- entityReferenceController.ts (4개)
- dataflowExecutionController.ts (3개)
- screenFileController.ts (2개)

계획서:
- PHASE4_CONTROLLER_LAYER_MIGRATION.md (통합)
- PHASE4.1_ADMIN_CONTROLLER_MIGRATION.md (상세)

특징: 대부분 단순 CRUD
전략: Service Layer 이동 고려
2025-10-01 13:42:56 +09:00
hjjeong 841e8d656d Merge branch 'feature/dashboard-management' 2025-10-01 13:39:33 +09:00
hjjeong c58dd9ff7e console.log를 주석처리 문법오류 해결 2025-10-01 13:36:04 +09:00
kjs 13a9521977 fix: 배치 스케줄러 컬럼명 수정
batch_mappings 테이블의 실제 컬럼명으로 수정:
- field_name → from_column_name, to_column_name
- source_field → from_table_name, to_table_name
- 전체 컬럼 구조를 실제 DB 스키마에 맞게 수정

수정된 함수:
- loadActiveBatchConfigs()
- updateBatchSchedule()

에러 해결: column bm.field_name does not exist
2025-10-01 13:34:56 +09:00
kjs 505f656c15 feat: Phase 3.15 배치 서비스 Raw Query 전환 완료
4개 서비스 24개 Prisma 호출 전환 완료

배치 서비스 전환:
- BatchExternalDbService (8개)
- BatchExecutionLogService (7개)
- BatchManagementService (5개)
- BatchSchedulerService (4개)

주요 기술:
- json_agg + json_build_object
- 동적 WHERE 절
- 동적 UPDATE 쿼리
- PostgreSQL placeholders

Phase 3 완료
문서: PHASE3.15_BATCH_SERVICES_MIGRATION.md
2025-10-01 13:30:20 +09:00
kjs 3d8f70e181 feat: Phase 3.16 데이터 관리 서비스 Raw Query 전환 완료
4개 서비스 18개 Prisma 호출 전환 완료:

1. **EnhancedDynamicFormService** (6개)
   - validateTableExists - information_schema 조회
   - getTableColumns - 테이블 컬럼 정보 조회 with 캐싱
   - getColumnWebTypes - 웹타입 정보 조회
   - getPrimaryKeys - Primary Key 조회
   - performInsert - 동적 INSERT with RETURNING
   - performUpdate - 동적 UPDATE with RETURNING

2. **DataMappingService** (5개)
   - getSourceData - 소스 테이블 데이터 조회
   - executeInsert - 동적 INSERT
   - executeUpsert - ON CONFLICT DO UPDATE
   - executeUpdate - 동적 UPDATE
   - disconnect - 제거 (Raw Query 불필요)

3. **DataService** (4개)
   - getTableData - 동적 SELECT with 동적 WHERE/ORDER BY
   - checkTableExists - information_schema 테이블 존재 확인
   - getTableColumnsSimple - 컬럼 정보 조회
   - getColumnLabel - 컬럼 라벨 조회

4. **AdminService** (3개)
   - getAdminMenuList - WITH RECURSIVE 쿼리
   - getUserMenuList - WITH RECURSIVE 쿼리
   - getMenuInfo - LEFT JOIN으로 회사 정보 포함

기술적 성과:
- 변수명 충돌 해결 (query vs sql)
- WITH RECURSIVE 쿼리 전환
- Prisma include → LEFT JOIN 전환
- 동적 쿼리 생성 (WHERE, ORDER BY)
- SQL 인젝션 방지 (컬럼명 검증)

진행률: Phase 3 173/186 (93.0%)
문서: PHASE3.16_DATA_MANAGEMENT_SERVICES_MIGRATION.md
2025-10-01 12:27:32 +09:00
kjs 1791cd9f3f docs: Phase 3.17~3.18 완료 확인 및 계획서 작성
이미 전환 완료된 서비스 확인 및 문서화:

1. **Phase 3.17: ReferenceCacheService** (3개)
   - 이미 Raw Query로 전환 완료
   - 참조 데이터 캐싱 서비스
   - 메모리 캐싱으로 성능 최적화

2. **Phase 3.18: DDLExecutionService** (6개)
   - 이미 Raw Query로 전환 완료
   - DDL 실행 및 관리
   - 안전성 검증 및 감사 로깅
   - DDLAuditLogger 연동

Phase 3 진행률: 155/162 (95.7%)

남은 작업:
- 배치 관련 서비스 (24개)
- 데이터 관리 서비스 (18개)
- 컨트롤러 레이어 (Phase 4)
2025-10-01 12:16:15 +09:00
kjs 5d1e3c35f4 docs: Phase 3.14 AuthService 문서 업데이트
AuthService는 Phase 1.5에서 이미 Raw Query로 전환 완료됨

전환 완료 내역:
- loginPwdCheck - 로그인 비밀번호 검증
- insertLoginAccessLog - 로그인 로그 기록
- getUserInfo - 사용자 정보 조회
- updateLastLoginDate - 마지막 로그인 시간 업데이트
- checkUserPermission - 사용자 권한 확인

주요 특징:
- EncryptUtil 활용 비밀번호 검증
- JWT 토큰 생성 및 검증
- 상세한 로그인 이력 기록
- 안전한 에러 처리

문서: PHASE3.14_AUTH_SERVICE_MIGRATION.md
진행률: Phase 3 146/162 (90.1%)
2025-10-01 12:13:39 +09:00
hjjeong 716a9a3b31 Merge branch 'feature/dashboard-management' into main
대시보드 관리 시스템 통합
- 충돌 해결 완료
- 백엔드/프론트엔드 대시보드 기능 추가
2025-10-01 12:10:42 +09:00
kjs 28eff9ecc1 feat: Phase 3.13 EntityJoinService Raw Query 전환 완료
엔티티 조인 관계 관리 서비스의 모든 Prisma 호출을 Raw Query로 전환

전환 완료: 5개 Prisma 호출

1. detectEntityJoins - 엔티티 컬럼 감지
   - column_labels.findMany to query
   - web_type = entity 필터

2-3. validateJoinConfig - 테이블/컬럼 존재 확인
   - queryRaw to query
   - information_schema 조회

4-5. getReferenceTableColumns - 컬럼 정보/라벨 조회
   - queryRaw, findMany to query
   - 문자열 타입 컬럼 필터링

기술적 개선사항:
- information_schema 쿼리 파라미터 바인딩
- IS NOT NULL 조건 변환
- 타입 안전성 강화

문서: PHASE3.13_ENTITY_JOIN_SERVICE_MIGRATION.md
진행률: Phase 3 141/162 (87.0%)
2025-10-01 12:10:34 +09:00
kjs b4b4c774fb feat: Phase 3.12 ExternalCallConfigService Raw Query 전환 완료
외부 호출 설정 관리 서비스의 모든 Prisma 호출을 Raw Query로 전환:

## 전환 완료 (8개 Prisma 호출)

1. **getConfigs()** - 목록 조회
   - prisma.findMany → query<ExternalCallConfig>()
   - 동적 WHERE 조건 (5개 필터)
   - ILIKE 검색 (config_name, description)

2. **getConfigById()** - 단건 조회
   - prisma.findUnique → queryOne<ExternalCallConfig>()

3-4. **createConfig()** - 생성
   - 중복 검사: prisma.findFirst → queryOne()
   - 생성: prisma.create → queryOne() with INSERT RETURNING
   - JSON 필드 처리: config_data

5-6. **updateConfig()** - 수정
   - 중복 검사: prisma.findFirst → queryOne() with id != $4
   - 수정: prisma.update → queryOne() with 동적 UPDATE
   - 9개 필드에 대한 조건부 SET 절 생성

7. **deleteConfig()** - 논리 삭제
   - prisma.update → query() with is_active = 'N'

8. **getExternalCallConfigsForButtonControl()** - 버튼 제어용
   - prisma.findMany with select → query() with SELECT

## 기술적 개선사항

- **동적 WHERE 조건**: 5개 필터 조건 조합 및 파라미터 인덱싱
- **동적 UPDATE 쿼리**: 변경된 필드만 포함하는 SET 절 생성
- **JSON 필드**: config_data를 JSON.stringify()로 처리
- **ILIKE 검색**: 대소문자 구분 없는 검색 구현
- **중복 검사**: id 제외 조건으로 자신 제외 로직 유지

## 코드 정리

- prisma import 완전 제거
- query, queryOne 함수 사용
- 컴파일 및 린터 오류 없음

문서: PHASE3.12_EXTERNAL_CALL_CONFIG_SERVICE_MIGRATION.md
진행률: Phase 3 136/162 (84.0%)
2025-10-01 12:07:14 +09:00
hjjeong 5f63c24c42 feat: 대시보드 관리 시스템 구현
## 백엔드
- DashboardController: 대시보드 CRUD 및 쿼리 실행 API
- DashboardService: 비즈니스 로직 처리
- PostgreSQL 연동 및 데이터 관리

## 프론트엔드
- DashboardDesigner: 캔버스 기반 대시보드 디자이너
- QueryEditor: SQL 쿼리 편집 및 미리보기
- ChartRenderer: 다양한 차트 타입 지원 (Bar, Line, Area, Donut, Stacked, Combo)
- DashboardViewer: 실시간 데이터 반영 뷰어

## 개선사항
- 콘솔 로그 프로덕션 준비 (주석 처리)
- 차트 컴포넌트 확장 (6가지 타입)
- 실시간 쿼리 실행 및 데이터 바인딩
2025-10-01 12:06:24 +09:00
kjs 510c7b2416 fix: DDLAuditLogger 변수명 충돌 해결
getRecentDDLLogs() 함수에서 변수명 충돌 수정:
- query 변수를 sql로 변경 (query 함수와 충돌)
- TypeScript 컴파일 에러 해결

에러: TS2349 This expression is not callable
해결: const query → const sql
2025-10-01 12:03:14 +09:00
kjs efb580b153 feat: Phase 3.11 DDLAuditLogger Raw Query 전환 완료
DDL 감사 로깅 서비스의 모든 Prisma 호출을 Raw Query로 전환:

## 전환 완료 (8개 Prisma 호출)

1. **logDDLExecution()** - DDL 실행 로그 INSERT
   - prisma.$executeRaw → query()
   - 7개 파라미터로 로그 기록

2. **getAuditLogs()** - 감사 로그 목록 조회
   - prisma.$queryRawUnsafe → query<any>()
   - 동적 WHERE 조건 생성
   - 페이징 (LIMIT)

3. **getDDLStatistics()** - 통계 조회 (4개 쿼리)
   - totalStats: CASE WHEN 집계로 성공/실패 통계
   - ddlTypeStats: GROUP BY로 DDL 타입별 통계
   - userStats: GROUP BY로 사용자별 통계
   - recentFailures: 최근 실패 로그 조회

4. **getTableDDLHistory()** - 테이블 히스토리
   - prisma.$queryRawUnsafe → query<any>()
   - table_name 필터링

5. **cleanupOldLogs()** - 오래된 로그 삭제
   - prisma.$executeRaw → query()
   - 날짜 기반 DELETE

## 기술적 개선사항

- PostgreSQL $1, $2 파라미터 바인딩으로 통일
- 동적 WHERE 조건 생성 로직 유지
- 복잡한 집계 쿼리 (CASE WHEN, GROUP BY, SUM) 완벽 전환
- 기존 에러 처리 및 로깅 구조 유지
- TypeScript 타입 안전성 확보

## 코드 정리

- PrismaClient import 제거
- query, queryOne 함수 사용
- 컴파일 및 린터 오류 없음

문서: PHASE3.11_DDL_AUDIT_LOGGER_MIGRATION.md
진행률: Phase 3 128/162 (79.0%)
2025-10-01 12:01:04 +09:00
kjs 67b45ea699 docs: Phase 3.15~3.16 통합 마이그레이션 계획서 작성
2개 주요 서비스 그룹에 대한 통합 전환 계획서 작성:

1. **Phase 3.15: Batch Services** (24개 호출)
   - 4개 배치 관련 서비스 통합 계획
   - BatchExternalDbService (8개) - 외부 DB 연동
   - BatchExecutionLogService (7개) - 실행 로그
   - BatchManagementService (5개) - 배치 관리
   - BatchSchedulerService (4개) - 스케줄러

   주요 기술 요소:
   - 외부 DB 연결 및 쿼리
   - 트랜잭션 처리
   - Cron 표현식 스케줄링
   - 대용량 데이터 처리
   - 연결 풀 관리

2. **Phase 3.16: Data Management Services** (18개 호출)
   - 4개 데이터 관리 서비스 통합 계획
   - EnhancedDynamicFormService (6개) - 고급 동적 폼
   - DataMappingService (5개) - 데이터 매핑
   - DataService (4개) - 동적 데이터 조회
   - AdminService (3개) - 관리자 기능

   주요 기술 요소:
   - 복잡한 JSON 필드 처리
   - 동적 테이블 쿼리 (보안)
   - 재귀 CTE (계층 구조)
   - JSON 집계 쿼리
   - SQL 인젝션 방지

각 통합 계획서 포함 내용:
- 서비스별 상세 분석
- 통합 전환 전략 (Phase별)
- 상세 전환 예시 (Before/After)
- 기술적 고려사항
- 서비스별 체크리스트
- 통합 테스트 계획
- 예상 난이도 및 소요 시간
- 보안/성능 주의사항

메인 문서에 통합 계획서 링크 추가
서비스 그룹화로 가독성 향상
2025-10-01 11:55:50 +09:00
kjs ce37626e49 docs: Phase 3.11~3.14 상세 마이그레이션 계획서 작성
4개 주요 서비스에 대한 상세 전환 계획서 작성:

1. **Phase 3.11: DDLAuditLogger** (8개 호출)
   - DDL 실행 감사 로그 관리
   - 통계 쿼리 (GROUP BY, CASE WHEN, AVG)
   - 동적 WHERE 조건
   - JSON 필드 처리
   - 날짜/시간 함수

2. **Phase 3.12: ExternalCallConfigService** (8개 호출)
   - 외부 API 호출 설정 관리
   - JSON 필드 (headers, params, auth_config)
   - 민감 정보 암호화/복호화
   - 동적 CRUD 쿼리

3. **Phase 3.13: EntityJoinService** (5개 호출)
   - 엔티티 간 조인 관계 관리
   - LEFT JOIN 쿼리
   - 조인 유효성 검증
   - 순환 참조 방지

4. **Phase 3.14: AuthService** (5개 호출)
   - 사용자 인증 및 권한 관리
   - 비밀번호 암호화/검증 (bcrypt)
   - 세션 토큰 관리
   - 보안 크리티컬
   - SQL 인젝션 방지

각 계획서 포함 내용:
- 파일 정보 및 복잡도
- Prisma 사용 현황 분석
- 전환 전략 (단계별)
- 상세 전환 예시 (Before/After)
- 기술적 고려사항
- 전환 체크리스트
- 예상 난이도 및 소요 시간
- 보안/성능 주의사항

메인 문서에 계획서 링크 추가
2025-10-01 11:48:55 +09:00