SYWStudio
게스트로그인

메가공무원(소방) 메인 페이지 최적화를 다루며

👁️ 57회 읽음

2025. 5. 23.

  • #성능최적화
  • #퍼블리싱 노하우
  • #레이지로딩
  • #웹퍼포먼스
  • #대규모트래픽
  • #FCP
  • #LCP
  • #라이트하우스
  • #웹개발팁

수만 명의 사용자가 동시에 방문하는 사이트, 메인 페이지의 무게가 점점 커질수록
속도, UX, 서버 트래픽이라는 세 가지 과제를 동시에 해결해야 합니다.

이 글에서는 제가 직접 참여한 메가공무원 메인 페이지의 퍼포먼스 개선 사례를 바탕으로
Lazy LoadingAJAX 기반 비동기 통신, 그리고 Slick 슬라이더 최적화를 통해
렌더링 성능을 실제로 어떻게 개선했는지를 공유합니다.

✅ 개선의 핵심 목표

  • 첫 진입 시 FCP, LCP 속도 단축
  • 불필요한 초기 렌더링 제거 (위에 보이지 않는 영역 → Lazy load)
  • 이미지 로딩은 anticipated 방식으로 처리
  • 퍼블리셔 입장에서 유지보수 용이한 구조 구성

🔧 Lazy Loading 구조

Lazy loading은 화면에 아직 보이지 않은 영역의 코드를 뒤늦게 불러오는 방식입니다.
특히 스크롤을 내려 사용자의 뷰포트에 도달했을 때 해당 영역을 AJAX로 삽입합니다.

var isElemVisible = [];

function fncLazyLoadingData(dNm, fnc) { if (!$('#'+dNm).length) return;

if (fncCheckVisible($('#'+dNm)) && !isElemVisible[dNm]) { new Function(fnc)(); isElemVisible[dNm] = true; } }

function fncCheckVisible(elm, eval) { eval = eval || "object visible"; var viewportHeight = $(window).height(), scrolltop = $(window).scrollTop(), y = $(elm).offset().top, elementHeight = $(elm).height();

if (eval == "object visible") return ((y < (viewportHeight + scrolltop)) && (y > (scrolltop - elementHeight))); }

// 실제 로딩할 데이터 삽입
function fncLazyLoadingPage(id, path, params) {
  $.post(path, { now: "<%=lo_now_date%>", ...params }, function(data) {
    $("#" + id).append(data);
  }).always(function(){
    $("#" + id).removeClass("lazy_section");
  });
}
// 실행 예시
$(window).on('load scroll resize', function() {
  fncLazyLoadingData("lazy_loading_lineup", "fncLazyLoadingPage('lazy_loading_lineup', '/m/gong/bnr_zone/v24/all_lineup.asp')");
});

💡 주요 팁

  • new Function(fnc)으로 전달된 문자열 함수를 실행함으로써 구성 유연성을 높였습니다.
  • isElemVisible[dNm]로 중복 호출을 방지합니다.
.lazy_section {
  background: linear-gradient(to right, #eee 0%, rgba(0, 0, 0, 0.15) 20%, #eee 100%);
  background-position: 100% 0;
  background-size: 200% 100%;
  animation: skeleton-line 1.2s infinite;
}

🧠 Slick 슬라이더 최적화 적용

Slick 슬라이더에는 lazyLoad: 'anticipated'라는 옵션이 존재합니다. 이는 화면에 곧 보여질 이미지를 미리 불러오는 방식으로, 스크롤 인터랙션이 많은 UI에 효과적입니다.

<img data-lazy="<%=img_main%>/profphoto/.../pro_lec.png" alt="선생님" />
$('#teaColumn_list').not('.slick-initialized').slick({
  lazyLoad: 'anticipated',
  // 기타 옵션
})

📊 실제 성과

  • FCP 평균 2초 → 1초로 개선
  • LCP 수치도 2.9초 → 2.1초로 개선
  • 30% 이상 초기 렌더링 시간 감소
  • 사용자 스크롤 후 응답성 향상
  • UX 향상으로 이탈률 감소, 신뢰도 상승

✨ 마무리

많은 트래픽과 복잡한 구조 속에서도 빠르고 안정적인 퍼포먼스를 만들기 위해서는 시점 제어와 지연 로딩, 그리고 미리보기 UI 처리까지 고려하는 것이 중요합니다.

이번 프로젝트를 통해 얻은 인사이트는 다음과 같습니다:

  • “모든 걸 한 번에 그릴 필요는 없다.”
  • “사용자가 보는 순간에만 보여줘도 늦지 않다.”

빠르게, 그러나 부담 없이. 이 글이 대형 웹사이트 성능 개선을 고민 중이신 여러분께 도움이 되었기를 바랍니다.

FE 스쿨

이 글이 도움이 되셨나요? FE 스쿨에서 더 깊은 실무 강의를 제공합니다.

FE 스쿨 강좌 보기

AI 연구소

프론트엔드 엔지니어 실무자 관점에서 AI를 분석하고 인사이트를 제공합니다.

AI 연구소 바로가기

연관글

이 글과 함께 보면 좋은 글

3~6개의 추천 글로 체류시간과 광고 노출을 높였습니다.