실시간 대시보드 성능 장애 해결기

기존 코드의 문제점과 원인 분석

회사에서 자체 개발하고 배포하고 있는 기존 시스템은 20초마다 차트를 실시간으로 갱신하는 구조였다.

하지만 시간이 지날수록 대시보드가 느려지고 서버가 버벅이는 고질적인 문제가 발생하면서 이러한 문제점을 발견하고 고치는 부분을 기록한 블로그이다.

 

 문제의 코드 

data.setsTime(data.getsTime().substring(0,8) + "0800");

 

프론트에서 20초마다 "최근 1분 전부터 현재까지" 의 신규 데이터만 요청을 하고 있었다.

하지만 백에서 이 시작 시간을 강제로 아침 08:00 으로 고정하고 있는 코드를 발견하였다.

 

결국 최근의 1분전부터 현재까지의 데이터만 필요하지만 오후 17:00 에 차트를 갱신하게 되면서

기존 데이터를 재사용하지 않고 9시간 치 누적 데이터를 20초마다 매번 통재로 다시 조회하는 문제점이 발생했다. 

 

따라서 해당 코드를 삭제하고 불필요한 로직들도 리팩토링 하였다.

 

 

또한 쓰지 않는 데이터까지 움켜지는 코드를 발견하게 되었다.

SELECT ... FROM (SELECT A.PRCS, A.BRCD, A.BRNM, A.TRM ... FROM TB_DQS A ...)

 

위와 같은 코드를 분석해보니 최종적으로 화면에 그릴 때 필요한 데이터는 단지 시간, 상태, 건수 뿐이였지만 내부 서브쿼리에서 부점명등 무겁고 사용하지 않는 컬럼들까지 수만 건씩 전부 메모리에 로드하고 있는 상황을 발견하게 되었다.

 

결국 DB 의 메모리 낭비와 Disk I/O 부하가 극심해져, 쿼리 자체에 실행 속도가 뚝 떨어지는 현상을 보았다.

 

따라서 내부 코드를 모두 블로그에 정리할 수는 없지만 해당 코드를 삭제하고 과거 변경 데이터가 있는 경우 1분전 데이터만 불러오는 로직과 SQL 문을 수정하였다.

 

결과 

20초마다 수만 건씩 풀 스캔하던 무식한 방식에서 딱 최근 1분간 발생한 수십 건의 데이터만

콕 집어 가져오는 정상적인 실시간 아키텍처로 변경하였다. 결과적으로 DB 쿼리 수행 시간이 초 단위에서 0.012초 대로 낮아졌다.

또한 서버가 과도한 JSON 객체를 생성하지 않아도 되고, 브라우저 역시 대량의 중복 데이터를 받아 재연산할 필요가 없어져 하루 종일 대시보드를 켜두어도 메모리 누수 없이 작동할 수 있게 만들엇으며 불필요한 SQL 서브쿼리를 제거함으로써 DB 내부 메모리 낭비를 막고, 대시보드 때문에 다른 메인 비즈니스 쿼리들이 대기하는 병목 현상을 방지하였다. 

'Spring' 카테고리의 다른 글

IntelliJ 디버거  (0) 2026.05.06
Querydsl  (0) 2025.11.12
Swagger  (0) 2025.10.02
WAR 배포 및 분석  (0) 2025.09.25
Spring 외부설정, 조회방법  (0) 2025.09.22