
React Hooks의 개념과 실전 활용

Hooks의 등장 배경
React는 초기에 클래스형 컴포넌트를 사용했으나, 컴포넌트 간 로직 재사용이 어렵고, 상태 관리나 라이프사이클이 번거로웠습니다. 이 문제를 해결하기 위해 2018년에 Hooks가 도입되었습니다. Hooks를 사용하면 함수형 컴포넌트에서도 상태와 라이프사이클 기능을 훨씬 쉽게 활용할 수 있습니다.

Hooks란 무엇인가?
Hooks는 함수형 컴포넌트에서 React의 상태 관리와 생명주기 기능을 사용할 수 있게 해주는 특별한 함수입니다. 즉, 코드 구조를 더 간단하게 만들고 재사용성을 높여줍니다.
대표적인 기본 Hook 종류
대표적으로 많이 쓰는 기본 Hook에는 다음과 같은 것들이 있습니다.
useState
useEffect
useContext
useRef
useMemo
useCallback
이 각각은 상태 관리, 데이터 변경 감지, 컴포넌트 참조, 비용 절감 등에 특화된 기능을 제공합니다.
useState의 개념과 예시
useState는 함수형 컴포넌트에서 상태를 관리할 수 있도록 해주는 Hook입니다.
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
클릭 횟수: {count}
</button>
);
}위와 같은 방법으로 상태 값과 그 값을 갱신하는 함수를 사용할 수 있습니다.
useEffect의 개념과 예시
useEffect는 컴포넌트가 렌더링될 때마다 특정 작업을 수행할 수 있게 해줍니다. 주로 데이터 가져오기, 이벤트 등록, 구독 등에서 사용됩니다.
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `클릭 횟수: ${count}`;
}, [count]);
return <button onClick={() => setCount(count + 1)}>클릭!</button>;
}커스텀 Hook이란?
커스텀 Hook은 여러 컴포넌트에서 반복적으로 사용하는 로직을 별도의 함수로 만들어 재사용하는 기능입니다. 프로그래머가 직접 필요한 기능을 구현할 수 있어 코드가 깔끔해집니다.
예시로, window 크기 변화를 감지하는 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;
}Hooks의 장점
클래스형 컴포넌트 대비 코드가 더 간결함
로직 재사용(커스텀 Hook)을 통해 중복 코드를 줄일 수 있음
함수형 프로그래밍 방식으로 가독성과 유지보수성이 좋아짐
Hooks 사용시 주의할 점
Hooks는 반드시 컴포넌트의 최상위에서만 호출해야 하며, 조건문이나 반복문 안에서 호출해서는 안 됩니다. 또한, React 함수형 컴포넌트 또는 커스텀 Hook에서만 사용해야 합니다.
실전에서 Hooks 활용 예시
상태 관리, 데이터 비동기 처리, 사용자 인터랙션 추적 등 다양한 곳에 쓰입니다.
예를 들어 API에서 데이터를 받아오는 코드는 다음과 같습니다.
import { useState, useEffect } from 'react';
function useFetchData(url) {
const [data, setData] = useState(null);
useEffect(() => {
fetch(url)
.then(response => response.json())
.then(setData);
}, [url]);
return data;
}Hooks의 단점
너무 복잡한 로직은 Hook 내부에서 다루기 어려울 수 있음
모든 상태 관리가 useState로 적합하지 않은 경우도 있음(예: 매우 복잡한 상태)
hooks를 처음 접하는 개발자를 위한 팁
처음에는 useState, useEffect만 익히고, 점차 useContext·useRef·커스텀 Hook으로 확장하는 것이 좋습니다. 공식 문서와 커뮤니티 예시를 많이 접해보세요.
Hooks로 더 나은 React 코드 만들기
Hooks로 함수형 컴포넌트를 만들면 코드가 짧아지고, 유지보수가 쉬워집니다. 반복되는 로직은 커스텀 Hook으로 추출하면 팀 코드의 품질도 올라갑니다. Hooks를 적극적으로 활용해보세요!
Hooks에서 상태와 상태 변화 분리란?
사용자의 질문처럼, Hooks의 핵심은 '상태'와 '상태 변화'를 분리해 관리하는 데 있습니다. 기존 클래스형 컴포넌트에서는 컴포넌트 내부에 상태와 그에 대한 변화를 한데 묶어서 처리했기 때문에, 코드가 복잡해지고 재사용도 어려웠습니다.
Hooks에서는 예를 들어 useState를 사용할 때,
현재 상태 값(
count)그 상태를 변경할 수 있는 함수(
setCount)
이렇게 두 가지를 분리해서 제공합니다. 이를 통해 컴포넌트 내의 데이터(상태)와 그 데이터를 바꾸는 동작(상태 변화)이 명확히 구분됩니다.
이 분리 덕분에:
코드의 역할이 명확해지고
여러 컴포넌트에서 상태 변화 로직을 쉽게 재사용(커스텀 Hook 등)할 수 있으며
테스트와 유지보수도 용이해집니다
정리하면, Hooks는 상태와 상태 변화를 '별도의 개념으로 생각하고 관리한다'라는 관점을 바탕으로, 함수형 프로그래밍의 장점을 React 개발에 녹여낸 도구라고 할 수 있습니다.
hooks 에서 렌더링을 처리하는가?
Hooks 자체는 렌더링을 직접 처리하지 않습니다. Hooks는 상태 관리나 사이드 이펙트(예: 데이터 불러오기, 이벤트 등록)와 같은 로직 구현을 돕는 함수이고, 상태가 바뀔 때 React가 컴포넌트를 다시 렌더링하는 구조입니다.