Frontend Performance Audit

Rinda Landing 프론트엔드
최적화 감사 리포트

Next.js 15 랜딩페이지의 이미지·폰트·번들·렌더링·캐싱·a11y·SEO 8개 차원을 전수 분석했습니다. 모든 발견 항목은 실제 파일 경로와 수치에 근거합니다.

대상: rinda-landing · Next.js 15.5 · React 19 · 분석일 2026-06-19

151 MB
public 자산 총량
42–48 MB
예상 절감 (≈30%)
35
500KB 초과 이미지
5
P0 시급 이슈
−300~800ms
LCP 개선 여력
P0 즉시 (사용자 체감·대용량) P1 단기 (구조·효율) P2 개선 (품질·정합)

핵심 우선순위 요약

전체 발견 항목을 심각도순으로 정리했습니다. P0 5건만 처리해도 약 40MB 이상 절감과 즉각적인 LCP 개선이 가능합니다.

우선영역이슈규모예상 효과난이도
P0이미지buyer-elec-sea.jpg 무압축21 MB13–15 MB ↓ (WebP)낮음
P0이미지래스터 내장 SVG 3종 (base64 PNG)4.9 MB3–4 MB ↓중간
P0이미지500KB 초과 PNG/JPEG 35개, WebP/AVIF 변형 없음76+ MB25–35 MB ↓높음
P0폰트Pretendard 정적 4종 + Variable 동시 로드3.75 MB2.3 MB ↓ (Variable만)낮음
P0렌더링LCP 이미지에 priority 0건8–10장LCP −300~800ms낮음
P1이미지raw <img> 5곳 — next/image 우회5곳동적 이미지 대역폭 −10~15%낮음
P1설정deviceSizes·imageSizes·minimumCacheTTL 미설정srcset 효율 +5~10%낮음
P1번들framer-motion·recharts 클라 번들 상주~190 KB15–25 KB ↓ (dynamic)중간
P1폰트한글 unicode-range 서브셋 미적용748 KB300–400 KB ↓중간
P1SEO6개 로케일 hreflang 누락다국어 SEO 정합낮음
P2접근성alt="" 빈 대체텍스트 43곳+43+a11y 준수낮음
P2CSSsafelist 광범위 + 색상 스케일 중복~5–10 KB3–5 KB ↓낮음
P2이미지Image sizes 미지정 45–50곳45–50모바일 srcset 낭비 ↓중간
P2렌더링'use client' 155/845 (18.3%)15520–50 KB ↓ (RSC 전환)높음

01 이미지 & 시각 자산

public 151MB 중 절대다수가 이미지입니다. 단일 21MB JPEG, 래스터를 base64로 품은 "가짜 SVG", priority 부재가 핵심 3대 병목입니다.

1.1 상위 대용량 이미지 (Top 15)

#파일크기포맷예상 절감
1images/buyer-elec-sea.jpg21 MBJPEG60–70%
2images/buyer-med-us.png7.0 MBPNG50–60%
3images/buyer-elec-me.png5.4 MBPNG50–60%
4images/hero-bg.png4.9 MBPNG50–60%
5images/hero/hero-bg-new.png4.2 MBPNG50–60%
6–8buyer-it-us / buyer-it-jp / buyer-elec-us .png각 3.2 MBPNG50–60%
9images/buyer-fashion-sea.jpg3.0 MBJPEG40–50%
10–15buyer-med-jp / cover-ja / buyer-med-eu / buyer-it-eu / buyer-fashion-eu / industry-51.3–2.8 MBPNG50–60%

Top 15 합계 ≈ 76 MB → 보수적 절감 35–45 MB (45–60%)

1.2 P0 래스터 내장 SVG (가짜 벡터)

3개 SVG가 실제로는 <image xlink:href="data:image/png;base64,…"> 형태로 PNG를 통째로 품고 있습니다. SVG 확장자지만 벡터 이점이 전혀 없고 용량만 큽니다.
파일크기내장 래스터권장
all-sales-one-platform.svg1.8 MBPNG 1248×713추출 → WebP 500–600KB
zero-manual-sales.svg1.7 MBPNG 1344×768추출 → WebP 500–600KB
find-buyers-globally.svg1.4 MB패턴+image 혼합순수 벡터 재추출 or WebP

1.3 P1 raw <img> — next/image 우회 5곳

62곳은 next/image 사용(양호)이나, 아래 5곳은 raw 태그라 AVIF/WebP 변환·srcset·lazy 혜택을 모두 잃습니다. 3곳은 alt="" 동반.

파일라인문제
components/landing/PopupRenderer.tsx252최적화 없음 + 빈 alt
components/admin/popups/PopupPreviewOverlay.tsx150최적화 없음 + 빈 alt
components/admin/popups/PopupManager.tsx782최적화 없음 + 빈 alt
components/analytics/ChatbotWidget.tsx1795원격 URL, 최적화 없음
pages/blog/rss.xml.tsx44RSS XML 내 — 최적화 불가(정상)

1.4 P1 next.config 이미지 설정 공백

formats: ["image/avif","image/webp"]는 설정됨(양호). 다만 아래 3개 미설정으로 srcset이 비효율적입니다.

누락영향권장값
deviceSizesTailwind 브레이크포인트와 불일치[320,640,768,1024,1280,1536,1920]
imageSizes대형 이미지 srcset 비최적레이아웃별 명시
minimumCacheTTL브라우저 캐시 기본 60초3600 이상

02 폰트 & 타이포그래피

next/font/local + display:swap은 잘 구성됨. 그러나 정적 4종과 Variable을 동시에 싣고, 한글 서브셋이 없어 ko 사용자가 3.75MB를 받습니다.

2.1 P0 폰트 파일 중복 (public/fonts/Pretendard/)

파일크기비고
Pretendard-Bold.woff2773 KBweight 700
Pretendard-SemiBold.woff2767 KBweight 600
Pretendard-Medium.woff2760 KBweight 500
Pretendard-Regular.woff2748 KBweight 400
PretendardVariable.woff2748 KB중복 — 전 weight 1파일
정적 4종(3.05MB) + Variable(748KB) = 3.75MB 동시 로드. Variable 단독이면 ~748KB → 약 2.3MB 절감. src/utils/fonts.ts의 4-weight path 제거 후 Variable만 사용.

2.2 폰트 로딩 설정 (src/utils/fonts.ts)

항목상태조치
display: "swap"양호FOIT 회피 — 유지
Noto CJK preload:false양호비CJK 방문자에 미전송 — 유지
한글 unicode-range 서브셋P1U+AC00-D7AF 서브셋 → 300–400KB ↓
Variable 미사용P0정적 삭제, Variable 단독 → 2.3MB ↓
LCP 폰트 preloadP2rel=preload 추가 시 한글 렌더 200–500ms ↓

03 번들 & 의존성

'use client' 155/845(18.3%). dynamic import 약 60곳 적용(양호)이나 무거운 시각화 라이브러리는 여전히 클라 상주.

의존성대략(gzip)용도조치
recharts~120 KB계산기·분석 차트P1 홈 불필요 → dynamic
framer-motion~70 KB히어로·스크롤 애니P1 비핵심 애니 dynamic
firebase-admin~35 KB서버 전용(추정)클라 누출 점검
embla-carousel-react~25 KB캐러셀P2 dynamic 후보
@anthropic-ai/sdk~50 KBAPI(서버)클라 미포함 확인

04 CSS & 스타일링

tailwind.config.ts 508줄·14KB. Tailwind v3 기본 purge로 충분하나, 광범위 safelist와 색상 스케일 이중 명명이 미세 낭비.

항목발견절감
색상 스케일 중복legacy(01–09) + new(50–1000) 병존3–5 KB
safelist 패턴/^p-\[.+\]$/ 등 임의값 강제 포함2–3 KB
커스텀 폰트 유틸.text-ko-a-* 60+ 유틸1–2 KB

05 렌더링 & 로딩 전략

히어로/배너 이미지에 priority가 단 한 곳도 없어 LCP가 지연됩니다. 서드파티 스크립트 로딩은 대체로 양호.

LCP 핵심: priority=true 0건. 히어로 hero-bg.png(4.9MB)가 lazy 우선순위로 로드 → 추정 LCP 2.5–3.5s. priority + 경량화 시 1.8–2.2s 기대.
항목상태조치
LCP 이미지 priorityP0above-fold 이미지에 priority 부여
GTM (@next/third-parties)양호hydration 후 로드 — 유지
reCAPTCHA v3양호provider lazy — 유지
'use client' 18.3%P2랜딩 30–50% RSC 전환 여지

06 캐싱 & 네트워크

ISR 8개 페이지 적절히 배치(홈 300s, 가이드 3600s). /public/images 캐시 헤더와 LCP preload만 보강하면 됩니다.

항목상태조치
ISR 전략양호홈 300s·가이드 3600s 적절
/images Cache-ControlP2public, max-age=86400, immutable 추가
Vary(locale) 헤더양호로케일 캐시 분리 — 유지
LCP 이미지 preloadP2headers Link: rel=preload 고려

07 접근성 (a11y)

alt=""가 raw img 3/5곳, Image 컴포넌트 43곳+. 스크린리더 정보 손실. 자동 axe/Lighthouse 감사 권장.

이슈개수심각도
raw <img> 빈 alt3/5P1
Image 컴포넌트 빈 alt43+P2
장식 SVG aria-hidden 미점검미상P2

08 SEO & 메타데이터

sitemap·robots·llms.txt·structured-data 모두 구비(양호). 6개 로케일 hreflang 부재가 유일한 P1.

항목상태비고
sitemap.xml / robots.txt양호존재
llms.txt / llms-full.txt양호AI 에이전트 친화
structured-data (schema.org)양호존재
hreflang (en·ko·ja·id·zh-CN·th)P1alternate 링크 누락 — 추가 필요

실행 우선순위 로드맵

난이도·효과 기준 3단계. Phase 1만으로 전체 절감의 90% 이상을 확보합니다.

Phase 11–2일 · 빠른 승리
  • Pretendard 정적 4종 삭제 → Variable 단독 2.3MB ↓
  • 히어로/above-fold 이미지에 priority 부여 LCP −300~500ms
  • 래스터 내장 SVG 3종 → PNG 추출 후 WebP 3.3–4MB ↓
  • 500KB+ 이미지 35개 WebP/AVIF 일괄 변환 25–35MB ↓
Phase 22–4일 · 중간
  • raw <img> 5곳 → next/image (priority·sizes·alt)
  • next.config deviceSizes·imageSizes·minimumCacheTTL 추가
  • Pretendard 한글 unicode-range 서브셋 300–400KB ↓
  • framer-motion·recharts dynamic import 15–25KB ↓
Phase 33–5일 · 장기
  • 6개 로케일 hreflang 추가 (다국어 SEO)
  • alt="" 43곳+ 의미 있는 텍스트로 채움
  • 'use client' 30–50개 Server Component 전환 20–50KB ↓
  • Tailwind 색상 스케일 통합 3–5KB ↓
42–48 MB ↓
public 151MB의 약 30% 절감 · LCP −300~800ms · 다국어 SEO·a11y 정합 확보