오늘은 리액트 공식문서의 커스텀 훅과 관련된 내용을 자세히 다루어보려고 합니다. 커스텀 훅을 통해 필요한 로직을 재사용하고 코드를 보다 효율적으로 구현할 수 있습니다.
해당 내용에 대해 더 깊이있게 알아보고 싶으신 분들은 아래 리액트 공식문서의 custom hook 부분을 참고해보세요.
기본 훅 (useState, useEffect 등)과 커스텀 훅의 차이점
React의 기본 훅은 useState, useEffect, useContext와 같이 React 라이브러리에 내장되어 있는 함수들로, 상태 관리, 라이프 사이클 이벤트 처리, 컨텍스트 관리 등 애플리케이션의 기본적인 기능을 수행합니다. 이들은 React 개발에 필수적인 요소이며, 모든 React 컴포넌트에서 공통적으로 사용됩니다.
반면, 커스텀 훅은 개발자가 특정 기능을 컴포넌트 간에 재사용할 수 있도록 자신만의 로직을 묶어서 만든 훅입니다. 커스텀 훅은 기본 훅을 조합하고 확장하여 새로운 기능을 생성할 수 있게 해주며, 이를 통해 애플리케이션의 유지 보수성을 향상시키고 코드 중복을 줄일 수 있습니다. 예를 들어, 데이터를 패칭하는 로직이 여러 컴포넌트에서 반복될 경우, 이를 useDataFetcher라는 커스텀 훅으로 추출하면, 간결하고 일관된 방법으로 해당 기능을 재사용할 수 있습니다.
기존 리액트 구조를 커스텀 훅으로 바꾸기
리액트 공식문서에 있는 custom hook의 예시에서는 네트워크 연결 상태를 관리하는 로직이 여러 컴포넌트에서 사용되는 경우 이 로직을 커스텀 훅으로 추출하면 여러 곳에서 쉽게 재사용할 수 있는 것을 보여줍니다.
커스텀 훅을 적용하지 않았을 때의 코드
import { useState, useEffect } from 'react';
function StatusBar() {
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
const handleOnline = () => setIsOnline(true);
const handleOffline = () => setIsOnline(false);
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
return <h1>{isOnline ? '✅ Online' : '❌ Disconnected'}</h1>;
}
커스텀 훅으로 리팩토링한 코드
import { useState, useEffect } from 'react';
function useOnlineStatus() {
const [isOnline, setIsOnline] = useState(true);
useEffect(() => {
const handleOnline = () => setIsOnline(true);
const handleOffline = () => setIsOnline(false);
window.addEventListener('online', handleOnline);
window.addEventListener('offline', handleOffline);
return () => {
window.removeEventListener('online', handleOnline);
window.removeEventListener('offline', handleOffline);
};
}, []);
return isOnline;
}
function StatusBar() {
const isOnline = useOnlineStatus();
return <h1>{isOnline ? '✅ Online' : '❌ Disconnected'}</h1>;
}
위의 내용은 커스텀 훅을 사용할 때의 주요 이점 중 하나를 강조하고 있습니다. 바로 컴포넌트 내부에서 반복적인 로직을 줄이고, 코드가 실제로 하고자 하는 바를 더 명확하게 표현할 수 있다는 점입니다. 이를 통해 컴포넌트는 구현 세부사항보다는 그 기능의 의도를 표현하게 됩니다.
커스텀 훅을 사용하는 이점
- 로직의 중복 감소: 컴포넌트 간에 반복되는 로직을 커스텀 훅으로 추출함으로써 코드 중복을 줄일 수 있습니다. 이는 코드의 유지보수를 쉽게 하고, 버그 발생 가능성을 낮춥니다.
- 의도의 명확성: 커스텀 훅을 사용하면 컴포넌트의 코드가 '무엇을' 하고자 하는지를 표현할 수 있습니다. 예를 들어, useOnlineStatus라는 이름의 훅을 보면, 이 훅이 온라인 상태를 관리한다는 것을 쉽게 알 수 있습니다.
- 세부 구현의 추상화: 네트워크 상태를 체크하거나 API 호출 같은 외부 시스템과의 상호작용을 관리하는 복잡한 세부사항을 커스텀 훅 안에 숨깁니다. 이로써 컴포넌트는 이러한 구현 세부사항을 신경 쓰지 않고, 실제로 필요한 기능에 집중할 수 있습니다.
코드 예시 해석
기존의 코드에서 useOnlineStatus 커스텀 훅을 도입하면 각 컴포넌트에서 네트워크 상태를 체크하는 로직을 직접 구현할 필요가 없습니다. 대신, 이 훅을 호출하여 반환된 값(isOnline)을 사용하여 컴포넌트의 UI를 조정할 수 있습니다. 이는 컴포넌트가 실제로 수행해야 할 작업을 간결하게 표현하면서도, 네트워크 이벤트에 대한 구독 및 구독 해제 같은 복잡한 작업을 훅 내부에서 처리하게 합니다.
function StatusBar() {
const isOnline = useOnlineStatus();
return <h1>{isOnline ? '✅ Online' : '❌ Disconnected'}</h1>;
}
이 코드에서 StatusBar 컴포넌트는 isOnline 상태를 사용해서 사용자에게 현재 네트워크 연결 상태를 표시합니다. 네트워크 상태가 변할 때마다 useOnlineStatus 훅은 이 변화를 감지하고 컴포넌트를 적절히 업데이트하여 최신 상태를 반영합니다. 이 방법으로, 컴포넌트는 자신의 주요 기능에 집중할 수 있으며, 내부 로직은 훅에 의해 관리됩니다.
'개발 이야기 > frontend' 카테고리의 다른 글
let과 const 심화 개념 - const의 참조 고정과 var를 요즘 안쓰는 이유 (0) | 2024.08.12 |
---|---|
Electron에서 React의 특정 페이지를 로드하는 방법 (0) | 2024.08.06 |
React 에서 index.html에 스크립트 태그가 없는 이유 (0) | 2024.04.18 |
[redux]리덕스 초기 세팅 및 폴더구조 생성 (0) | 2024.01.22 |
외부 컴포넌트 스타일을 해당 페이지에서 적용하기 위해 className을 넘겨주기 (0) | 2023.11.07 |
댓글