티스토리 뷰
반응형
React Hook 사용 전략 – 커스텀 훅으로 비즈니스 로직 정리하기
React에서 상태와 로직을 관리할 때
useEffect, useState, useRef 등을 반복해서 사용하다 보면
컴포넌트가 점점 지저분해지고 재사용성이 떨어지게 됩니다.
이럴 때 유용한 해결책이 바로 커스텀 훅(Custom Hook) 입니다.
이번 글에서는 커스텀 훅을 만드는 방법,
그리고 실무에서 유용하게 쓰이는 패턴을 예제 중심으로 소개합니다.
✅ 커스텀 훅이란?
React 훅(useState, useEffect, 등)을 조합하여 만든
재사용 가능한 함수입니다. 이름은 반드시 use로 시작해야 합니다.
function useCounter() {
const [count, setCount] = useState(0);
const increment = () => setCount((c) => c + 1);
const reset = () => setCount(0);
return { count, increment, reset };
}
📦 사용 예
function Counter() {
const { count, increment, reset } = useCounter();
return (
<>
<p>카운트: {count}</p>
<button onClick={increment}>+1</button>
<button onClick={reset}>Reset</button>
</>
);
}
✅ UI와 로직을 분리하여 더 읽기 쉽고 유지보수에 유리한 코드가 됩니다.
🧠 커스텀 훅이 필요한 경우
반응형
- 여러 컴포넌트에서 동일한 상태/이펙트를 사용할 때
- API 호출 로직을 공통화할 때
- useEffect + loading/error 상태가 반복될 때
- 토글, 폼 상태, 타이머 등 반복적인 로직을 분리할 때
🔧 실전 예제 1 – useToggle
function useToggle(initial = false) {
const [value, setValue] = useState(initial);
const toggle = () => setValue((v) => !v);
return [value, toggle] as const;
}
const [isOpen, toggleOpen] = useToggle();
✅ 불리언 상태를 간단하게 관리할 수 있음
🔧 실전 예제 2 – useFetch (API 요청)
function useFetch<T>(url: string) {
const [data, setData] = useState<T | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<Error | null>(null);
useEffect(() => {
let ignore = false;
setLoading(true);
fetch(url)
.then((res) => res.json())
.then((data) => {
if (!ignore) setData(data);
})
.catch(setError)
.finally(() => setLoading(false));
return () => {
ignore = true;
};
}, [url]);
return { data, loading, error };
}
const { data, loading, error } = useFetch<User[]>("/api/users");
✅ fetch 로직을 훅으로 분리하여 반복 제거
🔧 실전 예제 3 – useInput (폼 필드 관리)
function useInput(initial: string = "") {
const [value, setValue] = useState(initial);
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setValue(e.target.value);
};
return { value, onChange, setValue };
}
const name = useInput();
<input {...name} />
✅ 여러 input을 쉽게 관리할 수 있어 폼에서 유용함
💡 커스텀 훅 만들 때 주의할 점
규칙 설명
이름은 use로 시작 | React가 훅으로 인식하도록 필수 |
내부에서 훅 사용 가능 | useState, useEffect 등 사용 가능 |
조건문 안에서는 사용 ❌ | 훅의 규칙 위반 (항상 같은 순서로 호출되어야 함) |
🧠 오늘의 요약
항목 설명
커스텀 훅 | 여러 훅을 조합해 재사용 가능한 함수로 만든 것 |
사용 이유 | 중복 로직 제거, 컴포넌트 코드 분리 |
대표 패턴 | useToggle, useFetch, useInput, useTimer 등 |
사용 규칙 | 반드시 use로 시작, 최상위에서 호출, 훅 내부 호출 가능 |
🧪 실습 과제
- useToggle을 만들어서 모달 열고 닫는 로직을 관리해보세요
- useFetch를 만들어 공통 API 호출을 분리해보세요
- useInput을 적용하여 회원가입 폼 필드 3개 이상 만들어보세요
📌 다음 글 예고
👉 React 앱 테스트 전략 – 유닛 테스트부터 E2E까지
- Jest, React Testing Library 기본 사용법
- 컴포넌트 유닛 테스트 작성하기
- 사용자 시나리오 기반 테스트 흐름
React 커스텀 훅, useToggle, useFetch, useInput, React 상태 분리, React 코드 재사용, React API 훅, React Hook 설계, 비즈니스 로직 분리, React 실전 패턴
'framework > React' 카테고리의 다른 글
React 프로젝트 성능 최적화 전략 – Lazy Loading, 코드 분할, 메모이제이션까지 (0) | 2025.04.23 |
---|---|
React 앱 테스트 전략 – 유닛 테스트부터 E2E까지 (0) | 2025.04.22 |
React 프로젝트에 TypeScript 도입하기 – 실전 마이그레이션 가이드 (0) | 2025.04.17 |
React 상태 관리 라이브러리 비교 – Context vs Redux vs Zustand (0) | 2025.04.16 |
React + API 통신 완전 정복 – fetch와 Axios 비교 (1) | 2025.04.15 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Next.js
- nextJS
- gatsbyjs
- 프론트엔드
- CI/CD
- llm
- Webpack
- 파이썬 알고리즘
- nodejs
- rag
- Prisma
- 웹개발
- github
- LangChain
- kotlin
- 관리자
- fastapi
- NestJS
- PostgreSQL
- Docker
- App Router
- Ktor
- AI챗봇
- Python
- seo 최적화 10개
- REACT
- 프론트엔드면접
- 백엔드개발
- 개발블로그
- SEO최적화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형