엘리먼트에 ID(id="audit-log-body")가 누락되어 스크립트의 데이터 렌더링 과정이 중단되고 템플릿의 하드코딩 샘플 데이터가 계속 노출됨.
1. 테이블 tbody에 id="audit-log-body"를 부여하고 기존의 하드코딩 tr 샘플 행 완전 제거.
2. 필터 검색란의 유저 검색창 및 액션 셀렉터에 ID를 부여하고 검색 버튼 클릭 시 renderAuditLogs()가 작동하도록 연동.
|
| 20 |
2026-06-12 10:00 |
감사 로그 조회 실데이터 미반영 수정
controllers/admin/adminController.js, controllers/archiveController.js
|
로그 수집 테이블과 연동된 컨트롤러에서 최신 데이터가 반영되지 않는 현상.
|
로그 수집 DB 쿼리 파라미터 최신화 및 캐시 무효화 적용.
|
| 19 |
2026-06-11 16:25 |
자동 삭제 보존 정책 공통화 및 스키마 구조 변경
관리자화면_통합대시보드_UI제안.html
|
자동 보관 및 파일 삭제 정책 설정이 프로젝트(현장)별로 각각 제어되도록 설계되어 있었으나, 모든 현장에 일괄적으로 일관성 있게 공통(글로벌) 적용되는 형태로 비즈니스 정책이 간소화됨. 이에 따라 기존 프로젝트별 컬럼(tb_project.limit_file_count, tb_project.limit_days)을 이용해 개별 제어하던 기능과 LNB/UI Dropdown을 일괄 제거하고, 시스템 공통 정책 별도 테이블로의 마이그레이션이 필요함.
|
1. UI 제안서 HTML 마크업에서 자동 삭제 정책 탭 내의 '설정 대상 프로젝트' Dropdown 셀렉터를 완전히 제거하고, 시스템 공통 단일 설정 폼으로 축소/재편함.
2. JS Mock 데이터 상에서 기존 프로젝트별 policySettings 맵 객체를 제거하고, 단일 글로벌 정책 객체(globalPolicy = { active, files, days })를 신설하여 CRUD 시뮬레이션을 연결함.
3. projects dropdown sync 로직에서 자동 삭제 셀렉터 매핑 처리를 탈락시키고, 이력 기록 시 프로젝트 ID가 아닌 'SYSTEM'으로 공통 등록되도록 변경 조치함.
4. 주의사항 가이드 텍스트를 수정하여 실제 적용 시 tb_project 컬럼이 아닌 신설 테이블 tb_system_policy에 저장됨을 명시함.
|
| 18 |
2026-06-11 16:10 |
대시보드 스토리지 사용현황 파일수량 추가 표시
관리자화면_통합대시보드_UI제안.html
|
종합 대시보드 화면 내 프로젝트별 스토리지 사용 현황 그리드(프로그레스 바) 목록에 물리 디스크 용량(GB) 정보만 노출되어 있어, 각 현장에 적재된 실제 파일 개수(수량)가 어떻게 되는지 한눈에 직관적으로 파악하기 어려움.
|
대시보드 렌더러 함수(renderDashboard)를 개선하여 각 프로젝트별 가상의 파일 수량 데이터를 추가하고, 프로그레스 바 우측 정보 라벨의 가로폭(width)을 180px로 확장 및 텍스트 템플릿을 수정하여 "사용 용량 (백분율%) / 파일 수량(개)" 형태로 실시간 병합 표시되도록 기능을 고도화함.
|
| 17 |
2026-06-11 16:00 |
공통 코드 마스터 및 세부 코드 관리 화면 통합 추가
관리자화면_통합대시보드_UI제안.html
|
기존 시스템에 프로젝트 구분, 사용자 그룹, 배너 공지 상태 등 시스템 전반의 핵심 파라미터를 유기적으로 정의하고 동적 제어할 수 있는 공통 코드(code_master, code_detail) 관리 기능 및 UI 메뉴가 부재함. 이로 인해 코드 데이터가 정적이고 변경 시 소스 수정이 필요함.
|
1. LNB 메뉴에 "🔑 공통 코드 관리" 항목을 신설하고, 대분류(code_master) 하단에 소분류(code_detail)가 배치되는 상하 수직 정렬 레이아웃 화면을 적용함.
2. 대분류 행 클릭 시 해당 대분류에 속한 세부 코드들만 하단 영역에 자동 필터링 로드되도록 연동하고, 대분류를 선택하지 않은 상태에서는 하단의 [세부코드 등록] 버튼 및 등록 모달이 활성화되지 않도록 유효성 차단 설정을 적용함.
3. 대분류와 소분류 각각에 대해 등록 및 수정 시 모달을 제공하여 UI 공간 활용성을 극대화하고, 소분류 등록 시 대/소분류 코드가 자동 결합된 조합 키(base_code)가 생성되도록 데이터 정합성 보존 로직을 적용한 Mock DB CRUD 시뮬레이션을 구현함.
|
| 16 |
2026-06-11 15:30 |
관리자 화면 UI 기능 및 레이아웃 수정 제안
관리자화면_통합대시보드_UI제안.html
|
1. 모든 관리자 화면 테이블에 행 순번(NO)이 제공되지 않아 가독성 및 직관성이 부족함.
2. 프로젝트 CRUD 기능과 프로젝트 권한 배정 기능이 별개의 LNB 메뉴 및 탭으로 분리되어 있어 사용자 접근성이 떨어지고 배정이 불편함.
3. 실시간 배너공지 이력 목록에 송출상태 및 날짜 범위 검색 필터가 부재하며, 송출 중지가 모든 배너에 대해 일괄적으로만 가능해 개별적 세부 통제가 불가능함.
4. 사용자 CRUD 기능이 고정 폼으로 되어있어 비주얼 디자인이 협소하며, 선택된 사용자의 권한부여 프로젝트 상세 리스트를 직관적으로 파악할 수 있는 화면 뷰가 부재함.
|
1. 공통: 실시간 소켓 접속, 프로젝트, 참여 유저, 배너이력, 감사로그, 정책 이력 등 모든 테이블에 1부터 순차 증가하는 NO 컬럼을 추가 적용함. 또한, 테이블 그리드 선택 시 시각적 이질감을 줄이기 위해 세로 강조선(border-left)을 제거하고, 폰트 두께 변화로 인한 줄높이의 왜곡 현상을 원천 차단하기 위해 weight 상속 형태를 유지하여 선택되지 않은 다른 행과 완벽하게 동일한 높이를 보존하도록 보강함.
2. 프로젝트 관리: '프로젝트 CRUD'와 '권한 배정' 메뉴를 단일 '프로젝트 관리' 탭으로 병합하고, 프로젝트 선택 시 참여 유저 목록이 우측에 로드되며, 사용자 배정은 팝업(모달) 형태로 다중 선택 가능하도록 구현함. 프로젝트 데이터에 category 코드(tdc, gpd, bimproject, overseas)를 추가하여 등록/수정/목록에 통합 반영함.
3. 실시간 배너공지: 이력 목록 상단에 송출상태 및 등록일 기간(from~to) 검색 필터를 신설하여 JS로 필터링하고, 이력 각 행마다 [송출중지] 버튼을 배치하여 기간이 만료되지 않은 배너만 개별적으로 중지시킬 수 있도록 개선함.
4. 사용자 관리: 메뉴명을 '사용자 관리'로 바꾸고 등록 및 수정을 모달 팝업으로 전환함. 사용자 행을 클릭하면 우측/하단 카드에 해당 사용자가 참여 권한을 보유한 프로젝트 상세 목록(ID, 명, 레벨)이 실시간 렌더링되도록 연동함.
|
| 15 |
2026-06-11 14:28 |
AI 요약 기능 백그라운드 큐 및 DB 연동
queue.js
archiveController.js
|
아카이브 및 공문 탭에서 AI 요약 요청 시, BullMQ 대기열에 작업은 정상 적재(Push)되나 이를 실질적으로 처리해 주는 Worker 인스턴스가 존재하지 않아 작업이 waiting 상태로 정체되어 무한 로딩이 발생함. 또한 요약 완료 시 원본 데이터 테이블(tb_data / _test_tb_data)의 ai_summary 컬럼에 최종 텍스트를 반영하는 DB UPDATE 로직이 누락되어 있음. 추가적으로 요약 작업 수행 시간이 길어질 경우 BullMQ가 작업이 정지된 것으로 오인해 job stalled 에러가 터지고 작업을 취소하는 이슈 발생.
|
1. queue.js 파일에 ai-summarize 및 api-summarize 대기열을 비동기 처리하는 BullMQ Worker들을 신규 생성하고 gemini-2.5-flash API 연동을 완료함.
2. archiveController.js의 addSummarizeAiLog 함수 내부에 요약 성공 시 DB의 ai_summary와 memo 컬럼을 동시 업데이트하는 쿼리를 추가하여, 상세창 리로드 시 요약본이 정상 출력되고 수정/저장이 원활히 연동되도록 조치함.
3. AI 요약 호출에 오랜 시간이 걸려 작업이 유실 및 중지(Stalled)되는 것을 막기 위해, 두 Worker의 lockDuration 설정을 기본 30초에서 90초(90000ms)로 대폭 확장함.
|
| 14 |
2026-06-11 13:55 |
데이터베이스 테이블 명세서 고도화
테이블명세서.html
|
기존의 테이블명세서.html 파일에 실제 물리 스키마(ver4_init_schema.sql) 대비 누락되거나 축소 표기된 테이블(시설 스펙, 일정 등 6개 테이블) 및 각 테이블의 상세 컬럼들이 대다수 누락되어 개발 시 참조 문서로서 정합성이 맞지 않는 상태임.
|
1. 초기 DDL(ver4_init_schema.sql)에 지정된 14개 테이블 및 전체 컬럼 스펙을 한 개도 빠짐없이 정식 등재하고 타입과 제약조건(PK/FK/NotNull 등)을 100% 매핑하여 완전 동기화함.
2. 왼쪽 LNB 스크롤 플로팅 퀵 메뉴바를 추가하여 원하는 테이블 정의서로 즉시 점핑할 수 있는 편의성을 탑재하고, pm_ver4의 포레스트 그린 테마 스타일로 명세서 디자인을 리뉴얼함.
|
| 13 |
2026-06-11 12:30 |
관리자 화면 UI 디자인 테마 동기화
관리자화면_통합대시보드_UI제안.html
|
기존의 관리자 화면 UI가 일반적인 슬레이트 그레이 및 로즈(Rose) 계열 핑크톤으로 구현되어 있어, pm_ver4 고유의 포레스트 그린(Teal-Green) 디자인 컨셉 및 서체 스타일과 어긋나는 시각적 이질감이 발생함.
|
1. 관리자 화면의 CSS 디자인 토큰 및 변수(:root)를 pm_ver4의 포레스트 그린 테마 스케일(#1e5149, #142e29, #d2dcdb 등)로 전면 교체하여 일관성 있는 룩앤필(Look and Feel)을 구현함.
2. 폰트 서체를 기존 Inter/Noto Sans에서 pm_ver4 메인과 동일한 Pretendard Variable로 전환하고, 테두리 둥글기(Radius) 및 그림자 효과를 pm_ver4 규격에 맞춰 자연스럽게 축소/조정함.
|
| 12 |
2026-06-11 12:25 |
관리자 화면 UI 기능 개선
관리자화면_통합대시보드_UI제안.html
|
1. 실시간 배너 공지의 등록일이 기존 readonly(읽기 전용)로 고정되어 시작일~종료일 범위와 등록일을 사용자가 원하는 임의의 날짜로 유연하게 제어하지 못함.
2. 프로젝트 권한 배정 화면에서 배정 대상 사용자를 오직 모달 팝업 창을 통해서만 추가할 수 있어, 직관적이고 빠른 다중 선택/등록 조작을 병행하기 어려움.
|
1. 실시간 배너 공지 등록일의 readonly 속성을 제거하여 사용자가 등록일을 임의 편집/등록할 수 있도록 개방하고, 하단의 이력 list 테이블 및 JS 파라미터 전달 체계를 완전 연동시킴.
2. 프로젝트 권한 배정의 우측 영역을 이원화(배정된 목록 & 배정 대기 목록)하여, 화면에 표시된 미배정 사용자 목록에서 개별 [즉시 배정] 단축 버튼 클릭 및 체크박스 다중 선택을 통한 [선택 사용자 배정 추가] 일괄 적용 기능을 동시 탑재함으로써 팝업 및 목록 선택식 등록 요구사항을 완벽히 충족시킴.
|
| 11 |
2026-06-11 11:23 |
로컬 루프백 바인딩 & 스토리지 버킷 소멸
server.js
MinIO S3 스토리지
|
1. WSL2 도커 초기화 과정에서 DB 및 Redis 컨테이너 중단으로 Node.js가 크래시 및 다운됨.
2. Node.js 재기동 시 localhost가 IPv6(::1)에만 바인딩되어, 브라우저가 IPv4(127.0.0.1)로 접속을 시도할 때 "사이트에 연결할 수 없음" 오류가 계속 발생함.
3. 도커 완전 리셋으로 인해 MinIO 내 로컬 파일 업로드 버킷(pm-test-01 등)이 모두 소멸함.
|
1. server.js 호스트 바인딩 설정을 localhost에서 0.0.0.0으로 변경하여 IPv4/IPv6 접속을 동시 수락하도록 보완.
2. 소멸된 로컬 MinIO 버킷(pm-test-01, pm-test-02)을 동적으로 재생성하는 임시 스크립트를 작성하여 스토리지 복구 완료.
3. 초기화된 DB 스키마의 상태를 전체 점검하여, 1~9번에 달하는 기존의 모든 수동 DDL 마이그레이션이 유실 없이 올바르게 적용되어 있음을 교차 검증 완료.
|
| 10 |
2026-06-11 09:40 |
Nodemon 파일 잠금 오류
nodemon.json
|
윈도우 탐색기나 사용자 조작으로 인해 생성되는 텍스트 문서(예: 새 텍스트 문서.txt) 리소스가 잠겨 있는 상태에서, nodemon이 이를 watch하려다 EBUSY: resource busy or locked 에러가 발생해 웹 서버가 강제 종료됨. |
1. nodemon.json 설정을 보강하여 *.txt, *.md, *.html, *.bat, *.zip 등 코드 실행에 무관한 모든 문서 및 정적 파일 확장자를 감시 대상(ignore)에서 제외.
2. 감시 대상 확장자를 오직 js,json 파일로만 엄격하게 국한(ext 설정)하여 충돌 가능성을 원천 차단.
|
| 9 |
2026-06-11 09:12 |
아카이브 정보 조회 에러
archiveController.js
tb_data 테이블
|
아카이브 파일 상세 정보 쿼리에서 ai_summary 컬럼을 SELECT 했으나, 로컬 DB 테이블에 해당 컬럼이 없어 SQL 에러 발생. 널가드(Null Guard) 부재로 프로세스 강제 종료(app crashed). |
1. tb_data 및 _test_tb_data 테이블에 ai_summary TEXT 컬럼을 추가하는 마이그레이션 적용.
2. 초기화 스키마 파일(ver4_init_schema.sql) 동기화.
3. exports.getDataInfo 컨트롤러에 try-catch 예외 예방 코드를 주입하여 서버 다운 방어.
|
| 8 |
2026-06-10 20:00 |
서버 무한 재시작 방지
nodemon.json
|
winston 라이브러리가 logs/ 폴더에 로그 파일을 계속 쓰거나 views/ 폴더 내 리소스 로딩 시 nodemon이 파일 변경을 감지하고 서버를 무한 리스타트하여 웹소켓 끊김 등을 유발. |
프로젝트 루트 경로에 nodemon.json 파일을 추가하여 logs/*, views/*, node_modules/* 폴더를 nodemon의 감시 대상(Watch) 목록에서 완전히 제외 처리. |
| 7 |
2026-06-10 19:50 |
로딩 멈춤 방어 코드
pageRenderer.js
|
아카이브 렌더링을 위한 getTreeObject API 요청 중, 서버 에러나 이전 304 캐시 물림이 터졌을 때 프론트엔드가 크래시되어 로딩바(.init-progress)가 꺼지지 않고 화면이 영원히 멈추는 에러. |
getTreeObject API 호출 및 후속 렌더링 과정을 try-catch 구문으로 격리하여, 데이터 통신 오류나 변수 참조 에러가 나더라도 무조건 closeInitProgress()가 실행되어 로딩을 닫도록 방어. |
| 6 |
2026-06-10 19:40 |
304 API 캐싱 방지
app.js
|
백엔드가 서버 복구 이전에 브라우저에 임시 전송했던 에러 응답(undefined)이 브라우저의 304 Not Modified 캐시에 물려, 서버 수정 이후에도 에러가 화면에 재발생하는 현상. |
app.js에 캐시 무효화 헤더 미들웨어를 주입하여, 정적 파일(.js, .css)을 제외한 모든 동적 API GET 요청 시 Cache-Control: no-store를 강제 반환하도록 설정. |
| 5 |
2026-06-10 19:10 |
클릭 로그 서버 다운
archiveController.js
tb_click_log 테이블
|
유저의 썸네일 보기 등의 클릭 이력을 누적하는 _test_tb_click_log 테이블의 스키마가 실제 백엔드가 시도하려는 컬럼 구조와 달라 SQL 에러 발생. 미처리 에러가 winston 예외 제어기에 걸려 노드 프로세스 다운. |
1. _test_tb_click_log 및 tb_click_log 테이블을 드롭하고 쿼리에 맞는 컬럼 구조(activity, user_ip, path_arr 등)로 전면 재생성.
2. mgmtFunc_addClickLog 컨트롤러에 try-catch와 결과 null 가드를 주입하여 SQL 에러 시에도 서버가 꺼지지 않도록 방어.
|
| 4 |
2026-06-10 18:30 |
다운로드 큐 에러
tb_download_folder
archiveController.js
|
압축 폴더 이력을 로드하는 getMyDownloadList 쿼리 수행 시 로컬 DB에 path, name 컬럼이 누락되어 SQL 에러 발생. 백엔드 catch 문에 응답 코드가 없어 브라우저 요청이 Pending으로 영구 대기함. |
1. `tb_download_folder` 테이블에 누락된 path TEXT, name TEXT 컬럼 생성 및 초기화 스키마 동기화.
2. `getMyDownloadList` catch 블록 내에 500 에러 응답 처리를 추가하여 영구 Pending 현상 차단.
|
| 3 |
2026-06-10 17:40 |
로컬 스토리지 업로드 오류
onPremiseClient.js
|
MinIO/S3 규격은 대문자 및 언더스코어(_)가 섞인 버킷명을 거부하나, 프로젝트 ID(예: `PM_TEST_01`)를 버킷명으로 직접 사용해 presigned URL 업로드 요청 시 InvalidBucketName 에러로 업로드 실패. |
onPremiseClient.js 내 S3 Client 객체에 미들웨어를 주입하여, 로컬 스토리지에 요청되는 모든 버킷명을 자동 소문자 및 하이픈 형태(예: `pm-test-01`)로 실시간 강제 변환되도록 우회 처리. |
| 2 |
2026-06-10 16:50 |
감사 로그 삽입 오류
archiveController.js
|
폴더/파일 조작 감사 기록 시, pg array 컬럼(path_arr 등)에 바인딩할 파라미터를 JSON.stringify 문자열로 전달하여 malformed array literal 오류로 서버가 리로드 및 강제 종료됨. |
JSON.stringify 호출부를 전부 제거하고, 순수 자바스크립트 Array(배열) 객체를 pg 모듈에 다이렉트 전달하여 드라이버가 자동으로 포스트그레스 규격 배열 문자열로 매핑 바인딩하도록 수정. |
| 1 |
2026-06-10 16:00 |
아카이브 용량 계산 지연
tb_overview
|
getFolderSize 호출 시 tb_overview의 data_size 컬럼을 JSON 배열로 간주하고 JSON 변환 쿼리를 돌렸으나, 로컬 DB 스키마에는 BIGINT 타입으로 생성되어 있어 형변환 에러 및 화면 무한 로딩 유발. |
data_size 컬럼의 형식을 TEXT 타입으로 교체하고 기본값으로 '[0]'(JSON 배열 문자열)을 설정하는 마이그레이션 적용 및 스키마 파일 동기화. |