
쇼핑몰제작 후 매출이 안 오르는 진짜 이유: 웹 바이탈(Web Vitals) 최적화 실패기
쇼핑몰 제작 후 매출 부진의 원인인 웹 바이탈(Web Vitals) 최적화 실패 사례와 LCP, CLS 지표 개선을 통한 성능 최적화 실전 노하우를 공유합니다.
윤팀장
이커머스팀 팀장

안녕하세요. 풀링포레스트 이커머스팀 팀장 윤팀장입니다.
오늘은 조금 아픈 기억을 꺼내보려 합니다. "쇼핑몰이 너무 느려서 장바구니 담다가 나갔어요." 작년 하반기, 야심 차게 런칭했던 한 대형 브랜드몰 프로젝트 직후 고객사 CS 게시판에 올라온 글입니다. 기능 개발에만 몰두하느라 정작 사용자가 느끼는 '속도'라는 감각을 놓쳤던 것이죠. 개발자로서 뼈아픈 순간이었습니다.
보통 쇼핑몰제작 프로젝트를 진행하면 다들 어디에 집중할까요? 화려한 메인 배너, 복잡한 쿠폰 로직, 결제 연동 같은 기능 구현에 90% 이상의 리소스를 쏟습니다. 하지만 정작 오픈하고 나면 가장 큰 불만은 "느리다", "버벅거린다"에서 나옵니다. 오늘은 제가 겪었던 성능 이슈와 이를 해결하기 위해 '웹 바이탈(Core Web Vitals)' 지표를 어떻게 뜯어고쳤는지, 그 치열했던 과정을 공유하려 합니다.
왜 기능은 완벽한데 사용자는 떠날까?
당시 저희 팀은 정말 열심히 코드를 짰습니다. 리액트(React) 기반의 최신 스택을 도입했고, AWS 인프라도 빵빵하게 늘려뒀습니다. 기능 테스트는 완벽했습니다. 그런데 오픈 당일, 마케팅 트래픽이 몰리자마자 이탈률이 치솟았습니다. 서버가 터진 게 아니었습니다. 서버 응답 속도(TTFB)는 정상이었거든요. 문제는 브라우저 안에서 일어났습니다.
사용자들은 하얀 화면을 3초 이상 멍하니 바라봐야 했고, 이미지를 클릭하려는 순간 배너가 늦게 로딩되며 레이아웃이 밀려 엉뚱한 버튼을 누르기 일쑤였습니다. 구글 라이트하우스(Lighthouse) 점수를 돌려보니 처참했습니다. 성능 점수 42점. 빨간불이었습니다.
저희는 '쇼핑몰제작'이라는 과업을 단순히 '기능 구현'으로만 정의했던 겁니다. 사용자의 경험, 즉 UX 퍼포먼스는 간과했던 것이죠. 구글이 강조하는 웹 바이탈 지표인 LCP(최대 콘텐츠 풀 페인트), FID(최초 입력 지연), CLS(누적 레이아웃 이동)가 전부 기준치 미달이었습니다.

LCP: 고객은 2.5초 이상 기다려주지 않는다
가장 먼저 잡아야 했던 건 LCP였습니다. 사용자가 페이지에 진입했을 때 가장 큰 콘텐츠(주로 상품 메인 이미지)가 뜨는 시간을 말합니다. 당시 저희는 고해상도 이미지를 원본 그대로 S3에서 불러오고 있었습니다. 디자이너가 작업한 4MB짜리 png 파일이 모바일 네트워크를 타고 내려오니 느릴 수밖에 없었죠.
해결책은 의외로 기본에 있었습니다.
첫째, 이미지 포맷을 차세대 포맷인 WebP와 AVIF로 전면 교체했습니다. 이것만으로 용량이 70% 줄었습니다.
둘째, 이미지 CDN을 적극적으로 활용해 리사이징을 자동화했습니다. 모바일 기기에서 PC용 2000px 이미지를 로딩하는 낭비를 없앴습니다.
셋째,
fetchPriority="high"속성을 사용하여 브라우저에게 "이 이미지는 제일 먼저 다운로드해!"라고 명령했습니다.
결과는 극적이었습니다. 4.2초였던 LCP가 1.8초로 단축되었습니다. 사용자가 "아, 떴구나"라고 인지하는 속도가 빨라지니 이탈률이 눈에 띄게 줄어들더군요.
CLS: 구매 버튼이 도망가지 않게 잡아라
두 번째 문제는 CLS, 즉 레이아웃이 덜컥거리는 현상이었습니다. 쇼핑몰 상세페이지에서 흔히 겪는 일인데, 상품 설명을 읽으려는데 갑자기 위에서 이미지가 로딩되면서 텍스트가 아래로 훅 밀려나는 경험, 다들 있으시죠?
저희의 경우, 서드파티 리뷰 위젯과 개인화 추천 배너가 문제였습니다. 동적으로 데이터를 불러와서 화면에 끼워 넣다 보니, 이미 렌더링 된 화면을 계속 밀어냈던 겁니다.
이를 해결하기 위해 스켈레톤 UI(Skeleton UI)와 aspect-ratio CSS 속성을 도입했습니다. 이미지가 로딩되기 전이라도 해당 영역의 크기(가로세로 비율)를 미리 확보해 두는 것입니다. "여기는 리뷰 위젯이 들어갈 자리니까 비워둬"라고 브라우저에 미리 알려주는 셈이죠. 덕분에 뒤늦게 콘텐츠가 로딩되어도 화면이 덜컥거리지 않게 되었고, 잘못된 클릭으로 인한 사용자 짜증을 없앴습니다.

실전 최적화 체크리스트
혹시 지금 쇼핑몰제작 프로젝트를 진행 중이거나 운영 중이신가요? 개발자라면 당장 크롬 개발자 도구의 'Lighthouse' 탭을 켜보세요. 그리고 다음 항목들을 점검해 보시길 권장합니다. 저와 같은 실수를 반복하지 않으시길 바라는 마음으로 정리했습니다.
이미지 최적화: WebP/AVIF 포맷 사용 여부,
lazy loading적용 여부(단, LCP 요소는 제외),srcset을 통한 반응형 이미지 제공.폰트 최적화: 웹폰트 용량이 너무 크지 않은지,
font-display: swap을 사용해 텍스트가 안 보이는 시간(FOIT)을 없앴는지 확인.자바스크립트 다이어트: 불필요한 라이브러리가 번들링에 포함되진 않았는지, 코드 스플리팅(Code Splitting)으로 초기 로딩 용량을 줄였는지 점검.
서드파티 스크립트 관리: 마케팅용 픽셀이나 챗봇 스크립트가 메인 스레드를 막고 있지 않은지 확인(비동기 로딩 필수).
기술적 화려함보다 중요한 건 '사용자의 시간'
성능 최적화 작업을 마치고 재오픈했을 때, 고객사의 반응은 "빨라졌다"가 아니라 "매출이 올랐다"였습니다. 페이지 로딩 속도가 0.1초 빨라질 때마다 구매 전환율이 1%씩 오른다는 아마존의 통계는 거짓말이 아니었습니다.
개발자인 우리는 종종 복잡한 아키텍처나 최신 기술 스택 그 자체에 매몰되곤 합니다. 하지만 쇼핑몰제작의 본질은 결국 물건을 사고파는 행위를 기술로 돕는 것입니다. 사용자의 시간을 아껴주는 것, 클릭 한 번의 스트레스를 줄여주는 것. 그것이 엔지니어링이 비즈니스에 기여하는 가장 확실한 방법임을 이번 프로젝트를 통해 다시 한번 깨달았습니다.
앞으로도 풀링포레스트는 겉보기에만 화려한 쇼핑몰이 아니라, 속부터 단단하고 빠른 커머스 시스템을 만드는 데 집중하려 합니다. 성능 최적화는 한 번하고 끝내는 이벤트가 아니라, 서비스가 운영되는 내내 관리해야 할 '건강 지표'니까요. 여러분의 서비스는 지금 얼마나 건강한가요?


