#성능최적화
글 8편
-
undo 하나 넣었다가 4단 도미노
시작: undo 스냅샷이 과거를 바꿨다 그리드에 Ctrl+Z를 붙였다. 그런데 되돌리면 엉뚱한 값이 되살아났다. 재현이 딱 떨어졌다. 행1 월 셀에 11 입력 행2 월 셀에 22 입력 Ctrl+Z 2회 결과 — 행1은 0으로 복원되는데 행2가 22로 되살아남 (기대 0) 원인은 얕...
-
재는 행위가 크기를 바꾸면 화면이 폭주한다
문제: 차트가 무한히 커진다 화면 — LCA 결과 요약 증상 — 차트가 계속 커지며 레이아웃이 깨지고 깜빡거림 특징 — 멈추지 않는다. 가만히 둬도 계속 커진다 폭을 재봤더니 약 1,200만 px까지 갔다. 매 사이클 약 3.1배씩 커지고 있었다. 원인: CSS 한 줄이 만든 피드...
-
캐시를 고쳤는데 안 빨라졌다
문제: “데이터 조회가 느리다” 사용자 리포트는 이 한 줄이었다. 화면 — 배출량 산정의 원데이터 목록 탭 증상 — 목록이 뜨기까지 눈에 띄게 대기 주어진 정보 — 그게 전부. 어느 쿼리인지, 어느 카테고리인지 없음 여기서 두 갈래가 갈린다. 의심 가는 곳을 고칠 것인가, 어디가 ...
-
PDF 다운로드가 7초 걸렸는데, 범인은 한글 폰트였다
문제 대상 — 제품 배출량을 산정하는 B2B 웹앱의 결과 리포트 PDF 다운로드 소요 시간 — 버튼 클릭 후 약 7초 그동안 화면 — 로딩만 회전, 아무 변화 없음 사용자 반응 — “먹통이 됐나” 하고 재클릭하기 충분한 시간 구현 스택 — @react-pdf/renderer 4.x...
-
N+1 제거 4종 세트 — fetch join이 답이 아닐 때
N+1은 하나의 문제가 아니다 기간: 한 달 반 작업: 대시보드 조회 성능 개선 N+1 조우 횟수: 여러 번, 매번 처방이 상이 “N+1이면 fetch join” 반사가 통하지 않는 경우: 절반 이상 (a) fetch join을 못 쓸 때 — @BatchSize 첫 케이스 위치: ...
-
뷰를 물질화 테이블로 — 읽기 비용을 쓰기 시점으로 옮기기
읽을 때마다 5개 CTE를 풀스캔하고 있었다 대상 — 대시보드 조회에 쓰이는 엔티티 하나 매핑 — @Subselect로 매핑된 뷰 구성 — CTE 5개를 엮은 집계 뷰 MySQL의 동작 — 이 뷰를 실체화해두지 않음. 조회할 때마다 전체 재계산 즉 화면을 열 때마다 풀스캔 판단 기...
-
AG Grid의 autoHeight는 행 가상화를 끈다
문제 입출력 데이터를 입력하는 그리드에서 행이 수백 개로 늘어나자 셀 하나를 편집할 때마다 눈에 띄게 버벅였다. 타이핑 속도를 화면이 못 따라오는 정도였다. 원인 1: 편집할 때마다 columnDefs가 통째로 재생성됐다 columnDefs는 useMemo로 감싸져 있었음 의존성 ...
-
GIN trigram 인덱스를 만들었는데 왜 안 빨라지지?
인덱스를 만든 날과 인덱스가 실제로 쓰인 날이 13일 떨어져 있다 2026-03-12 — GIN trigram 인덱스 추가 2026-03-25 — 인덱스가 쿼리 플랜에 처음 등장 그 사이 13일 동안 인덱스는 디스크만 차지 이 글의 주제 — 그 13일 문제 환경: Spring Bo...