- 게시됨
Next.js에서의 소음 제거
- 작성자
- 이름
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
React v16.8의 useEffect를 사용하여 Next.js에서 비용이 많이 드는 작업 디바운싱하기
React v16.8은 함수형 컴포넌트에서 부수 효과를 실행할 수 있도록 하는 useEffect
라는 새로운 훅을 도입했습니다. useEffect
는 API 호출과 같은 비용이 많이 드는 작업을 처리하는 좋은 방법이지만, 약간의 작업이 필요할 수 있습니다. 이 글에서는 Next.js에서 useEffect
를 사용하여 비용이 많이 드는 작업을 디바운싱하는 방법을 보여드리겠습니다.
디바운싱이란 무엇일까요?
디바운싱은 함수가 호출되는 속도를 제어하는 기술입니다. 예를 들어, 사용자가 입력을 멈출 때만 실행하고 싶은 비용이 많이 드는 작업이 있을 때 유용합니다. 이 경우 사용자가 특정 시간 동안 입력을 멈출 때만 API 호출을 디바운싱하여 수행할 수 있습니다.
useEffect
useEffect
는 함수형 컴포넌트에서 부수 효과를 실행할 수 있도록 하는 훅입니다. 클래스 컴포넌트의 componentDidMount
와 componentDidUpdate
와 유사합니다. 첫 번째 인수는 컴포넌트가 마운트되거나 업데이트될 때 호출되는 함수입니다. 두 번째 인수는 종속성 배열입니다. 종속성이 변경되면 해당 함수가 다시 호출됩니다. 배열이 비어 있으면 해당 함수는 컴포넌트가 마운트될 때만 호출됩니다.
import React, { useEffect } from 'react'
const MyComponent = () => {
useEffect(() => {
console.log('This will be called when the component mounts')
}, [])
useEffect(() => {
console.log('This will be called when the component mounts and when the dependencies change')
}, [dependency1, dependency2])
return <div>Hello world</div>
}
Next.js에서 디바운싱하는 방법
먼저 디바운싱을 처리할 커스텀 훅을 만들어야 합니다. 간단한 예는 다음과 같습니다.
import { useState, useEffect } from 'react'
export default function useDebounce(value, delay) {
const [debouncedValue, setDebouncedValue] = useState(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => {
clearTimeout(handler)
}
}, [value, delay])
return debouncedValue
}
이 훅은 디바운싱할 값과 지연 시간(밀리초 단위)의 두 가지 인수를 받습니다. 디바운싱된 값을 반환합니다. 이 훅은 useEffect
를 사용하여 지정된 지연 시간 후에 디바운싱된 값을 업데이트하는 타임아웃을 설정합니다. 또한 값이나 지연 시간이 변경되면 타임아웃을 정리하는 정리 함수를 생성합니다.
이제 값을 디바운싱할 수 있는 훅이 생겼으므로 이를 사용하여 API 호출을 디바운싱할 수 있습니다. 예를 들어 다음과 같습니다.
import useDebounce from './useDebounce'
export default function Search() {
const [search, setSearch] = useState('')
const debouncedSearch = useDebounce(search, 500)
useEffect(() => {
if (debouncedSearch) {
fetch(`/api/search?q=${debouncedSearch}`)
}
}, [debouncedSearch])
return <input type="text" value={search} onChange={(e) => setSearch(e.target.value)} />
}
이 컴포넌트는 사용자가 500밀리초 동안 입력을 멈추면 /api/search
로 API 호출을 수행합니다. 디바운싱은 입력 필드의 값을 쿼리 문자열로 사용하여 API 호출을 수행합니다.
성능
디바운싱은 Next.js에서 비용이 많이 드는 작업을 처리하는 저렴한 방법입니다. 추가 종속성이 필요하지 않기 때문에 lodash.debounce
와 같은 라이브러리를 사용하는 것보다 저렴합니다. 또한 추가 코드를 번들로 묶을 필요가 없기 때문에 react-throttle
과 같은 라이브러리를 사용하는 것보다 저렴합니다.
결론
디바운싱은 함수가 호출되는 속도를 제어하는 데 유용한 기술입니다. 사용자가 입력을 멈출 때만 실행하고 싶은 비용이 많이 드는 작업이 있을 때 유용합니다. 이 글에서는 useEffect
를 사용하여 Next.js에서 비용이 많이 드는 작업을 디바운싱하는 방법을 보여드렸습니다.
이 글이 마음에 드셨다면 JavaScript Hashmap, Performant and Simple도 좋아하실 수 있습니다.