본문 바로가기
개념 정리/모던 자바스크립트 딥다이브

모던 자바스크립트 : 타이머

by 매진2 2023. 12. 7.
728x90

1. 호출 스케줄링

호출 스케줄링 

  • 함수를 명시적으로 호출하면 함수가 즉시 실행됨
  • 호출 스케줄링 : 함수를 명시적으로 호출하지 않고 일정 시간이 경과된 후 호출되도록 함수 호출을 예약하는 것
    • 타이머 함수 사용

타이머 함수

  • 타이머 함수는 ECMAScript 사양에 정의된 빌트인 함수가 아님
    • 하지만 브라우저 환경과 Node.js 환경에서 모두 전역 객체의 메서드로서 타이머 함수 제공 => 타이머 함수는 호스트 객체
    • 타이머 함수는 모두 일정시간 경과된 이후 콜백 함수가 호출되도록 타이머 생성 => 타이머 함수가 생성한 타이머가 만료되면 콜백함수 호출
  • setTimeout 함수가 생성한 타이머 : 단한번 동작
  • setInterval 함수가 생성한 타이머 : 반복 동작

setTimeout, setInterval은 비동기 처리 방식

  • 자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택을 갖기 때문에 두가지 이상의 태스크 동시 실행 불가
  • 자바스크립트는 싱글 스레드로 동작 => setTimeout, setInterval은 비동기 처리 방식으로 동작

 

2. 타이머 함수

a. setTimeout / clearTimeout

  • setTimeout 함수는 두번째 인수로 전달받은 시간(ms, 1/1000초)으로 단 한번 동작하는 타이머 생성
  • 이후 타이머가 만료되면 첫번째 인수로 전달받은 콜백함수가 호출

  • setTimeout 함수는 생성된 타이머를 식별할 수 있는 고유한 타이머 id 반환
  • setTimeout 함수가 반환한 타이머 id는 브라우저 환경인 경우 숫자이며 Node.js 환경인 경우 객체
  • setTimeout 함수가 반환한 타이머 id를 clearTimeout 함수의 인수로 전달해 타이머 취소 가능

b. setInterval / clearInterval

  • setInterval 함수는 두번째 인수로 전달받은 시간 (ms, 1/1000초)으로 반복 동작하는 타이머 생성
  • 이후 타이머가 완료될때마다 첫번째 인수로 전달받은 콜백 함수가 반복 호출되며 타이머가 취소될때 까지 반복

  • setInterval 함수는 생성된 타이머를 식별할 수 있는 고유한 타이머 id 반환
  • setInterval 함수가 반환한 타이머 id는 브라우저 환경인 경우 숫자이며 Node.js 환경인 경우 객체
  • setInterval 함수가 반환한 타이머 id를 clearInterval 함수의 인수로 전달해 타이머 취소 가능

 

3. 디바운스와 스로틀

  • scroll, resize, input, mousemove 같은 이벤트는 짧은 시간 간격으로 연속해서 발생
    • 이러한 이벤트에 바인딩한 이벤트 핸들러는 과도하게 호출되어 성능에 문제 줄 수 있음
  • 디바운스, 스로틀 : 짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해 과도한 이벤트 핸들러의 호출 방지하는 프로그래밍 기법
    • 디바운스와 스로틀은 이벤트 처리할 때 매우 유용
    • 디바운스와 스로틀 구현에는 타이머 함수가 사용됨

a. 디바운스

디바운스

  • 디바운스 : 짧은 시간 간격으로 이벤트가 연속해서 발생하면 이벤트 핸들러를 호출하지 않다가 일정 시간이 경과한 이후에 이벤트 핸들러가 한번만 호출되도록 함
    • 짧은 시간 간격으로 발생하는 이벤트를 그룹화해서 마지막에 한번만 이벤트 핸들러가 호출되도록 함
  • 디바운스는 resize 이벤트 처리, Input 요소에 입력된 값으로 ajax 요청하는 입력 필드 자동완성 UI 구현, 버튼 중복 클릭 방지 처리 등에 유용하게 사용
  • 실무에서는 Underscore의 debounce 함수나 Lodash의 debounce 함수 사용

디바운스 예시

  • input 이벤트는 사용자 텍스트 입력 필드에 값을 입력할 때마다 연속해서 발생
  • 만약 input의 이벤트 핸들러에서 사용자가 입력 필드에 입력한 값으로 Ajax 요청과 같은 무거운 처리를 수행한다면 사용자가 아직 입력을 완료하지 않았어도 Ajax 요청 전송
  • 사용자가 입력을 완료했는지 여부를 정확히 알 수 없으므로 일정 시간 동안 텍스트 입력 필드에 값을 입력하지 않으면 입력이 완료된 것으로 간주
  • 이를 위해 debounce 함수가 반환한 함수는 debounce 함수에 두번째 인수로 전달한 시간(delay)보다 짧은 간격으로 이벤트가 발생하면 이전 타이머를 취소하고 새로운 타이머 재설정
  • 따라서 delay보다 짧은 간격으로 이벤트가 연속해서 발생하면 debounce 함수의 첫번째 인수로 전달한 콜백함수는 호출되지 않다가 delay 동안 input 이벤트가 더이상 발생하지 않으면 한번만 호출

b. 스로틀

스로틀 

  • 스로틀 : 짧은 시간 간격으로 이벤트가 연속해서 발생하더라도 일정 시간 간격으로 이벤트 핸들러가 최대 한번만 호출되도록 함
    • 짧은 시간 간격으로 연속해서 발생하는 이벤트를 그룹화해서 일정 시간 단위로 이벤트 핸들러가 호출되도록 호출 주기를 만듦
  • scroll 이벤트 처리나 무한 스크롤 UI 구현 등에 유용
  • 실무에서는 Underscore의 throttle 함수나 Lodash의 throttle 함수 사용

스로틀 예시

  • scroll 이벤트는 사용자가 스크롤할 때 짧은 시간 간격으로 연속해서 발생함
  • 이처럼 짧은 시간 간격으로 연속해서 발생하는 이벤트의 과도한 이벤트 핸들러의 호출을 방지하기 위해 throttle 함수는 이벤트를 그룹화해 일정 시간 단위로 이벤트 핸들러가 호출되도록 호출주기를 만듦
  • throttle 함수가 반환한 함수는 throttle 함수에 두번째 인수로 전달한 시간(delay)이 경과하기 이전에 이벤트가 발생하면 아무것도 하지 않다가 delay 시간이 경과했을 때 이벤트가 발생하면 콜백 함수를 호출하고 새로운 타이머 재설정 => delay 시간 간격으로 콜백 함수 호출

 

 

 

 

모던 자바스크립트 딥다이브 책을 정리한 내용입니다!!
728x90