
쇼핑몰제작, 결국은 속도가 매출을 결정합니다: 웹 바이탈 개선기
쇼핑몰 매출을 결정짓는 핵심 요소인 웹 성능 최적화 경험을 공유합니다. LCP, CLS 등 웹 바이탈 지표 개선을 통해 사용자 경험과 매출을 동시에 잡는 전략을 확인하세요.
송찬영
CTO

안녕하세요. 풀링포레스트 CTO 송찬영입니다.
"로딩에 3초가 넘게 걸리면 사용자의 53%는 떠납니다."
구글이 발표한 이 통계는 수년이 지난 지금도 개발자들 사이에서 전설처럼 회자됩니다. 하지만 정작 현장에서 쇼핑몰을 만들다 보면 이 숫자가 주는 무게감을 잊을 때가 많습니다. 화려한 디자인, 복잡한 기능, 마케팅 트래킹 스크립트를 하나 둘 얹다 보면 어느새 우리 사이트는 무거운 짐을 진 거북이가 되어버리곤 하죠.
저희 풀링포레스트 팀도 최근 비슷한 고민에 빠졌습니다. 클라이언트의 요구사항을 완벽하게 구현했다고 생각했는데, 정작 오픈 직전 테스트에서 퍼포먼스 점수가 형편없게 나온 겁니다. 기능은 완벽했지만, 사용자 경험은 낙제점이었습니다. 오늘은 저희가 겪었던 이 시행착오를 바탕으로, 특히 쇼핑몰제작 과정에서 성능 최적화가 왜 중요한지, 그리고 어떻게 웹 바이탈(Web Vitals) 지표를 개선했는지 이야기해 보려 합니다.
화려함 뒤에 숨겨진 무거움
처음 문제는 아주 단순했습니다. "이미지가 너무 늦게 떠요."라는 QA 피드백이었습니다. 당시 저희는 고해상도 제품 이미지를 전면에 배치하는 전략을 쓰고 있었습니다. 디자이너와 기획자는 사용자가 제품의 디테일을 생생하게 느끼길 원했죠. 문제는 그 '생생함'이 사용자의 데이터와 인내심을 갉아먹고 있었다는 점입니다.
Lighthouse 점수를 돌려보니 처참했습니다. 특히 LCP(Largest Contentful Paint, 최대 콘텐츠 풀 페인트) 지표가 4초를 넘어가고 있었습니다. 사용자가 화면의 가장 큰 콘텐츠를 보는 데 4초 이상 걸린다는 뜻입니다. 이 정도면 이미 절반 이상의 고객은 뒤로 가기 버튼을 눌렀을 겁니다. CLS(Cumulative Layout Shift, 누적 레이아웃 이동)도 문제였습니다. 이미지가 로딩되면서 텍스트가 툭툭 밀려나는 현상이 발생하고 있었죠. 잘못 클릭하기 딱 좋은 상황이었습니다.

단순히 "서버를 늘리자"거나 "CDN을 쓰자"는 식의 인프라 접근으로는 해결되지 않는 문제였습니다. 이건 근본적인 프론트엔드 아키텍처와 리소스 관리의 문제였습니다. 쇼핑몰제작 단계에서 성능을 고려하지 않고 기능 구현에만 급급했던 저희의 안일함이 빚어낸 결과였죠.
웹 바이탈, 기술이 아니라 비즈니스입니다
개발자들은 성능 최적화를 '기술적인 챌린지'로만 받아들이는 경향이 있습니다. "코드를 줄여야지", "번들 사이즈를 줄여야지"라고 생각하죠. 하지만 CTO로서 제가 팀원들에게 강조한 것은 관점의 전환이었습니다. "성능은 곧 매출이다."
웹 바이탈 지표 중 LCP는 사용자가 우리 사이트가 '유용하다'고 느끼는 첫 순간입니다. FID(First Input Delay)는 사이트가 '반응한다'고 느끼는 순간이고요. 이 지표들이 나쁘다는 건, 가게 문을 열고 들어왔는데 점원이 인사는커녕 3초 동안 멍하니 서 있는 것과 같습니다.
저희는 즉시 '성능 다이어트'에 돌입했습니다. 가장 먼저 손댄 것은 역시 이미지였습니다. 단순히 용량을 줄이는 것을 넘어, 차세대 포맷인 WebP와 AVIF를 적극적으로 도입했습니다. 브라우저 지원 여부에 따라 <picture> 태그를 사용해 최적의 이미지를 서빙하도록 수정했죠. 이것만으로도 LCP가 1초 가까이 줄어들었습니다.
다음은 자바스크립트였습니다. 쇼핑몰 특성상 수많은 서드파티 스크립트(PG사 모듈, 분석 도구, 챗봇 등)가 들어갑니다. 이것들이 메인 스레드를 점유하면서 TBT(Total Blocking Time)를 높이고 있었습니다. 저희는 requestIdleCallback 같은 API를 활용해, 사용자의 인터랙션이 없는 유휴 시간에 비동기적으로 스크립트를 로드하도록 로직을 변경했습니다. 당장 결제할 것도 아닌데 PG사 모듈을 미리 불러올 필요는 없으니까요.
CLS와의 전쟁: 덜컹거리는 화면 잡기
가장 골치 아팠던 건 CLS였습니다. 상품 리스트에서 이미지가 로딩될 때마다 레이아웃이 덜컹거리는 현상은 사용자에게 큰 불쾌감을 줍니다. 원인은 간단했습니다. 이미지의 width와 height 속성을 명시하지 않았기 때문이었죠. 브라우저는 이미지가 다운로드되기 전까지 그 공간을 얼마나 비워둬야 할지 몰랐던 겁니다.
CSS의 aspect-ratio 속성을 활용해 이미지가 로드되기 전에도 공간을 미리 확보하도록 수정했습니다. 또한, 동적으로 생성되는 광고 배너 영역에도 고정된 높이값을 부여했습니다. "광고가 없으면 빈 공간으로 남는데요?"라는 반문이 있었지만, 화면이 덜컹거려 사용자가 엉뚱한 버튼을 누르는 것보다는 빈 공간이 낫다고 판단했습니다. 결과적으로 CLS 점수를 0.1 이하로 낮추며 구글이 권장하는 '안정적인' 상태를 만들 수 있었습니다.

쇼핑몰제작 시 놓치지 말아야 할 체크리스트
이번 경험을 통해 저희 팀은 쇼핑몰 프로젝트를 시작할 때 반드시 점검해야 할 성능 체크리스트를 만들었습니다. 여러분의 프로젝트에도 적용해 보세요.
이미지 최적화 전략 수립: 디자이너에게 고화질 원본만 요구하지 마세요. WebP 변환 파이프라인과 Lazy Loading 적용은 선택이 아닌 필수입니다.
폰트 로딩 전략: 웹 폰트가 로딩되는 동안 텍스트가 보이지 않는 현상(FOIT)을 막으세요.
font-display: swap을 적극 활용해야 합니다.서드파티 스크립트 감사: 마케팅 팀에서 요구하는 모든 트래킹 툴을
head태그에 넣지 마세요. 정말 필요한 시점에 로드되도록 제어해야 합니다.LCP 요소 우선순위화: 페이지에서 가장 중요한 콘텐츠(주로 히어로 이미지나 상품 썸네일)는
fetchpriority="high"속성을 사용해 브라우저에게 "이걸 제일 먼저 가져와!"라고 알려주세요.
기술적 부채를 넘어서
성능 최적화는 한 번 하고 끝나는 이벤트가 아닙니다. 코드가 추가되고 기능이 늘어날 때마다 성능은 필연적으로 떨어지려는 성질이 있습니다. 그래서 저희는 CI/CD 파이프라인에 Lighthouse CI를 연동했습니다. 성능 점수가 특정 기준 이하로 떨어지면 배포가 되지 않도록 강제한 것이죠. 처음에는 개발자들의 원성도 있었지만, 지금은 모두가 "덕분에 똥을 밟지 않았다"며 안도합니다.
쇼핑몰제작 과정에서 기능 구현은 건물을 짓는 것과 같습니다. 하지만 성능 최적화는 그 건물 안의 동선을 설계하고 엘리베이터 속도를 조절하는 일입니다. 아무리 멋진 건물이라도 이동하는 데 하루 종일 걸린다면 아무도 찾지 않을 것입니다.
기술 리더로서 가장 경계해야 할 것은 '기능의 완성'에 취해 '사용자의 시간'을 낭비하는 것입니다. 0.1초의 차이가 고객의 구매 결정에 영향을 미친다는 사실을 잊지 마세요. 빠르고 쾌적한 쇼핑몰이야말로 최고의 마케팅이자, 엔지니어링이 비즈니스에 기여하는 가장 확실한 방법입니다.
감사합니다.


