본문 바로가기

웹 성능 최적화 기본 원칙

Core Web Vitals와 로딩·상호작용 지표를 측정하고 프론트엔드·백엔드 병목을 증거에 따라 개선합니다.

이번 장에서는 웹 성능의 중요성과 주요 측정 지표를 먼저 살펴봅니다.

이어 프론트엔드/백엔드 양측에서 적용 가능한 웹 성능 최적화 기본 원칙과 전략을 정리해, 사용자에게 빠르고 쾌적한 경험을 제공하는 기반을 만듭니다.

측정한 병목을 바꾸고 같은 조건에서 확인합니다

MEASURE & IMPROVE

측정한 병목을 바꾸고 같은 조건에서 확인합니다

대표 사용자 경로의 기준선을 기록하고 재현한 증거로 가설을 좁힙니다. 개선 뒤에는 다른 지표와 접근성의 회귀도 확인합니다.

같은 조건으로 가설을 바꾸고 현장에서 반복 확인한다현장 기준선에서 실험실 재현, 병목 근거 확인, 한 가설 변경, 같은 조건 비교, 현장 관찰로 진행하고 점선으로 다음 기준선에 돌아가며, 실제 사용자 데이터와 실험실 기록은 구별해 비교합니다.현장 기준선대표 경로·기기LCP·INP·CLS실험실 재현기기·네트워크캐시·행동 고정병목의 근거리소스·trace서버 비용 확인한 가설 변경지배 비용에 대응다른 기능 보존같은 조건 비교반복한 전후 값다른 지표·접근성예산·현장 관찰회귀 시 다음 반복표본·기간 구별
같은 조건으로 가설을 바꾸고 현장에서 반복 확인한다현장 기준선에서 실험실 재현, 병목 근거 확인, 한 가설 변경, 같은 조건 비교, 현장 관찰로 진행하고 점선으로 다음 기준선에 돌아가며, 실제 사용자 데이터와 실험실 기록은 구별해 비교합니다.현장 기준선대표 경로·기기LCP·INP·CLS실험실 재현기기·네트워크캐시·행동 고정병목의 근거리소스·trace서버 비용 확인한 가설 변경지배 비용에 대응다른 기능 보존같은 조건 비교반복한 전후 값다른 지표·접근성예산·현장 관찰회귀 시 다음 반복표본·기간 구별
측정 기반 성능 개선 반복현장 기준선→실험실 재현→병목 근거→한 가설 변경→동일 조건 비교→예산과 현장 관찰→기준선 반복.1 · 현장 기준선대표 경로 · LCP/INP/CLS2 · 실험실 재현기기 · 네트워크 · 데이터 고정3 · 병목 근거네트워크 · 서버 · 스크립트 · 렌더4 · 한 가설 변경측정 근거에 맞는 수정5 · 동일 조건 비교반복 측정 · 전후 변화6 · 예산과 현장 관찰회귀 발견 시 기준선으로 복귀
  1. 현장 기준선

    대표 경로의 LCP·INP·CLS와 서버 지표를 기록합니다.

  2. 실험실 재현

    같은 기기·네트워크·데이터·동작 순서로 재현합니다.

  3. 병목 근거

    Network·성능 trace·서버 기록에서 지배 비용을 찾습니다.

  4. 한 가설 변경

    원인 가설에 대응하는 변경을 적용합니다.

  5. 동일 조건 비교

    반복 측정한 전후 지표와 접근성·기능 회귀를 확인합니다.

  6. 예산과 현장 관찰

    예산을 정하고 현장 회귀가 생기면 기준선부터 다시 검토합니다.

회색 실선은 검토 진행, 주황 테두리 상자는 근거에 따른 변경, 점선은 다음 반복입니다. 단일 도구 점수나 한 번의 측정으로 실제 사용자 개선을 확정하지 않습니다.


왜 웹 성능 최적화가 중요한가?

  • 사용자 경험 (UX) 향상: 빠른 웹사이트는 사용자에게 긍정적인 인상을 주고, 즐거운 경험을 제공하여 재방문율을 높입니다.
  • 이탈률 감소: 페이지 로딩 시간이 길어질수록 사용자가 웹사이트를 떠날 확률이 급격히 증가합니다.
  • 검색 엔진 최적화 (SEO): Google과 같은 검색 엔진은 페이지 로딩 속도를 검색 랭킹 요소 중 하나로 사용합니다. 빠른 사이트는 검색 결과 상위에 노출될 가능성이 높습니다.
  • 전환율 및 수익 증대: 전자상거래 사이트의 경우, 성능 개선은 매출 증대로 직접적으로 이어질 수 있습니다. (예: 아마존은 100ms의 로딩 속도 개선으로 1%의 매출 증가 효과를 보았다고 함). 이 인용은 본문에 원 조사 출처·측정 조건이 제시되지 않았으므로 모든 서비스에 적용할 매출 계산식으로 사용하지 않습니다.
  • 에너지 효율성: 최적화된 웹사이트는 네트워크 트래픽 및 기기 리소스 사용량을 줄여 에너지 효율을 높입니다.

웹 성능 측정 지표 (Core Web Vitals 포함)

웹 성능은 주관적인 느낌이 아니라, 객관적인 지표를 통해 측정하고 개선해야 합니다.

Google은 사용자 경험을 중시하며, 웹 페이지의 핵심적인 사용자 경험을 측정하는 지표로 Core Web Vitals를 제시했습니다.

  • LCP (Largest Contentful Paint)
    • 의미: 페이지 탐색 시작부터 뷰포트(지금 보이는 화면 영역) 안의 가장 큰 적격 콘텐츠 요소(이미지, 비디오, 큰 텍스트 블록 등)가 표시될 때까지 걸리는 시간입니다. 페이지의 모든 리소스가 로드된 시점과는 다릅니다.
    • 중요성: 사용자가 페이지의 주요 콘텐츠를 언제 볼 수 있는지 체감하는 시점과 직결됩니다.
    • 권장 기준: 2.5초 이내
  • INP (Interaction to Next Paint)
    • 의미: 페이지를 방문하는 동안 발생한 클릭, 탭, 키보드 입력의 응답 지연을 관찰해 대표 반응 시간을 측정합니다.
    • 중요성: 첫 입력 하나가 아니라 전체 방문 중 상호작용의 반응성을 평가합니다.
    • 권장 기준: 200ms 이하
  • CLS (Cumulative Layout Shift)
    • 의미: 페이지 콘텐츠가 예기치 않게 움직이는(레이아웃 이동) 정도를 측정합니다. 이미지나 광고가 뒤늦게 로드되면서 텍스트나 버튼이 밀리는 현상 등이 포함됩니다.
    • 중요성: 시각적 안정성을 측정합니다. 사용자가 특정 요소를 클릭하려는데 갑자기 위치가 바뀌어 잘못 클릭하는 등의 불편함을 방지합니다.
    • 권장 기준: 0.1 이하

75백분위는 관측값을 작은 순서로 놓았을 때 약 75%가 그 값 이하에 놓이는 경계이며, 평균값과 다릅니다. 좋음 판정은 실제 사용자 방문을 모바일·데스크톱으로 나누고 세 지표 각각의 75백분위가 목표를 충족하는지 확인합니다. 한 번 빠르게 열린 방문이나 Lighthouse 점수로 현장 판정을 대신하지 않습니다. CLS도 방문 전체 이동 점수를 무조건 더하는 값이 아니라, 최대 5초 길이와 이동 간격 1초 미만으로 묶은 세션 창 중 가장 큰 점수입니다. Core Web Vitals의 판정 범위와 CLS의 세션 창을 함께 읽습니다.

기타 중요 지표
  • FCP (First Contentful Paint): 페이지에서 첫 번째 콘텐츠(텍스트, 이미지 등)가 화면에 렌더링되는 시점입니다.
  • TTI (Time To Interactive): 과거의 실험실 상호작용 지표입니다. Lighthouse 10부터 점수 지표에서 제거되었으며 현재 Core Web Vitals의 INP와 같지 않습니다.
  • Total Blocking Time (TBT): FCP 이후 도구가 정한 측정 구간의 각 메인 스레드 작업에서 50ms를 초과한 부분을 더하는 실험실 지표입니다. 전체 작업 시간을 모두 더하는 값이나 현장 INP와 같지 않습니다.
성능 측정 도구
  • Lighthouse (크롬 개발자 도구): 웹 페이지의 성능, 접근성, SEO 등을 종합적으로 분석하고 개선 방안을 제시합니다.
  • PageSpeed Insights: Google이 제공하는 웹사이트로, 실제 사용자 데이터(Field Data)와 Lighthouse 분석(Lab Data)을 기반으로 성능 점수와 개선 제안을 제공합니다.
  • WebPageTest: 다양한 네트워크 환경에서 페이지 로딩 과정을 상세하게 분석합니다.

웹 성능 최적화 기본 원칙 및 전략

웹 성능 최적화는 크게 프론트엔드 최적화(클라이언트 측)와 백엔드 최적화(서버 측)로 나눌 수 있습니다.

프론트엔드 성능 최적화

주로 웹 페이지의 초기 로딩 속도와 상호작용 반응성, 시각적 안정성을 개선하는 데 초점을 맞춥니다.

리소스 용량 최소화 (Minification & Compression)
  • Minification: JavaScript, CSS, HTML 코드에서 불필요한 공백, 주석, 긴 변수명 등을 제거하여 파일 크기를 줄입니다. (Webpack, Terser 등 빌드 도구 사용)
  • Compression (Gzip/Brotli): 서버에서 클라이언트로 파일을 전송하기 전에 압축하여 네트워크 전송량을 줄입니다. (HTTP 헤더 Content-Encoding 사용)
  • 이미지 최적화
    • 적절한 포맷 선택 (JPEG, PNG, WebP 등).
    • 이미지 압축 및 크기 조정 (반응형 이미지).
    • 지연 로딩(Lazy Loading): 화면 밖 이미지의 로드를 늦춥니다. native loading="lazy"는 브라우저의 거리·환경 판단에 따라 뷰포트에 들어오기 전에 로드를 시작할 수 있습니다. 첫 화면의 LCP 후보 이미지는 지연 로딩하지 않습니다. 이 이미지까지 늦추면 주요 콘텐츠 표시가 지연될 수 있습니다. LCP 이미지의 로딩 우선순위를 확인합니다.
    • CDN(Content Delivery Network) 활용: 사용자에게 가장 가까운 서버에서 이미지를 전송하여 로딩 속도 향상.
렌더링 차단 리소스 제거/최적화
  • <head> 태그 내 <script>나 <link rel="stylesheet">는 페이지 렌더링을 차단할 수 있습니다.
  • CSS: 가능한 한 작게 유지하고, 중요한 CSS는 <style> 태그 내에 인라인으로 삽입(Critical CSS)하여 빠른 초기 렌더링을 유도합니다.
  • JavaScript: 외부 classic script의 async·defer는 다운로드를 파싱과 병행합니다. async는 준비되면 실행하며 그동안 파싱을 멈출 수 있고, defer는 파싱이 끝난 뒤 실행합니다. 사용자 상호작용에 필요 없는 스크립트는 지연 로딩합니다.
번들링 및 코드 스플리팅 (Bundling & Code Splitting)
  • 번들링: 여러 개의 JavaScript/CSS 파일을 하나로 합쳐서 HTTP 요청 수를 줄입니다.
  • 코드 스플리팅: 애플리케이션의 특정 부분(라우트, 컴포넌트)이 필요할 때만 해당 코드를 로드하도록 번들을 분할합니다. (React.lazy(), Webpack dynamic import 등) 초기 로딩 시 불필요한 코드 로드를 방지합니다.
캐싱 (Caching)
  • 브라우저 캐시: Cache-Control, ETag 등의 HTTP 헤더로 정적 파일의 캐시 정책을 정합니다. fresh한 응답은 요청 없이 재사용할 수 있고, 만료되었거나 정책상 필요한 경우 서버에 재검증합니다.
  • Service Worker: 오프라인 지원 및 정교한 캐싱 전략을 구현하여 네트워크 의존성을 줄이고 성능을 향상시킵니다. (PWA 핵심 기술)
DOM 최적화
  • 불필요한 DOM 요소 생성을 피하고, DOM 조작 횟수를 최소화합니다.
  • React의 가상 DOM은 이러한 DOM 조작을 효율적으로 처리하지만, shouldComponentUpdate 또는 React.memo 등을 통해 불필요한 컴포넌트 재렌더링을 방지하는 것도 중요합니다.
애니메이션 최적화
  • transform, opacity 등 GPU 가속을 활용할 수 있는 CSS 속성을 사용하여 부드러운 애니메이션을 구현합니다.
  • requestAnimationFrame을 사용하여 브라우저의 렌더링 주기에 맞춰 애니메이션을 실행합니다.

백엔드 성능 최적화

주로 API 응답 시간 단축, 서버 자원 효율성 증대, 데이터베이스 쿼리 최적화에 초점을 맞춥니다.

API 응답 시간 단축
  • 코드 최적화: 불필요한 연산 제거, 효율적인 알고리즘 사용.
  • 비동기 처리: I/O 작업(데이터베이스, 외부 API 호출)을 비동기로 처리하여 서버 스레드가 블로킹되는 것을 방지합니다. (Node.js의 강점)
  • 캐싱: 자주 변경되지 않는 데이터를 캐시하여 데이터베이스 또는 외부 API 호출 횟수를 줄입니다. (Redis, Memcached 등 캐시 서버 사용)
데이터베이스 최적화
  • 인덱스(Index) 사용: 자주 조회되는 컬럼에 인덱스를 생성하여 검색 속도를 비약적으로 향상시킵니다. (책의 목차와 유사)
  • 쿼리 최적화: 비효율적인 SQL 쿼리(N+1 문제, 불필요한 조인 등)를 개선합니다.
  • 정규화/비정규화 전략: 데이터 모델링 시 정규화를 통해 데이터 무결성을 높이되, 성능 병목이 발생하면 의도적으로 비정규화를 고려할 수도 있습니다.
  • 데이터베이스 연결 풀(Connection Pooling): 데이터베이스 연결을 재사용하여 연결 생성 오버헤드를 줄입니다.
서버 리소스 관리
  • 하드웨어 증설: CPU, RAM, 디스크, 네트워크 대역폭 등 서버 자원을 증설합니다 (Scale-up).
  • 로드 밸런싱 (Load Balancing): 여러 대의 서버에 요청을 분산시켜 특정 서버에 부하가 집중되는 것을 방지하고, 가용성을 높입니다 (Scale-out).
  • 병렬 처리: Node.js의 클러스터 모듈이나 PM2 같은 프로세스 매니저를 사용하여 CPU 코어를 효율적으로 활용합니다.
CDN (Content Delivery Network) 활용
  • 정적 파일(이미지, CSS, JS)을 사용자에게 가장 가까운 엣지 서버에서 제공하여 전송 지연 시간을 줄입니다.
로깅 및 모니터링
  • 애플리케이션의 성능 병목 지점을 찾기 위해 서버 로그를 분석하고, 모니터링 도구(Prometheus, Grafana 등)를 사용하여 서버 및 데이터베이스 성능 지표를 지속적으로 추적합니다.

성능 감사 흐름 (Step-by-Step)

웹 성능 최적화 기본 원칙에서는 위험 신호, 최적화 지점, 사용자 영향도를 확인합니다. 여기서 trace는 브라우저의 작업과 리소스 처리 시점을 시간순으로 기록한 자료입니다. 총점만 보는 대신 어떤 작업이 어느 구간을 차지했는지 찾아 병목 가설을 세웁니다.

기준선 수집: 실제 사용자 Web Vitals와 실험실 재현 기록을 구별합니다. 페이지·기기·네트워크·캐시·동작 조건을 적고 현장의 LCP/INP/CLS, 실험실의 해당 지표와 TBT를 수집합니다. 기본 로딩만 하는 Lighthouse 측정에 실제 사용자 INP가 없음을 구별합니다.

병목 구간 분리: 네트워크, 렌더링, 스크립트 실행 중 어디가 지연의 핵심인지 분류합니다.

개선 우선순위 적용: trace와 리소스 기록에서 지배 비용을 찾아 한 가설부터 바꿉니다. 큰 이미지, 렌더 차단, 캐시 중 어떤 조치를 먼저 할지는 실제 병목 증거로 정합니다.

접근성 동시 검증: 성능 개선 후에도 키보드 경로, ARIA 레이블, 색 대비가 유지되는지 확인합니다.

재측정 및 회귀 방지: 개선 전후 수치를 비교하고 CI/Lighthouse 예산으로 회귀를 막습니다.

성능 지표는 각각 다른 병목을 가리키므로, 지표별로 개선 작업을 분리해 보는 것이 좋습니다.

LCP·INP·CLS는 서로 다른 경험을 측정합니다

CORE WEB VITALS

LCP·INP·CLS는 서로 다른 경험을 측정합니다

현장 데이터에서 나쁜 지표와 사용자 조건을 찾고 실험실 기록으로 원인 가설을 확인합니다. 지표명만으로 원인을 단정하지 않습니다.

세 지표를 서로 다른 근거와 연결한다LCP는 리소스와 렌더 지연, INP는 입력 대기와 이벤트 처리 및 다음 표시 지연, CLS는 예상 밖 이동의 근거로 연결하며, 화살표는 원인 확정이 아닌 분석 방향을 나타냅니다.
LCP주요 콘텐츠 표시좋음 ≤ 2.5초
연결 관계LCP · 주요 콘텐츠 표시 · 좋음 ≤ 2.5초 → 리소스 발견·전송 · 서버 응답 · 렌더 지연 확인
리소스 발견·전송서버 응답렌더 지연 확인
INP상호작용 반응좋음 ≤ 200ms
연결 관계INP · 상호작용 반응 · 좋음 ≤ 200ms → 입력 대기 · 이벤트 처리 · 다음 표시 지연
입력 대기이벤트 처리다음 표시 지연
CLS예상 밖 이동좋음 ≤ 0.1
연결 관계CLS · 예상 밖 이동 · 좋음 ≤ 0.1 → 크기·폰트·삽입 · 최대 세션 창 · 이동 원인 대조
크기·폰트·삽입최대 세션 창이동 원인 대조

LCP · 주요 콘텐츠 표시

좋음 ≤ 2.5초

가장 큰 적격 콘텐츠가 표시되는 시점을 측정합니다.

확인할 증거 TTFB, 리소스 발견·전송, 렌더 지연을 나눠 확인합니다. LCP 이미지·큰 텍스트 등 실제 후보 요소를 먼저 찾습니다.

INP · 상호작용 반응

좋음 ≤ 200ms

클릭·탭·키보드 상호작용의 다음 화면 표시까지 반응 지연을 평가합니다.

확인할 증거 입력 대기, 이벤트 처리, 다음 표시 지연을 나눕니다. 긴 작업·핸들러 비용·스타일과 레이아웃을 trace에서 확인합니다.

CLS · 시각적 안정성

좋음 ≤ 0.1

예상하지 않은 레이아웃 이동을 누적 이동 점수로 평가합니다.

확인할 증거 크기 없는 이미지·광고, 폰트 교체, 늦게 삽입된 UI를 layout-shift 기록과 대조합니다. 이동을 일으킨 원인을 확인합니다.

현장 판단 · 세 지표의 75백분위

모바일·데스크톱을 구분하고 같은 페이지·사용자 집단의 75백분위에서 세 목표를 함께 확인합니다. 데이터가 없는 지표는 좋다고 추정하지 않습니다.

실험실 · 재현과 원인 분석

고정한 기기·네트워크·시나리오의 trace로 변경 원인을 좁힙니다. Lighthouse의 TBT는 실험실 긴 작업 지표이며 현장 INP와 같지 않습니다.

재측정 · 다른 지표도 확인

같은 조건을 반복 측정하고 현장 데이터의 수집 기간·표본 차이도 고려합니다. LCP 개선이 INP·CLS나 접근성을 악화시키지 않았는지 확인합니다.

좋음 기준은 각 지표의 경험 기준입니다. 한 번의 lab 결과나 종합 점수를 그대로 현장의 75백분위 판정으로 바꾸지 않습니다.


예시

실제 측정 대신 같은 모집단의 75백분위가 주어진 연습 자료를 봅니다. 변경 전 LCP 3.1초 / INP 180ms / CLS 0.08, 변경 후 LCP 2.4초 / INP 260ms / CLS 0.08이라면 LCP는 좋아졌지만 INP가 좋음 기준을 벗어났습니다. 이미지를 빨리 보이게 한 변경이 긴 스크립트 실행을 늘렸는지 확인해야 하며, 세 지표 전체 통과를 선언할 수 없습니다.

실험실 측정 구간 안의 작업 시간이 40·70·120ms라면 TBT의 기여는 각각 0, 70 - 50 = 20, 120 - 50 = 70ms입니다. 따라서 작업 시간 합계 230ms와 TBT 90ms를 구별합니다. TBT의 계산 정의는 이 초과 부분의 합입니다.

독립 판단

① 같은 구간의 작업이 50·51·99ms라면 TBT는 얼마인가요? ② LCP 2.3초와 INP 180ms는 주어졌지만 CLS 표본이 없을 때 세 지표 통과를 판단할 수 있나요? ③ 변경 전은 저성능 휴대전화·빈 캐시, 변경 후는 데스크톱·따뜻한 캐시에서 한 번씩 재었다면 코드 변경만의 효과라고 말할 수 있나요?

근거와 결론 확인

① 0 + 1 + 49 = 50ms입니다. 50ms인 작업 전체를 차단 시간으로 더하지 않습니다. ② CLS가 없으므로 전체 통과는 미확인입니다. 없는 값을 0으로 채우지 않습니다. ③ 기기와 캐시 조건도 바뀌었으므로 원인을 분리할 수 없습니다. 같은 조건의 반복 실험으로 가설을 좁힌 뒤, 현장 데이터의 기간·표본·사용자 행동까지 비교합니다. 파일 용량 감소가 곧 LCP·INP의 같은 비율 감소를 뜻하지도 않습니다.

성능 최적화 검증 체크리스트

개념 점검
  • Core Web Vitals 지표가 각각 무엇을 의미하는지 설명할 수 있는가?
  • 프론트엔드 최적화와 백엔드 최적화의 역할 차이를 구분할 수 있는가?
구현 점검
  • 핵심 페이지의 LCP/INP/CLS 목표값을 수치로 관리하고 있는가?
  • 최적화 이후 키보드만으로 주요 기능(탐색/폼 제출)을 완료할 수 있는가?
  • 인터랙티브 요소에 ARIA 속성/라벨이 유지되고 대비(contrast) 기준을 충족하는가?

마지막으로 지표별 병목과 개선 작업을 연결해 우선순위를 정합니다.


웹 성능 최적화 정리

핵심은 지표를 먼저 정하고 프론트엔드/백엔드 개선 포인트를 분리해 우선순위를 잡는 것입니다.

이번 장에서는 웹 애플리케이션의 성공적인 운영에 필수적인 웹 성능 최적화의 기본 원칙을 학습했습니다.

이번 절에서는 웹 성능이 사용자 경험, SEO, 비즈니스 지표에 미치는 영향과 Core Web Vitals(LCP, INP, CLS)를 정리했습니다.

프론트엔드와 백엔드 최적화는 리소스 크기, 렌더링 차단, 캐싱, API 응답 시간, 데이터베이스 비용, CDN 활용을 나누어 검토합니다.

웹 성능 최적화는 측정, 분석, 개선을 반복하는 운영 과정입니다.

성능 지표와 실제 사용자 환경을 함께 보면서 우선순위를 정해야 합니다.

성능 최적화는 병목을 측정하고 사용자 체감 지표가 개선됐는지 다시 검증하는 순서로 진행합니다.