
서다미 웹 프로덕트 엔지니어 | 강사
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
1
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
2
성능 최적화의 비즈니스 가치와 정확한 측정 환경 세팅법
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
3
1교시: Lighthouse 제대로 활용하기

건물이 무너지기 전에 미리 금 간 곳을 찾아 보수하는 정기 검진과 같습니다.
핵심 성능 지표
기업 통계 사례
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
4
1교시: Lighthouse 제대로 활용하기
시크릿 모드 사용: 내가 설치한 확장 프로그램(광고 차단 등)이 성능 점수 측정 결과에 왜곡을 유발하는 요소를 방지합니다.
Mobile 기기 기준: 저사양 환경에서 진짜 병목 현상이 가장 잘 드러나기 때문입니다.
성능 제한(Throttling): 모든 사용자가 최신형 컴퓨터를 쓰지 않습니다. 고의로 속도를 늦춰 사용자 체감 성능 저하를 시뮬레이션합니다.
[새 시크릿 창] 열기F12(개발자 도구) 실행[Lighthouse] 선택Mode: NavigationDevice: MobileCategories: Performance 체크
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
5
1교시: Lighthouse 제대로 활용하기
"Lighthouse 리포트는 우리 앱의 '성능 진단 보고서'와 같습니다"
* Largest Contentful Paint: 페이지 내에서 주요 콘텐츠가 렌더링되는 시각입니다. 이 수치가 길어지면 사용자 경험 저하를 초래합니다.


당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
6
1교시: Lighthouse 제대로 활용하기
지표 식별: "LCP 점수가 왜 낮지?" 하고 보니, 옆에 LCP 태그가 붙은 Render blocking requests가 원인 요소로 지목됨.
원인 연결: INSIGHTS 섹션의 해당 항목을 클릭하여 상세 내용을 펼칩니다.
데이터 확인: 클릭하니 Google Fonts가 1,000ms 동안 로딩되며
화면을 막고 있는 것을 발견!
*LCP(Largest Contentful Paint): 페이지 내에서 가장 큰 콘텐츠가 렌더링되는 시각입니다.

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
7
1교시: Lighthouse 제대로 활용하기
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
8
LCP, CLS, INP의 성능 저하를 유발하는 실제 코드 사례와 해결 원리
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
9
2교시: 웹 성능 지표(CWV)의 이면
지표의 본질 이해: 단순 암기가 아닌 브라우저 내부 동작 원리로 이해하기
원인 요소(성능 병목) 코드 식별: 리포트 점수를 저하시키는 '병목 지점 코드' 찾기
DevTools 활용: 데이터(Network, Performance 탭) 기반 문제 분석
검증된 최적화 적용: 개선 후 초록색 점수(90점+) 달성.

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
10
2교시: 웹 성능 지표(CWV)의 내부 동작 원리
Core Web Vitals: 구글이 웹 페이지의 사용자 경험을 측정하기 위해 선정한 가장 핵심적인 3가지 지표입니다.
"단순히 로딩이 빠른 것이 아니라, 보고(LCP), 누르고(INP), 레이아웃 이동이 없는(CLS) 쾌적함을 목표로 합니다."
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
11
2교시: 웹 성능 지표(CWV)의 이면
Waterfall 캡처

Lighthouse LCP 섹션

브라우저는 HTML을 읽다가 폰트를 만나면 '해당 리소스가 모두 로드될 때까지 텍스트 렌더링을 보류할게'라고 동작합니다. 이것이 바로 렌더 블로킹(Render Blocking)입니다.
💼 현업 포인트
이미지를 WebP로 최적화하고 Preload를 적용하는 것만으로도 LCP 점수는 1~2초 단축됩니다. 이는 효율성이 높은 최적화 방안입니다.
🔴 문제: @import 폰트 + 비최적화 이미지 → 렌더 블로킹 발생
🟢 해결: &display=swap + WebP preload → LCP 1~2초 단축
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
12
2교시: 웹 성능 지표(CWV)의 이면
페이지에서 가장 큰 이미지나 텍스트가 화면에 나타나는 시점입니다.
핵심 원인: 배송(Network)이 너무 늦거나, 다른 파일이 길을 막고(Blocking) 있을 때 발생합니다.
🔴 나쁜 코드 (원인 요소)
// 1. 무거운 폰트 호출 (차단 발생)
@import url(
'https://fonts.googleapis.com/...all-weights'
);
// 2. 최적화 없는 이미지
<img src="/huge-hero.png" />
🟢 개선 코드 (Hero)
// 1. 폰트 차단 해제
&display=swap
// 2. 이미지 우선순위 상향 및 포맷 변경
<link rel="preload" as="image" href="/hero.webp" />
<img src="/hero.webp" width="1200" height="600"
loading="eager" />당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
13
2교시: 웹 성능 지표(CWV)의 이면
현상 : 이미지가 지연 로드되면서 하단 콘텐츠의 레이아웃 이동을 유발합니다.
지표: CLS (Cumulative Layout Shift)
레이아웃이 이동하는 정도를 측정한 수치. 0.1 이하가 Good, 0.25 이상은 Poor입니다.
진단 포인트
Lighthouse에서 Layout shift culprits 항목을 클릭해 보세요. 레이아웃 이동을 유발한 이미지 파일이 명시되어 있습니다.


당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
14
2교시: 웹 성능 지표(CWV)의 이면
🔴 비효율적인 코드 (원인 요소)
// 크기 지정이 없어 로딩 후 화면 레이아웃 불안정 발생
<img src="/ad-banner.png" />🟢 최적화 코드
// 방법 1: HTML에서 직접 크기 지정
<img src="/ad-banner.png" width="800" height="400" />
// 방법 2: CSS aspect-ratio 사용 (권장)
img {
aspect-ratio: 16 / 9;
width: 100%;
}이미지 로드 전에 브라우저에 미리 렌더링 공간을 할당하여, 이미지가 로드된 후에도 주변 요소의 위치 안정성을 유지합니다.
🔴 문제: 크기 미지정 → 이미지 로드 후 레이아웃 불안정 (CLS 증가)
🟢 해결: width/height 또는 aspect-ratio 지정 → 공간 선점 → CLS 0
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
15
2교시: 웹 성능 지표(CWV)의 이면
버튼을 클릭했는데 화면 응답이 지연됩니다. 사용자는 응답 지연이 발생했다고 인지하거나 사이트를 이탈하게 됩니다.
INP (Interaction to Next Paint) — 클릭 후 다음 화면이 렌더링될 때까지의 반응 속도이며, 200ms(0.2초) 이내가 합격 기준입니다.
Performance 탭에서 빨간색 빗금으로 표시된 'Long Task'를 찾으세요. Main Thread가 50ms 이상의 고부하 작업을 처리하느라 클릭 이벤트를 처리하지 못하고 있는 구간입니다.

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
16
2교시: 웹 성능 지표(CWV)의 이면
🔴 비효율적인 코드 (원인 요소)
// 메인 스레드를 꽉 잡고 놓지 않는 반복문
button.onclick = () => {
for (let i = 0; i < 100000000; i++) {
// 브라우저를 멈추게 하는 무거운 연산
}
};🟢 최적화 코드 (해결 방안)
// 작업을 쪼개서 메인 스레드에게 쉴 틈 주기
button.onclick = () => {
setTimeout(() => {
// 비동기로 분리하여 클릭 반응성 확보
}, 0);
};자바스크립트 엔진은 한 번에 하나의 작업만 수행하는 싱글 스레드입니다.
거대한 작업 하나를 수행하는 대신, 작은 단위로 쪼개어 실행하면 그 틈새로 브라우저가 사용자의 클릭을 감지할 수 있습니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
17
2교시: 웹 성능 지표(CWV)의 이면

지표별 솔루션 요약
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
18
네트워크 Waterfall 읽기 및 CPU 병목(Long Task) 지점 탐색
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
19
3교시: 브라우저 정밀 진단 (Network & Performance)
"점수 측정은 끝! 이제 실제 성능 저하의 근본 원인을 규명할 시간입니다."
2교시에서 학습한 CWV 지표들을 실제 어떤 진단 도구로 심층 분석할 것인지 소개합니다.
리소스 로딩 경로를 추적합니다. 지연되는 리소스 로드를 폭포수(Waterfall)로 시각화하여 확인합니다.
메인 스레드의 실행 프로파일을 기록합니다. Long Task 및 렌더링 병목 지점을 시각적으로 식별합니다.
Lighthouse는 '문제 발생 지점'을 알려주고, DevTools는 '문제의 근본 원인'을 분석하는 정보를 제공합니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
20
3교시: 브라우저 정밀 진단 (Network & Performance)
리소스 로딩 순서와 각 단계별 색상 의미를 분석합니다.
모든 리소스는 각자의 '타임라인'을 가집니다. 계단식으로 표현되어 Waterfall 차트라고 불립니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
21
3교시: 브라우저 정밀 진단 (Network & Performance)
Network탭 Waterfall 예시

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
22
3교시: 브라우저 정밀 진단 (Network & Performance)

특정 리소스(이미지 등)가 화면에 표시되기까지 총 2.34초가 소요되었습니다. 이 시간 동안 브라우저는 어떤 상태였을까요?
• Waiting (TTFB): 2.18초 — 전체 시간의 약 93% 차지
• Content Download: 0.1초 — 파일 크기는 문제의 원인이 아닙니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
23
3교시: 브라우저 정밀 진단 (Network & Performance)
Waiting (TTFB)
전체 시간의 93% 차지
Content Download
파일 용량은 문제 없음
→ 원인 요소는 파일이 아니라 서버 응답 지연 시간입니다.
파일 용량이 과다해서 지연되는 것이 아닙니다. 서버 응답 지연 시간이 3초 이상 발생하고 있습니다.
TTFB 문제 → 서버/DB 최적화 또는 CDN 도입
의존성 문제 → 리소스 우선순위 재조정 또는 preload 활용
파일 크기 문제 → 압축 또는 캐싱 적용
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
24
3교시: 브라우저 정밀 진단 (Network & Performance)
🎬 3단계 분석법
성능 저하가 의심되는 동작(예: 버튼 클릭) 직전에 '녹화' 버튼을 누르고 동작 수행 후 '정지'를 누르면 브라우저의 모든 활동이 타임라인에 기록됩니다.
수많은 행 중에서 'Main'이라고 적힌 행을 찾으세요. 자바스크립트 실행 및 화면 렌더링 등 브라우저의 핵심 작업이 처리되는 곳입니다. → Main 스레드에서 모든 JS가 실행!
막대기 윗부분에 빨간색 삼각형 빗금이 있다면? 50ms가 넘는 장시간 작업(Long Task)이 사용자 상호작용을 저해하고 있다는 핵심 지표입니다. → INP(Interaction to Next Paint) 저해의 주요 원인!

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
25
3교시: 브라우저 정밀 진단 (Network & Performance)
HTML → CSS → Layout → Paint 전 과정을 Main Thread가 순서대로 처리합니다. 이 지점에서 병목 현상 발생 시 모든 처리가 중단됩니다.
50ms 이상 걸리는 작업이 생기면 Main Thread는 사용자 상호작용 처리에 응답하지 않습니다. 이것이 바로 INP 점수 저하의 주요 원인입니다.
성능 저하(지연) 발생 지점을 시간대별로 정확히 추적할 수 있습니다. 빨간 빗금만 찾으면 문제 진단의 상당 부분을 해결할 수 있습니다.
💡 Long Task를 클릭하면 어떤 JS 함수가 주요 원인인지 정확히 식별할 수 있습니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
26
3교시: 브라우저 정밀 진단 (Network & Performance)


전체 실행 시간 중 가장 많은 시간을 차지한 작업 유형을 파이 차트로 보여줍니다. 'Scripting'이 크다면 JS가 주요 원인 요소입니다.
가장 많은 시간을 소비한 함수를 역순으로 보여줍니다. 맨 위에 있는 함수가 가장 주된 원인 요소입니다.
함수 호출 흐름을 트리 구조로 보여줍니다. 어떤 함수가 어떤 함수를 불러서 느려졌는지 추적할 수 있습니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
27
3교시: 브라우저 정밀 진단 (Network & Performance)

Performance 타임라인에서 빨간 삼각형이 있는 막대를 클릭합니다.
하단 패널에서 Bottom-Up 탭을 클릭합니다. 가장 많은 처리 시간을 소비하는 함수가 맨 위에 표시됩니다.
함수 이름 옆 파란색 링크(예: main.js:123)를 클릭하면 브라우저가 즉시 Sources 탭으로 이동하여 소스코드의 정확한 파일명과 줄 번호로 이동합니다. → 거기에서 원인 요소를 확인할 수 있습니다!
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
28
3교시: 브라우저 정밀 진단 (Network & Performance)
🚩 주요 마일스톤 (Flags) 및 브라우저 파싱 지표
브라우저가 첫 번째 글자나 이미지를 그리기 시작한 순간입니다. 사용자가 시각적 콘텐츠를 처음 인지하는 시점.
가장 큰 메인 콘텐츠가 화면에 나타난 최종 로딩 순간입니다. 2.5초 이하가 Good 기준.
HTML 뼈대 구성이 완료된 시점. JS 실행 가능 상태.
이미지, 스타일시트 등 모든 리소스가 완전히 로드된 시점.
🔍 사용 방법
타임라인 상단에서 LCP 마커가 기록된 시점을 찾으세요. 이 지점이 사용자가 메인 콘텐츠를 인지한 순간입니다.
LCP 마커 이전에 어떤 네트워크 요청이나 JS 실행이 집중되어 있는지 확인하세요. 그것이 바로 성능 개선 포인트입니다.
DCL(DOMContentLoaded)과 L(Onload) 이벤트 사이 간격이 크다면? 대용량 이미지나 외부 리소스가 로딩 성능 저하의 주요 원인이 됩니다.
이하면 권장 기준 충족
이 사이를 줄이는 것이 목표
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
29
3교시: 브라우저 정밀 진단 (Network & Performance)
🌐 Network 탭 핵심
TTFB(주황/녹색)가 길면 → 서버 응답 지연 문제
Content Download(파란색)가 길면 → 리소스 용량 문제
리소스가 계단식으로 밀린다면 요청 우선순위(Preload)나 의존성 정비가 필요합니다.
✅ 진단 체크리스트
Network 탭에서 주황/녹색 바가 비정상적으로 긴 리소스를 식별했는가?
리소스들이 병렬로 로딩되고 있는가? 계단식 의존성은 없는가?
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
30
3교시: 브라우저 정밀 진단 (Network & Performance)
⚡ Performance 탭 핵심
Main 스레드의 Long Task 구간이 사용자 반응(INP)을 저해하는 원인 요소입니다.
Self Time이 높은 함수 → 파일명:줄번호로 소스코드 역추적하세요.
FCP → LCP 사이 간격을 줄이는 것이 UX 최적화의 핵심입니다.
✅ 진단 체크리스트
Performance 탭에서 빨간 삼각형 빗금 구간을 찾아 클릭했는가?
Self Time 최상단 함수의 파일명:줄번호를 확인했는가?
두 깃발 사이 간격이 1초 이내인가? 그 사이 병목 리소스는 없는가?
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
31
재렌더링의 원리 이해 및 프로파일러를 통한 불필요한 렌더링 개선
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
32
4교시: 리액트 정밀 진단 (React Profiler)
3교시 복습
화면이 그려진 뒤(Paint) 얼마나 느리게 동작하는가? Network/Performance 탭으로 측정합니다.
어떤 컴포넌트가 다시 렌더링되었는지는 알 수 없습니다. 결과물만 파악할 뿐, 내부 동작의 불투명성이 존재합니다.
4교시 예고
어떤 컴포넌트가 '왜' 다시 렌더링되었는가? 컴포넌트 단위로 렌더링 시간을 추적합니다.
불필요한 렌더링(Re-render)의 원인 요소를 컴포넌트 단위로 식별합니다. 이것이 INP 개선의 핵심입니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
33
4교시: 리액트 정밀 진단 (React Profiler)
크롬 웹스토어에서 'React Developer Tools'를 검색하여 설치합니다.
개발자 도구(F12) 실행 후 상단 메뉴에서 [Profiler] 탭을 선택합니다. (Components 탭 옆에 위치)
Profiler 설정(톱니바퀴 아이콘)에서 "Record why each component rendered while profiling" 항목을 반드시 체크합니다. 이 설정이 활성화되어야 재렌더링의 구체적인 원인을 확인할 수 있습니다.

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
34
4교시: 리액트 정밀 진단 (React Profiler)

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
35
4교시: 리액트 정밀 진단 (React Profiler)
리렌더링이란? 컴포넌트의 상태가 변하여 함수가 다시 호출되고, 가상 DOM을 새로 만드는 과정입니다.
컴포넌트 내부의 useState 등이 변했을 때. 가장 기본적인 리렌더링 원인입니다.
부모로부터 전달받은 값이 변했을 때. 새로운 값이 내려오면 컴포넌트가 다시 렌더링됩니다.
자신의 Props가 변하지 않아도 부모가 리렌더링되면 자식은 무조건 다시 렌더링됩니다. 불필요한 렌더링의 주요 원인 요소!
구독하고 있는 전역 상태가 변했을 때. 해당 Context를 사용하는 모든 컴포넌트가 리렌더링됩니다.
화면 변화와 상관없는 3번(부모 영향) 케이스를 식별하고 제어하는 것이 성능 최적화의 첫걸음입니다.
부모 렌더링에 의한
불필요한 재렌더링
Props가 같으면
렌더링을 건너뜁니다
🔴 문제: 부모가 바뀔 때마다 자식 전체가 다시 렌더링됨
🟢 해결: React.memo로 Props 비교 후 불필요한 렌더링 차단
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
36
4교시: 리액트 정밀 진단 (React Profiler)
플레임 차트란? 프로파일링 기간 동안 어떤 컴포넌트가 어떤 순서로, 얼마나 오래 실행되었는지 보여주는 막대그래프입니다.
리액트 개발자 도구의 상단 메뉴에서 [Profiler]를 누릅니다.
왼쪽 상단의 파란색 동그라미(Record)를 누르고 화면에서 동작을 수행한 뒤, 다시 눌러 중지합니다.
기록 후 상단에 두 아이콘이 뜹니다. 첫 번째 아이콘(불꽃 모양)이 Flamegraph Chart입니다. (기본 설정)
두 번째 아이콘(막대그래프 모양)은 Ranked Chart입니다. 시간순이 아니라 '오래 걸린 순'으로 정렬해서 보여줍니다.
전체 렌더링 시간 중 특정 컴포넌트가 차지하는 비중을 시각적으로 확인합니다.
부모-자식 관계를 유지하며 보여주기 때문에, 어떤 부모 컴포넌트로 인해 하위 컴포넌트들이 불필요하게 리렌더링되는지 한눈에 파악할 수 있습니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
37
4교시: 리액트 정밀 진단 (React Profiler)

당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
38
4교시: 리액트 정밀 진단 (React Profiler)
가로 길이 = 해당 컴포넌트와 하위 컴포넌트들이 렌더링을 완료하는 데 걸린 총 합산 시간 (Total Time)
막대가 가장 길다고 해서 무조건 최적화
1순위인 것은 아닙니다. (성능 저하의 주요 원인 지점)
🟡 노란색/주황색:
컴포넌트 '자신'이 렌더링하는 데 오래 걸린 성능 저하 구간 (Self Time). 최우선 병목 타겟.
🟢/🔵 초록색/파란색:
효율적으로 처리된 컴포넌트
⚪️ 회색:
이번 시점에 다시 렌더링되지 않은 컴포넌트
막대가 위아래로 쌓인 구조는 부모→자식 렌더링 순서를 나타냅니다.
상위에서 하위로 렌더링이 전파됩니다.
→ 색깔로 병목 지점을 식별하고, 가장 긴 막대(부모)에서 성능 개선을 진행하는 것이 중요합니다!
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
39
4교시: 리액트 정밀 진단 (React Profiler)
📋 주요 원인 4가지 (Case Study)
부모로부터 전달받은 값(객체, 배열, 함수 포함)이 변했을 때. 참조값이 바뀌면 내용이 같아도 변경으로 인식합니다.
컴포넌트 자체의 상태(useState 등)가 업데이트되었을 때. 가장 기본적인 리렌더링 원인입니다.
자신은 아무 변화가 없으나, 부모가 렌더링되어 리액트 기본 메커니즘에 의해 함께 다시 그려진 경우. 불필요한 렌더링의 주요 원인 요소!
useContext 등 사용 중인 훅의 값이 변했을 때. 구독 중인 전역 상태가 바뀌면 해당 컴포넌트 전체가 리렌더링됩니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
40
4교시: 리액트 정밀 진단 (React Profiler)

Flamegraph Chart에서 분석할 컴포넌트를 클릭하면 우측 사이드바에 상세 데이터가 나타납니다.
[Why did this render?] 섹션에 적힌 텍스트가 리액트가 판단한 재렌더링의 직접적인 이유입니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
41
4교시: 리액트 정밀 진단 (React Profiler)
노란색/주황색 막대를 찾아 렌더링 병목 지점을 특정합니다.
상단 막대그래프를 통해 어떤 시점에 렌더링이 집중되었는지 파악합니다.
'Why did this render?' 메시지를 통해 Props, State, 부모 렌더링 중 무엇이 문제인지 확정합니다.
의도된 렌더링 — 화면 변화에 꼭 필요한 경우 (정상)
낭비되는 렌더링 — 데이터 변화가 없는데 부모 등의 영향으로 다시 그려지는 경우
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
42
핵심 개념 리마인드 및 실습용 '성능 문제 유발 앱' 프로젝트 구동 확인
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
43
5교시: 오전 이론 총정리 및 실습 환경 세팅
📍핵심: 웹 성능 지표 (CWV)
✨LCP, CLS, INP 수치를 통해
"성능 저하 지점"을
객관적인 지표로 확인했습니다.
📍핵심: 브라우저 & 리액트 렌더링 원리
✨사용자 경험 저하가
코드의 어떤 로직(불필요한 리렌더링 등)에서 발생하는지 이해했습니다.
📍핵심: 진단 도구 (Lighthouse, Profiler)
✨추측이 아닌 데이터를 통해
실제 "개선이 필요한 성능 병목 구간"
(프로파일러의 비효율적인 활동 구간)을 지목했습니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
44
5교시: 오전 이론 총정리 및 실습 환경 세팅
행동: Profiler와 Lighthouse를 사용하여 현재 상태를 기록합니다.
목적: "어디가, 얼마나 느린가?"를 객관적인 수치로 확보합니다.
행동: 진단 결과에 맞는 최적화 도구(memo, useMemo, useCallback 등)를 적용합니다.
목적: 병목 지점을 제거하고 렌더링 효율을 높입니다.
행동: 수정 후 다시 측정하여 이전 데이터와 비교합니다.
목적: "실제로 빨라졌는가?"를 증명하고 사이드 이펙트가 없는지 확인합니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
45
5교시: 오전 이론 총정리 및 실습 환경 세팅
App
└── SearchBar
└── FilterPanel
└── HeavyList
└── ListItem (× 수천 개)
└── ExpensiveCalculation
수천 개의 데이터를 렌더링하고, 매번 무거운 연산을 수행하는 구조입니다.
아이템 하나만 바뀌어도 수천 개가 리렌더링되는 비효율적인 구조
메모이제이션 없이 매번 실행되는 무거운 계산 로직
하위 컴포넌트로 과도하게 전파되는 데이터 흐름
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
46
5교시: 오전 이론 총정리 및 실습 환경 세팅
배포해 드린 저장소 주소에서 소스코드를 클론(Clone)받고, 필요한 의존성 패키지를 설치해 주세요. npm run dev 명령어로 로컬 서버가 정상적으로 구동되는지 확인하시기 바랍니다.
git clone https://github.com/becover/the-heavy-list-app.git
cd the-heavy-list-app
npm install
npm run dev브라우저 개발자 도구의 Profiler 탭이 정상적으로 활성화되었는지 확인해 주세요.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
47
5교시: 오전 이론 총정리 및 실습 환경 세팅
성능 지표 확인(CWV) → Profiler 병목 지점 특정까지의 전체 흐름을 정리했습니다.
무분별한 코드 수정이 아닌 Measure → Fix → Verify 프로세스를 확립했습니다.
실습용 프로젝트(Heavy List App) 구조 파악 및 개발 환경 세팅을 완료했습니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
48
5교시: 오전 이론 총정리 및 실습 환경 세팅
이미지 및 폰트 용량 최적화
— 대용량 이미지를 WebP로 전환하고, 폰트 로딩 방식을 개선하여 초기 로딩 속도를 향상시킵니다.
WebP 변환기, Lighthouse, font-display
— 브라우저가 리소스를 더 빠르게 가져오고, 레이아웃 이동 없이 안정적으로 렌더링되도록 설정합니다.
불필요한 리렌더링 방지
— 아이템 하나가 변경되어도 수천 개가 불필요하게 다시 그려지는 문제를 해결합니다.
React.memo
— 컴포넌트 메모이제이션을 활용해 렌더링 효율을 극대화합니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
49
이미지 용량 최적화, 폰트 로딩 개선 및 점수 변화 확인
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
50
6교시: 에셋 및 네트워크 최적화
진단 데이터를 바탕으로, 성능에 악영향을 주는 외부 리소스부터 최적화하기
메인 배너 이미지(PNG/JPG)의 대용량으로 인한 렌더링 지연.
→ 최적화 기법: 이미지 포맷 변환(WebP) + 압축
이미지 로딩 전 공간 미확보로 인한 레이아웃 흔들림 현상.
→ 최적화 기법: width/height 속성 명시 + aspect-ratio 고정
웹 폰트 로딩 중 글자가 보이지 않거나 기본 폰트가 노출되는 현상.
→ 최적화 기법: font-display: swap + preload
→ 목표: 2.5s 이하
→ 목표: 0.1 이하
→ 목표: 0s
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
51
6교시: 에셋 및 네트워크 최적화
브라우저가 핵심 리소스를 우선적으로 로드하도록 명시적인 지시를 내리는 과정
고용량 PNG/JPG → WebP/AVIF 변환
용량 최대 80% 절감 효과
핵심 이미지에 fetchpriority="high" 또는 link rel="preload" 적용
브라우저가 핵심 리소스를 먼저 로드하도록 명시적 지시
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
52
6교시: 에셋 및 네트워크 최적화

평균 용량
평균 용량
평균 용량
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
53
6교시: 에셋 및 네트워크 최적화
구글이 만든 무료 이미지 압축 도구.
WebP·AVIF 변환, 화질 미리보기, 용량 비교까지 브라우저에서 바로 가능.
`picture` 태그로 AVIF → WebP → 원본 순서로 fallback 처리하면 브라우저 호환성과 최적 압축률을 동시에 확보할 수 있음
<picture>
<source srcset="image.avif" type="image/avif" />
<source srcset="image.webp" type="image/webp" />
<img src="image.jpg" alt="..." />
</picture>당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
54
6교시: 에셋 및 네트워크 최적화
CSS @font-face에 font-display: swap; 설정
→ 폰트 로딩 중에도 기본 폰트로 텍스트를 즉시 표시합니다.
이미지 태그에 aspect-ratio 또는 고정 크기 값 지정
→ 리소스 로드 전부터 영역을 확보하여 레이아웃 이동을 방지합니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
55
6교시: 에셋 및 네트워크 최적화

Before 0.204 🔴 → After 0.05 🟢
Before 1.2s → After 0s
이미지 로드 시 레이아웃 불안정 발생, 폰트 깜빡임(FOUT) 노출
영역 사전 확보로 레이아웃 안정화, 기본 폰트로 즉시 텍스트 표시
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
56
6교시: 에셋 및 네트워크 최적화
Transferred Size 감소폭 확인
PNG → WebP 변환 후 용량 비교
Waterfall 리소스 로딩 순서 개선 여부
CLS 시각적 안정성 점수 변화
LCP 로딩 시간 단축 수치
Performance 종합 점수 전/후 비교
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
57
6교시: 에셋 및 네트워크 최적화
에셋 최적화를 통해 레이아웃 시프트(CLS)는 0으로 해결했으나, 과도한 컴포넌트 렌더링 연산이 메인 스레드를 장시간 점유(TBT 상승)하여 전체 LCP 지연의 근본 원인이 되고 있습니다.
현재의 LCP 지연은 자산 로딩 속도가 아닌, 렌더링 블로킹(Rendering Blocking)에 의한 병목 현상입니다. 병목 지점을 찾기 위해 React Profiler를 활용한 컴포넌트 최적화가 필요합니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
58
React.memo 적용 및 코드 스플리팅을 통한 렌더링 차단 해결
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
59
7교시: 렌더링 및 번들 최적화
React는 npm run build 시 번들 최적화를 위해 Profiler 측정 코드와 컴포넌트 displayName 등 디버깅 관련 코드를 모두 제거합니다. npm run preview(배포 버전)에서 React DevTools Profiler를 실행하면 측정이 불가능하거나 "프로파일링을 지원하지 않는 빌드입니다" 경고가 표시됩니다.
npm run dev 상태에서 Profiler를 실행하고, 설정에서 "Record why each component rendered while profiling" 옵션을 활성화하세요. 컴포넌트 막대에 마우스를 올리면 "props.keyword 변경으로 인한 리렌더링" 등 구체적인 원인이 표시됩니다. 이 기능은 개발 모드 전용입니다.
npm run dev 실행 확인 (npm run preview ❌)
React DevTools 확장 프로그램 설치 및 Profiler 탭 접근 확인
Profiler 설정 → "Record why each component rendered while profiling" 체크
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
60
7교시: 렌더링 및 번들 최적화


당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
61
7교시: 렌더링 및 번들 최적화
📌 원리
React.memo는 컴포넌트를 감싸 이전 Props와 현재 Props를 얕은 비교(Shallow Compare)합니다.
✅ 효과
Props가 변하지 않으면 렌더링 함수 자체를 실행하지 않고 이전 결과를 재사용합니다.
🎯 적용 대상
Profiler Flame Chart에서 노란색/주황색으로 표시된 자식 컴포넌트에 우선 적용합니다.
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
62
7교시: 렌더링 및 번들 최적화


🔴 Before: handleDelete 새 참조 → memo 무력화 → 전체 리렌더링
🟢 After: handleDelete 동일 참조 → memo 정상 작동 → 렌더링 생략
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
63
7교시: 렌더링 및 번들 최적화
🔴 문제: 모든 페이지가 한 번에 로드
초기 접속 시 사용자가 보지도 않는 페이지 코드까지 전부 다운로드 → 번들 비대화
🔧 해결: React.lazy로 라우트 분리
현재 보이는 페이지만 로드하고, 나머지는 사용자가 이동할 때 로드합니다.
✅ 효과
초기 번들 크기 대폭 감소 → LCP 단축, 메인 스레드 점유 시간(TBT) 감소
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
64
7교시: 렌더링 및 번들 최적화


당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
65
7교시: 렌더링 및 번들 최적화
🔴 문제: 모든 페이지가 한 번에 로드
초기 접속 시 사용자가 보지도 않는 페이지 코드까지 전부 다운로드 → 번들 비대화
🔧 해결: React.lazy로 라우트 분리
현재 보이는 페이지만 로드하고, 나머지는 사용자가 이동할 때 로드합니다.
✅ 효과
초기 번들 크기 대폭 감소 → LCP 단축, 메인 스레드 점유 시간(TBT) 감소
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
66
7교시: 렌더링 및 번들 최적화


당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
67
7교시: 렌더링 및 번들 최적화
한 번에 모든 데이터를 그리지 않고, 필요한 만큼만 분할하여 렌더링합니다.
🔴 문제: 아무리 React.memo로 리렌더링을 막아도, 최초 화면이 열릴 때 1,000개의 컴포넌트(DOM)를 억지로 그려야 하는 "초기 렌더링 물리적 병목" 발생. 메인 스레드 기절!
🔧 해결: 한 번에 보여줄 수 있는 단위(예: 20개)로 데이터를 잘라서 보여주는 페이지네이션(Pagination) 또는 눈에 보이는 영역만 그리는 가상화 렌더링(Virtualization) 도입
✅ 효과: 브라우저 연산량 1/50 감소 → TBT(총 블로킹 시간) 소멸, 쾌적한 화면 스크롤 확보
Pagination | 페이지네이션은 프론트엔드 단독 처리보다 백엔드(API)와 협의하여 필요한 데이터만 서버에서 가져오는 것이 실무의 정석
Virtualization | react-window, react-virtual 등 라이브러리를 활용해 뷰포트 내 보이는 항목만 DOM에 마운트하여 렌더링 비용 최소화
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
68
7교시: 렌더링 및 번들 최적화
🟡 전체 리스트 노란색/주황색으로 강조
부모 상태 변경 시 ListItem 수천 개 동시 리렌더링
⏱️ 렌더링 소요 시간: 340ms
단순 클릭 한 번에 메인 스레드 완전 점유
🔁 리렌더링 횟수: 수천 회
변경된 아이템과 무관한 컴포넌트까지 전부 실행
⬜ 최적화된 컴포넌트 회색(Did not render) 유지
변경된 컴포넌트만 선택적으로 렌더링
⏱️ 렌더링 소요 시간: 12ms
340ms → 12ms, 리액트 내부 연산 완전 생략 증명
🔁 불필요 리렌더링: 0회
React.memo + useCallback 적용으로 완전 차단
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
69
7교시: 렌더링 및 번들 최적화
413ms → 6ms
수천 회 → 0회
353.5ms → 4.2ms
29점 → 89점
Profiler 녹화 후 각 커밋의 렌더링 시간(ms) 스크린샷 저장
최적화 전/후 동일한 인터랙션으로 측정 (조건 통일)
렌더링 횟수 및 'Did not render' 컴포넌트 수 기록
📋 8교시: 수집한 수치 데이터를 성과 리포트로 구조화
💼 포트폴리오: P-A-A-R 프레임워크로 면접 답변 완성
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
70
7교시: 렌더링 및 번들 최적화
최적화가 끝났는데 100점이 아닌 이유는 왜일까요? 첫번째는 우리가 네트워크 지연으로 일부러 넣어둔 setTimeout과 진짜 서버가 아닌 localhost에서 측정했기 때문이에요. 실무 환경에 배포하면 CDN압축과 캐싱이 자동으로 붙어 무조건 90점 이상~후반대의 초록불을 보게 될거에요!
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
71
최종 성능 개선 지표 정리 및 기술 면접 대비 성과 데이터 수치화 전략
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
72
8교시: 성과 리포트 작성 및 커리어 가이드
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
73
8교시: 성과 리포트 작성 및 커리어 가이드
49.9s → 4.7s
0.204 → 0.0
353.5ms → 4.2ms
3.36MB → 19KB
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
74
8교시: 성과 리포트 작성 및 커리어 가이드
❌ 얼마나? 어떤 방법으로? 수치 없음
❌ 어떤 지표? 얼마나 빨라졌는지 불명확
❌ 어디서? 어떤 도구로? 개선폭 없음
❌ 어떤 번들이? 결과 수치가 없음
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
75
8교시: 성과 리포트 작성 및 커리어 가이드
✅ 도구(Lighthouse) + 수치(49.9s) + 기술(WebP, fetchpriority) + 결과(91% 단축)
✅ 도구(Profiler) + 원인(리렌더링) + 기술(memo, useCallback) + 결과(99% 개선)
✅ 기술(lazy, Dynamic Import) + 수치(3.36MB→19KB) + 결과(TBT 98.8% 단축)
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
76
8교시: 성과 리포트 작성 및 커리어 가이드
어떤 지표가 성능 기준 미달이었는가?
예: "Lighthouse 측정 결과 LCP 49.9s, CLS 0.204로 Google 권장 기준 초과"
Profiler나 Lighthouse로 포착한 구체적인 병목 지점은 어디인가?
예: "React Profiler Flame Graph에서 ListItem 컴포넌트 수천 개 동시 리렌더링 확인"
왜 해당 기술을 최적의 대안으로 선택했는가?
예: "React.memo + useCallback으로 Props 변화 없는 컴포넌트 렌더링 차단, WebP 전환으로 이미지 용량 94% 절감"
최종적으로 어떤 수치 변화와 사용자 경험 개선을 이끌어냈는가?
예: "LCP 49.9s → 4.7s (▼98.5%), INP 353.3ms → 4.2ms (▼99%), Lighthouse 29점 → 89점"
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
77
8교시: 성과 리포트 작성 및 커리어 가이드
성능 최적화의 비즈니스 가치 + 정확한 측정 환경 세팅
LCP, CLS, INP를 저하시키는 실제 코드 사례와 해결 원리
Network Waterfall 분석 + CPU 병목(Long Task) 탐색
재렌더링 원리 이해 + Flame Chart 병목 지점 특정
Measure → Fix → Verify 원칙 + 실습 환경 세팅
이미지 WebP 전환 + 폰트 로딩 개선 (LCP/CLS 개선)
React.memo + 코드 스플리팅 (INP/TBT 개선)
데이터 기반 리포트 작성 + 면접 답변 전략
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
78
8교시: 성과 리포트 작성 및 커리어 가이드
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
79
이제 여러분의 무기는 '열심히'뿐만이 아닌 '데이터를 보는 눈'입니다.
오늘 기록한 수치 하나하나가 여러분의 커리어 증거이자 몸값입니다.
수치가 있는 경험은, 그 자체로 가장 강력한 자기소개서 이기 때문입니다.
그리고 기억하세요.
성능을 개선한다는 것은 결국 사용자에게 더 나은 시간을 선물하는 일입니다.
앞으로 여러분이 만드는 모든 서비스가 누군가에게 '기분 좋은 경험'이 되길 바랍니다.
감사합니다. 🙏
당신의 웹이 느린 이유: 프론트엔드 성능 구출 작전

COPYRIGHT© DAMISEO All rights reserved.
80
당신의 코드가 느린 이유:
프론트엔드 성능 최적화 전략