728x90
반응형
React 커스텀 훅(Custom Hook) 톺아보기! ✨
React를 다루다 보면 같은 로직을 여러 컴포넌트에서 반복하게 되는 경우가 많죠. 예를 들어, API 호출이나 폼 유효성 검사 같은 로직 말이에요. 이럴 때, React의 커스텀 훅(Custom Hook)이 등장합니다. 오늘은 이 매력적인 도구를 파헤쳐 보고, 실제로 어떻게 사용되는지 함께 알아봐요!
커스텀 훅이란? 🤔
커스텀 훅은 React의 내장 훅(useState, useEffect 등)을 조합하거나, 특정 기능을 구현한 재사용 가능한 함수입니다. 이름에 use가 붙어야 하고, React의 훅 규칙을 따릅니다.
// 간단한 커스텀 훅 예시
import { useState } from "react";
function useCounter(initialValue = 0) {
const [count, setCount] = useState(initialValue);
const increment = () => setCount((prev) => prev + 1);
const decrement = () => setCount((prev) => prev - 1);
return { count, increment, decrement };
}
위의 예시에서 useCounter는 숫자를 증가시키거나 감소시키는 로직을 캡슐화한 커스텀 훅이에요. 이제 이 훅을 다양한 컴포넌트에서 재사용할 수 있죠!
커스텀 훅의 필요성 🌟
- 코드 재사용성
- 같은 로직을 여러 컴포넌트에서 반복 작성하지 않아도 돼요.
- 커스텀 훅에 캡슐화해 두면 로직 변경 시 한 곳만 수정하면 됩니다.
- 가독성 향상
- UI 로직과 비즈니스 로직이 분리되어 컴포넌트가 더 간결해집니다.
- 테스트 용이성
- 커스텀 훅은 함수이므로, 독립적으로 테스트하기 쉽습니다.
커스텀 훅의 작성 규칙 📜
React 훅의 규칙인 훅의 사용 규칙을 반드시 따라야 합니다:
- use로 시작: 모든 커스텀 훅 이름은 use로 시작해야 React가 훅으로 인식합니다.
- 컴포넌트 또는 다른 훅 내부에서 호출: 커스텀 훅은 컴포넌트의 최상위 레벨에서 호출해야 합니다.
- React 훅 사용: 커스텀 훅은 useState, useEffect 같은 내장 훅을 조합하거나 확장한 것이어야 합니다.
커스텀 훅의 활용 예제 💡
1. API 데이터 가져오기
API 데이터를 여러 컴포넌트에서 가져와야 한다면? 커스텀 훅으로 만들어 재사용할 수 있어요.
import { useState, useEffect } from "react";
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
const fetchData = async () => {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error("Network response was not ok");
}
const result = await response.json();
setData(result);
} catch (err) {
setError(err.message);
} finally {
setLoading(false);
}
};
fetchData();
}, [url]);
return { data, loading, error };
}
2. 폼 유효성 검사
커스텀 훅으로 폼 상태와 유효성 검사를 관리해 봅시다.
import { useState } from "react";
function useForm(initialValues) {
const [values, setValues] = useState(initialValues);
const handleChange = (e) => {
const { name, value } = e.target;
setValues({ ...values, [name]: value });
};
const resetForm = () => setValues(initialValues);
return { values, handleChange, resetForm };
}
// 사용 예시
function LoginForm() {
const { values, handleChange, resetForm } = useForm({ username: "", password: "" });
const handleSubmit = (e) => {
e.preventDefault();
console.log("Submitted:", values);
resetForm();
};
return (
<form onSubmit={handleSubmit}>
<input
name="username"
value={values.username}
onChange={handleChange}
placeholder="Username"
/>
<input
name="password"
type="password"
value={values.password}
onChange={handleChange}
placeholder="Password"
/>
<button type="submit">Submit</button>
</form>
);
}
커스텀 훅 사용 시 주의사항 🛠️
- 훅 내부에 조건문 X
- 훅은 항상 동일한 순서로 호출되어야 하므로, 조건문 안에서 호출하면 안 됩니다.
- 의존성 배열 관리
- useEffect 같은 훅을 사용할 때, 의존성 배열을 제대로 설정하지 않으면 무한 루프나 의도하지 않은 동작이 발생할 수 있어요.
- 과도한 추상화 금지
- 너무 복잡하거나 많은 기능을 담은 커스텀 훅은 오히려 코드 가독성을 떨어뜨립니다.
- 특정 기능에 집중된 훅을 작성하는 것이 좋아요.
커스텀 훅으로 더욱 깔끔한 React 코드 ✨
React의 커스텀 훅은 단순히 “코드 재사용”을 넘어서, 컴포넌트와 로직을 깔끔히 분리해 유지보수성을 극대화하는 도구입니다. 반복되는 작업이나 재사용 가능한 로직이 보인다면, 커스텀 훅으로 추출해보세요.
🌷전설의 개발자가 되어봅시당! 🌷
728x90
반응형
'Front-end > React' 카테고리의 다른 글
[React] ReactNode: 리액트의 만능 데이터 타입!📚 (3) | 2024.12.25 |
---|---|
[React] React-Virtualized: 엄청난 양의 데이터도 가볍게 렌더링하기! 🚀 (0) | 2024.12.23 |
[React] useCallback: 함수 메모이제이션의 정석! 🛠️ (0) | 2024.12.11 |
[React] useReducer: 상태 관리의 새로운 차원! 🎛️ (0) | 2024.12.10 |
[React] useEffect: 라이프 사이클 관리자 🔮 (2) | 2024.12.09 |