본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
CodeDeck AI
2025. 11. 8. · 8 Views
React Hooks 완벽 가이드
React Hooks의 핵심 개념부터 고급 활용까지 다루는 실전 가이드입니다. useState, useEffect, 커스텀 훅 등 실무에서 자주 사용하는 패턴을 예제와 함께 소개합니다.
들어가며
이 글에서는 React Hooks 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- useState_기본_사용법
- useEffect_생명주기_관리
- useEffect_클린업_함수
- useContext_전역_상태_관리
- useRef_DOM_접근
- useMemo_연산_최적화
- useCallback_함수_메모이제이션
- 커스텀_Hook_기본
- useReducer_복잡한_상태_관리
- 커스텀_Hook_데이터_페칭
1. useState 기본 사용법
개요
컴포넌트에서 상태를 관리하는 가장 기본적인 Hook입니다. 상태 값과 상태를 업데이트하는 함수를 반환합니다.
코드 예제
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
클릭 횟수: {count}
</button>
);
}
설명
useState(0)으로 초기값 0을 설정하고, setCount로 상태를 업데이트합니다. 버튼 클릭 시 count가 1씩 증가합니다.
2. useEffect 생명주기 관리
개요
컴포넌트의 사이드 이펙트(API 호출, 구독 등)를 처리하는 Hook입니다. 의존성 배열로 실행 시점을 제어할 수 있습니다.
코드 예제
import { useState, useEffect } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
useEffect(() => {
fetch(`/api/users/${userId}`)
.then(res => res.json())
.then(data => setUser(data));
}, [userId]);
return <div>{user?.name}</div>;
}
설명
userId가 변경될 때마다 API를 호출하여 사용자 정보를 가져옵니다. 의존성 배열 [userId]로 실행 조건을 지정합니다.
3. useEffect 클린업 함수
개요
useEffect에서 반환하는 함수는 컴포넌트가 언마운트되거나 다음 effect 실행 전에 호출됩니다. 구독 해제나 타이머 정리에 사용합니다.
코드 예제
import { useEffect } from 'react';
function Timer() {
useEffect(() => {
const timer = setInterval(() => {
console.log('1초마다 실행');
}, 1000);
return () => clearInterval(timer);
}, []);
return <div>타이머 실행 중</div>;
}
설명
컴포넌트가 마운트될 때 타이머를 시작하고, 언마운트될 때 클린업 함수로 타이머를 정리합니다.
4. useContext 전역 상태 관리
개요
Context API와 함께 사용하여 props drilling 없이 전역 상태를 관리합니다. 여러 컴포넌트에서 같은 데이터를 공유할 때 유용합니다.
코드 예제
import { createContext, useContext } from 'react';
const ThemeContext = createContext('light');
function Button() {
const theme = useContext(ThemeContext);
return (
<button className={theme}>
테마: {theme}
</button>
);
}
설명
ThemeContext에서 현재 테마 값을 가져와 버튼에 적용합니다. Provider로 감싸진 모든 하위 컴포넌트에서 접근 가능합니다.
5. useRef DOM 접근
개요
DOM 요소에 직접 접근하거나 리렌더링 없이 값을 저장할 때 사용합니다. 값이 변경되어도 리렌더링이 발생하지 않습니다.
코드 예제
import { useRef } from 'react';
function InputFocus() {
const inputRef = useRef(null);
const handleClick = () => {
inputRef.current.focus();
};
return (
<>
<input ref={inputRef} />
<button onClick={handleClick}>포커스</button>
</>
);
}
설명
useRef로 input 요소를 참조하고, 버튼 클릭 시 inputRef.current.focus()로 직접 포커스를 설정합니다.
6. useMemo 연산 최적화
개요
비용이 큰 연산 결과를 메모이제이션하여 불필요한 재계산을 방지합니다. 의존성 배열의 값이 변경될 때만 다시 계산합니다.
코드 예제
import { useMemo, useState } from 'react';
function ExpensiveComponent({ items }) {
const [count, setCount] = useState(0);
const total = useMemo(() => {
return items.reduce((sum, item) => sum + item.price, 0);
}, [items]);
return <div>총액: {total}</div>;
}
설명
items 배열이 변경될 때만 총액을 다시 계산합니다. count가 변경되어도 total은 재계산되지 않아 성능이 향상됩니다.
7. useCallback 함수 메모이제이션
개요
함수를 메모이제이션하여 불필요한 함수 재생성을 방지합니다. 자식 컴포넌트에 콜백을 전달할 때 리렌더링을 줄일 수 있습니다.
코드 예제
import { useCallback, useState } from 'react';
function TodoList() {
const [todos, setTodos] = useState([]);
const addTodo = useCallback((text) => {
setTodos(prev => [...prev, { id: Date.now(), text }]);
}, []);
return <TodoForm onAdd={addTodo} />;
}
설명
addTodo 함수는 컴포넌트가 리렌더링되어도 동일한 참조를 유지합니다. TodoForm이 불필요하게 리렌더링되는 것을 방지합니다.
8. 커스텀 Hook 기본
개요
반복되는 로직을 재사용 가능한 Hook으로 분리합니다. use로 시작하는 이름을 사용하고 다른 Hook을 조합할 수 있습니다.
코드 예제
import { useState, useEffect } from 'react';
function useWindowWidth() {
const [width, setWidth] = useState(window.innerWidth);
useEffect(() => {
const handleResize = () => setWidth(window.innerWidth);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}, []);
return width;
}
설명
윈도우 너비를 추적하는 로직을 커스텀 Hook으로 분리했습니다. 여러 컴포넌트에서 const width = useWindowWidth()로 재사용할 수 있습니다.
9. useReducer 복잡한 상태 관리
개요
useState보다 복잡한 상태 로직을 관리할 때 사용합니다. Redux와 유사한 패턴으로 액션을 통해 상태를 업데이트합니다.
코드 예제
import { useReducer } from 'react';
function reducer(state, action) {
switch(action.type) {
case 'increment': return { count: state.count + 1 };
case 'decrement': return { count: state.count - 1 };
default: return state;
}
}
function Counter() {
const [state, dispatch] = useReducer(reducer, { count: 0 });
return <button onClick={() => dispatch({type: 'increment'})}>{state.count}</button>;
}
설명
reducer 함수로 상태 업데이트 로직을 분리하고, dispatch로 액션을 전달합니다. 여러 상태가 연관될 때 유용합니다.
10. 커스텀 Hook 데이터 페칭
개요
API 호출 로직을 재사용 가능한 Hook으로 만듭니다. 로딩 상태와 에러 처리를 포함하여 완전한 데이터 페칭 솔루션을 제공합니다.
코드 예제
import { useState, useEffect } from 'react';
function useFetch(url) {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(data => { setData(data); setLoading(false); });
}, [url]);
return { data, loading };
}
설명
URL을 받아서 데이터를 가져오는 로직을 커스텀 Hook으로 캡슐화했습니다. 어떤 컴포넌트에서든 간단하게 사용할 수 있습니다.
마치며
이번 글에서는 React Hooks 완벽 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#React #Hooks #useState #useEffect #CustomHooks
댓글 (0)
함께 보면 좋은 카드 뉴스
AWS Certificate Manager로 HTTPS 인증서 발급 완벽 가이드
AWS Certificate Manager를 사용하여 무료로 SSL/TLS 인증서를 발급받고, 로드 밸런서에 적용하여 안전한 HTTPS 웹 서비스를 구축하는 방법을 초급자도 쉽게 따라 할 수 있도록 단계별로 안내합니다.
Route 53으로 도메인 연결 완벽 가이드
AWS Route 53을 사용하여 도메인을 등록하고 실제 서비스에 연결하는 전 과정을 실무 스토리와 함께 쉽게 배워봅니다. DNS의 기본 개념부터 레코드 설정, ELB 연결까지 초급 개발자도 쉽게 따라할 수 있도록 구성했습니다.
AWS RDS 관리형 데이터베이스 완벽 가이드
직접 데이터베이스를 설치하고 관리하는 것이 부담스러운 초급 개발자를 위한 RDS 가이드입니다. 데이터베이스 엔진 선택부터 인스턴스 생성, 보안 설정, 백업까지 실무에 필요한 모든 내용을 다룹니다.
AWS Auto Scaling 완벽 가이드
트래픽 급증에 대비하는 자동 확장 시스템을 단계별로 구축합니다. AMI 생성부터 Auto Scaling Group 설정, 테스트까지 초급 개발자를 위해 실무 중심으로 설명합니다.
AWS 로드 밸런서와 보안 그룹으로 트래픽 분산 구성 완벽 가이드
초급 개발자를 위한 AWS 로드 밸런서와 보안 그룹 실습 가이드입니다. Application Load Balancer와 Network Load Balancer의 차이부터 보안 그룹 설정, 대상 그룹 생성, 실제 EC2 연결까지 실무에 필요한 모든 내용을 이북처럼 술술 읽히는 스타일로 담았습니다.