← 모든 작업
02 / SWING WEBEngineering · Performance

SWING 첫 화면 표시 지연 개선

렌더링과 전송 자원을 함께 살폈어요.

PERIOD

2026.07

MY ROLE

SWING 홈페이지 프론트엔드 개발

TOOLS & CONTEXT

Next.js · TypeScript · Lighthouse · WebP · 성능

01 / CONTEXT

업무 맥락

SWING 홈페이지는 첫 화면이 늦게 보였고 초기 전송 자원도 컸어요. 렌더링 구조와 미디어, 폰트, 외부 콘텐츠가 함께 초기 로딩에 영향을 주고 있었어요.

Next.js 구조를 옮기며 자원별 초기 비용을 줄였어요. 같은 조건의 로컬 모바일 Lighthouse 측정으로 전후를 비교했고, 운영에서 발견한 이미지 첫 변환 지연도 후속 수정했어요.

  • Next.js 렌더링 구조
  • 미디어·폰트 최적화
  • Lighthouse 측정
  • 운영 이미지 후속 개선
맡은 역할과 협업

고객에게 보이는 디자인을 유지하면서 초기 표시를 개선했어요. 폰트는 점수만으로 결정하지 않고 기존 글자 굵기 표현과 전송 비용을 함께 비교했어요.

02 / DECISIONS

선택과 구현

  1. 01

    첫 화면 표시 경로 단축

    기존 화면에는 클라이언트 렌더링을 기다리는 시간과 큰 초기 자원이 함께 있었어요.

    Pages Router에서 App Router의 서버 우선 구조로 옮기고 한국어·영어 경로를 프리렌더링했어요.

    로컬 프로덕션 빌드에서 한·영 경로와 반응형 상태를 확인했어요.

  2. 02

    초기 자원 로딩 시점 조정

    히어로 GIF, 외부 콘텐츠와 여러 폰트 파일이 첫 로딩의 전송량을 키웠어요.

    GIF를 MP4와 WebP 포스터로 바꾸고, 외부 콘텐츠는 화면에 가까워질 때 불러오도록 했어요.

  3. 03

    폰트 용량과 굵기 표현의 균형

    regular 글꼴만 쓰는 방식은 점수에서 유리한 경우가 있었지만 원래 디자인의 굵기 표현을 잃을 수 있었어요.

    여러 방식을 비교한 뒤 굵기 표현을 유지하면서 요청을 줄이는 가변 WOFF2 서브셋을 선택했어요.

    폰트만 따로 비교한 로컬 실험에서 요청이 4건에서 1건으로 줄었어요.

  4. 04

    빌드 단계의 이미지 변환

    초기 개선 이후 운영에서 이미지가 처음 변환될 때 지연되는 문제가 보였어요.

    요청 시 변환하는 대신 34개 원본에서 106개 반응형 WebP를 빌드 시 생성하고 정적 자원으로 제공했어요.

    후속 로컬 확인에서 이미지 변환 요청과 깨진 이미지 여부를 한·영 경로에서 살폈어요.

같은 조건에서 비교했어요.BEFORE → AFTER
Performance54 → 95
초기 전송량19.805 → 0.488 MB

로컬 프로덕션 빌드 · Lighthouse 모바일 시뮬레이션
이전 3회 / 이후 5회 중앙값 · 2026.07 당시 측정

03 / ENGINEERING

기술적 구현

렌더링과 브라우저가 받는 자원, 서버가 요청마다 하는 일을 나눠 살폈어요. 첫 화면에 필요한 내용은 미리 만들고, 상호작용과 외부 콘텐츠는 필요한 곳에만 남겼어요.

  • Next.js App Router
  • Server Components
  • IntersectionObserver
  • sharp
  • next/image
  • WOFF2
  1. 01빌드

    언어별 페이지와 이미지 변형을 빌드에서 만들어요.

  2. 02첫 응답

    미리 만든 HTML과 영상 포스터를 보내요.

  3. 03상호작용

    메뉴·캐러셀에 필요한 클라이언트 코드를 실행해요.

  4. 04스크롤

    외부 콘텐츠는 화면에 가까워질 때 불러와요.

첫 화면 표시와 이후 상호작용에 필요한 작업을 나눠 정리했어요.
RENDERING

상호작용을 위한 클라이언트 영역

언어별 경로를 generateStaticParams로 만들고 서버에서 번역 사전을 읽었어요. 페이지·레이아웃은 서버 컴포넌트로 구성하고, 메뉴처럼 상태와 이벤트가 필요한 부분만 별도 클라이언트 컴포넌트로 분리했어요.

LOADING

뷰포트 근처에서 iframe 로드

IntersectionObserver로 뉴스 영역이 뷰포트 300px 이내에 들어오면 iframe을 만들고 관찰을 해제했어요. 로드 전에도 같은 높이의 자리를 확보했고, 브라우저가 관찰 API를 지원하지 않을 때는 콘텐츠가 빠지지 않도록 별도 로드 경로를 뒀어요.

ASSET PIPELINE

빌드 시점 이미지 변환

sharp로 회전 보정·폭별 리사이즈·WebP 생성을 빌드에서 수행했어요. next/image의 커스텀 로더는 요청한 너비 이상인 변형 중 하나를 골라 정적 파일 주소를 반환해요. 등록되지 않은 이미지는 원본 경로를 사용하고, 생성 파일은 버전 경로로 구분했어요.

FONT

폰트 굵기와 초기 요청 우선순위

가변 WOFF2 서브셋 하나에 사용하는 굵기를 담고 next/font/local로 연결했어요. 히어로 포스터의 초기 우선순위를 고려해 폰트 preload를 끄고 display: swap을 사용했어요. 그 효과는 별도의 폰트 비교 실험으로 확인했어요.

04 / VERIFICATION

검증과 결과

동일 조건 전후 비교

로컬 프로덕션 빌드의 Lighthouse 모바일 시뮬레이션에서 개선 전 3회, 후 5회 측정한 중앙값을 비교했어요. Performance는 54→95점, 초기 전송량은 19.805→0.488MB였어요.

폰트 선택

같은 로컬 조건에서 5회 측정한 별도 폰트 비교에서 요청 4건·186.9KB가 1건·109.6KB로 줄었어요. 전체 홈페이지 측정과는 다른 비교예요.

이미지 후속 확인

빌드 시 이미지 생성으로 바꾼 뒤 로컬 프로덕션에서 이미지 변환 요청 0건과 한·영 10개 경로의 깨진 이미지 0건을 확인한 기록이 있어요.

OUTCOME

Performance 54→95점, 초기 전송량 19.805→0.488MB(97.5% 감소)를 기록했어요.

이 수치는 로컬 시뮬레이션 결과로 실사용자 성능이나 전환율을 보여 주지 않아요. 여러 변경을 함께 적용한 결과예요.

05 / REFLECTION

작업에서 확인한 점

로컬 측정 후 운영에서 이미지 변환 지연을 발견했어요. 변환 작업을 빌드 단계로 옮긴 뒤 다시 확인했어요.

경력 기록과 구현 근거를 바탕으로 정리했어요. 도식은 작업을 설명하려고 재구성한 것으로, 비공개 제품 화면과 데이터는 포함하지 않았어요.

NEXT / YELLOW BUS

Yellow Bus 운행 도구 재구성