perf(frontend): 프로젝트 분석 페이지 성능 최적화

- 백엔드 집계 API(/api/analysis)를 연동하여 프론트엔드 데이터 처리 로직 제거
- 불필요해진 project-analysis-data.js 파일 삭제
- 페이지 로딩 및 데이터 분석 속도를 획기적으로 개선
This commit is contained in:
2025-07-28 15:21:19 +09:00
parent 7c6940307e
commit a1b7d3c5df
4 changed files with 49 additions and 194 deletions

View File

@@ -1,6 +1,5 @@
// /js/project-analysis.js
import { getMasterData, getWorkReports } from './project-analysis-api.js';
import { processRawData, applyFilters, getAnalysis } from './project-analysis-data.js';
import { getMasterData, getAnalysisReport } from './project-analysis-api.js';
import {
setDefaultDates,
setUIState,
@@ -9,16 +8,8 @@ import {
renderAnalysisTables,
renderDetailTable,
switchTab,
getCurrentFilters,
} from './project-analysis-ui.js';
// 애플리케이션 상태 (전역 변수 최소화)
const state = {
masterData: null,
processedData: [],
filteredData: [],
};
// DOM 요소 참조 (이벤트 리스너 설정용)
const DOM = {
startDate: document.getElementById('startDate'),
@@ -26,7 +17,8 @@ const DOM = {
analyzeBtn: document.getElementById('analyzeBtn'),
quickMonthBtn: document.getElementById('quickMonth'),
quickLastMonthBtn: document.getElementById('quickLastMonth'),
applyFilterBtn: document.getElementById('applyFilter'),
// 필터 버튼은 현재 아무 기능도 하지 않으므로 주석 처리 또는 제거 가능
// applyFilterBtn: document.getElementById('applyFilter'),
tabButtons: document.querySelectorAll('.tab-button'),
};
@@ -44,17 +36,16 @@ async function handleAnalysis() {
setUIState('loading');
try {
const rawReports = await getWorkReports(startDate, endDate);
state.processedData = processRawData(rawReports, state.masterData);
const analysisResult = await getAnalysisReport(startDate, endDate);
if (state.processedData.length === 0) {
if (!analysisResult.summary.totalHours) {
setUIState('no-data');
updateFilterOptions([]);
return;
}
updateFilterOptions(state.processedData);
handleFilterChange(); // 필터 적용 및 렌더링
renderSummary(analysisResult.summary);
renderAnalysisTables(analysisResult);
renderDetailTable(analysisResult.details);
setUIState('data');
} catch (error) {
@@ -64,23 +55,8 @@ async function handleAnalysis() {
}
}
/**
* 필터 적용 버튼 클릭 또는 분석 후 자동 실행되는 핸들러
*/
function handleFilterChange() {
const filters = getCurrentFilters();
state.filteredData = applyFilters(state.processedData, filters);
const analysisResult = getAnalysis(state.filteredData);
renderSummary(analysisResult.summary);
renderAnalysisTables(analysisResult);
renderDetailTable(state.filteredData);
}
/**
* 빠른 날짜 설정 버튼 핸들러
* @param {'this' | 'last'} monthType - 이번 달 또는 지난 달
*/
function handleQuickDate(monthType) {
const now = new Date();
@@ -98,13 +74,15 @@ function handleQuickDate(monthType) {
*/
function setupEventListeners() {
DOM.analyzeBtn.addEventListener('click', handleAnalysis);
DOM.applyFilterBtn.addEventListener('click', handleFilterChange);
DOM.quickMonthBtn.addEventListener('click', () => handleQuickDate('this'));
DOM.quickLastMonthBtn.addEventListener('click', () => handleQuickDate('last'));
DOM.tabButtons.forEach(btn => {
btn.addEventListener('click', () => switchTab(btn.dataset.tab));
});
// 프론트엔드 필터링은 제거되었으므로 관련 이벤트 리스너는 주석 처리합니다.
// DOM.applyFilterBtn.addEventListener('click', ...);
}
/**
@@ -115,8 +93,8 @@ async function initialize() {
setupEventListeners();
try {
state.masterData = await getMasterData();
// 페이지 로드 시 바로 분석 실행
const masterData = await getMasterData();
updateFilterOptions(masterData);
await handleAnalysis();
} catch (error) {
alert(error.message);