Skip to main content

Command Palette

Search for a command to run...

Javascript resize 이벤트 구현 팁

resize 이벤트 최적화 방식 세가지를 정리했습니다.

Published
2 min readView as Markdown
Javascript resize 이벤트 구현 팁
T

Software engineer for web tech. Interested in sustainable growth as software engineer.

홈페이지 개발을 하다보면 resize 이벤트를 자주 구현하게 되는데요. resize 이벤트를 구현할 때 아무래도 이벤트의 발생 빈도가 잦다보니 화면의 깜빡임이나, 성능이 느려지는 현상이 가끔 관찰 됩니다. 이런 문제를 좀 더 깔끔하게 해결할 방법을 조사하고 정리해보겠습니다.

resize 이벤트는 윈도우 크기가 변경될 때마다 발생하는데, 이는 사용자가 브라우저 창의 크기를 드래그 형식으로 조정하거나 하면 매우 빈번하게 발생할 수 있습니다. 이러한 이벤트의 발생은 위에서 언급한 것처럼 화면의 사용성을 헤치거나 성능 문제를 일으킬 수 있습니다. 이를 위해 적절한 최적화 방법을 고려해보는 것이 중요합니다.

requestAnimationFrame(rAF) 사용

  • requestAnimationFrame은 브라우저가 다음 repaint를 수행하기 전에 지정된 콜백을 실행할 수 있도록 예약해 주는 방식입니다. 이를 활용하면 만약 resize 이벤트가 너무 자주 발생하더라도 실제로 화면을 다시 그리는 작업은 브라우저의 프레임 속도에 맞춰 효율적으로 수행됩니다. 즉, 불필요한 계산을 줄이고, 부드러운 사용자 경험을 유지하는데 도움을 줄 수 있습니다.

  • 예시

      let rafId = null;
    
      function onResize() {
          cancelAnimationFrame(rafId);
          rafId = requestAnimationFrame(() => {
              // 이벤트 처리 로직 작성
          });
      }
    
      window.addEventListener('resize', onResize);
    

디바운스 활용

  • 이벤트가 발생한 후 일정 시간 동안 추가적인 이벤트 호출이 없을 때만 이벤트 처리 함수를 실행하는 방식입니다. 마지막 이벤트 발생 후 일정 시간이 지나야 실행되므로, 빈번한 이벤트 발생 시 불필요한 처리를 줄일 수 있습니다.

  • 예시

      function debounce(func, wait = 500) {
          let timeout;
    
          return function (...args) {
              const later = () => {
                  clearTimeout(timeout);
                  func(...args);
              };
    
              clearTimeout(timeout);
              timeout = setTimeout(later, wait);
          }
      }
    
      function onResize() {
          // 이벤트 처리 로직
      }
    
      const debouncedResizeHandler = debounce(onResize, 250);
      window.addEventListener('resize', debouncedResizeHandler);
    

스로틀 활용

  • 정해진 시간 간격으로 이벤트 처리 함수를 실행하는 방식입니다. 이벤트가 아무리 빈번하게 발생해도, 이 간격을 기준으로 함수가 실행되어 처리량을 제한할 수 있습니다.

  • 예시

      function throttle(func, limit = 500) {
          let inThrottle;
          return function() {
              const args = arguments;
              const context = this;
              if (!inThrottle) {
                  func.apply(context, args);
                  inThrottle = true;
                  setTimeout(() => inThrottle =false, limit);
              }
          }
      }
    
      function onResize() {
          // 이벤트 처리 로직
      }
    
      const throttledResizeHandler = throttle(onResize, 250);
      window.addEventListener('resize', throttledResizeHandler );
    

마치며

크게 세가지 방식의 resize 이벤트 최적화 방식을 살펴봤습니다. 상황에 따라 혹은 사용 사례에 따라 최적화 방식을 선택해야 합니다. 예를 들어, 화면의 크기가 변할 때마다 즉시 반응해야 하는 인터렉티브한 요소가 있으면 raf를 사용합니다. 사용자가 크기 조정을 멈춘 후에 어떤 동작을 실행해야 한다면 디바운스, 일정 간격으로 반응을 제한하고 싶다면 스로틀을 활용할 수 있습니다.
제 글을 통해 소개시켜드린 방식이 머리 한켠에 잘 있다가 필요할 때 떠올리실 수 있게 되길 바라며 글을 마칩니다.

More from this blog

프론트엔드는 경계를 다루는 직무가 되어간다

프론트엔드는 원래도 복잡했습니다. 브라우저마다 다른 렌더링, 상태 동기화, 성능, 접근성 — 화면 하나 제대로 만드는 데 신경 쓸 게 늘 많았습니다. 다만 그 복잡함은 대체로 한 방향을 향했습니다. 이 UI를 어떻게 만들까, 상태를 어떻게 관리할까, 클릭하면 무엇이 바뀌어야 할까. 그런데 요즘 질문의 축이 하나 더 늘고 있습니다. 이 UI는 서버에서 먼저

Jul 20, 20266 min read

AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

솔직히 말하면, 요즘 PR을 제때 리뷰하지 못하고 있습니다. 개발 속도는 빨라졌는데 리뷰 속도는 그대로입니다. 예전엔 하루 이틀이면 처리하던 게 이제는 며칠씩 밀립니다. 처음엔 제가 게을러진 탓인가 싶었습니다. 돌아보니 그게 아니었습니다. AI 도구를 쓰면서 코드가 쏟아지는 속도가 달라졌습니다. 한 사람이 만들어내는 코드 양이 예전과 비교가 안 됩니다. P

Mar 18, 20263 min read
AI가 코드를 짜는 시대, 나는 리뷰를 못 따라가고 있었다

테드풀의 한 입 지식

78 posts

가볍게 정리하는 기록들입니다.