- 0
- 2
useRef는 언제 사용하나?
답변 확인
useRef
는 React에서 컴포넌트의 렌더링과 관계없이 값을 유지하거나, DOM 요소에 직접 접근할 때 사용되는 훅- 즉, 상태(
useState
)처럼 값을 저장할 수 있지만, 값이 변경되더라도 컴포넌트가 리렌더링되지 않는 특징
1. useRef
가 필요한 경우
- 1️⃣ DOM 요소에 직접 접근할 때
- 2️⃣ 값이 변경되어도 렌더링이 필요 없는 경우 (ex: 이전 값 저장, 타이머 ID 저장 등)
- 3️⃣ 컴포넌트가 렌더링될 때도 값이 유지되어야 할 때
2. useRef
사용 예제
1️⃣ DOM 요소에 직접 접근할 때 (document.getElementById
대체)
import { useRef, useEffect } from 'react';
function InputFocus() {
const inputRef = useRef(null);
useEffect(() => {
inputRef.current.focus(); // 컴포넌트 마운트 시 input에 포커스를 맞춤
}, []);
return <input ref={inputRef} placeholder="입력하세요" />;
}
- ✅
useRef
를 사용하면document.getElementById
없이 DOM 요소에 직접 접근 가능 - ✅ 컴포넌트가 마운트될 때 자동으로 input에 포커스를 맞출 수 있음
2️⃣ 값이 변경되어도 리렌더링을 방지 (useState
와 비교)
import { useState, useRef } from 'react';
function Counter() {
const [count, setCount] = useState(0); // 상태(state)
const countRef = useRef(0); // useRef로 값 저장
const handleClick = () => {
setCount(count + 1); // 상태 변경 → 리렌더링 발생
countRef.current += 1; // ref 값 변경 → 리렌더링 없음
console.log('State:', count, 'Ref:', countRef.current);
};
return (
<div>
<p>State 값: {count}</p>
<p>Ref 값: {countRef.current}</p>
<button onClick={handleClick}>+1 증가</button>
</div>
);
}
- ✅
useState
는 값이 변경되면 컴포넌트가 리렌더링됨 - ✅
useRef
는 값이 변경되어도 리렌더링되지 않음 (console.log로만 확인 가능) - ✔ 렌더링과 관계없이 값이 유지되어야 한다면 useRef를 사용
3️⃣ 이전 값 저장 (이전 렌더링 값과 비교)
import { useState, useEffect, useRef } from 'react';
function PreviousValue() {
const [count, setCount] = useState(0);
const prevCountRef = useRef(0); // 이전 값 저장
useEffect(() => {
prevCountRef.current = count; // 현재 count를 저장
}, [count]);
return (
<div>
<p>현재 값: {count}</p>
<p>이전 값: {prevCountRef.current}</p>
<button onClick={() => setCount(count + 1)}>+1 증가</button>
</div>
);
}
- ✅ prevCountRef는 렌더링이 발생해도 이전 값을 유지
- ✅ 이전 값과 현재 값을 비교하는 기능을 구현할 때 유용
4️⃣ setTimeout / setInterval ID 저장 (타이머 관리)
import { useRef } from 'react';
function Timer() {
const timerRef = useRef(null);
const startTimer = () => {
timerRef.current = setInterval(() => {
console.log('타이머 실행 중...');
}, 1000);
};
const stopTimer = () => {
clearInterval(timerRef.current); // 타이머 중지
console.log('타이머 중지됨');
};
return (
<div>
<button onClick={startTimer}>타이머 시작</button>
<button onClick={stopTimer}>타이머 중지</button>
</div>
);
}
- ✅ useRef를 사용하면 타이머 ID를 저장하여 clearInterval로 정리 가능
- ✅ 컴포넌트가 리렌더링되더라도 타이머 ID가 유지됨
3. useRef
vs useState
차이점
구분 | useRef |
useState |
---|---|---|
렌더링 여부 | 값이 변경되어도 리렌더링되지 않음 | 값이 변경되면 리렌더링됨 |
DOM 접근 가능 여부 | ref.current 를 사용해 직접 접근 가능 |
직접적인 DOM 접근 불가 |
값 유지 여부 | 렌더링이 되어도 값이 유지됨 | 렌더링 시 새로운 값으로 초기화될 수 있음 |
주요 사용 사례 | DOM 요소 접근, 이전 값 저장, 타이머 ID 저장 등 | UI 상태 업데이트 |
- 📌 렌더링 없이 값을 유지해야 한다면
useRef
를 사용하고, 상태 업데이트가 필요하면useState
를 사용!
🔹 결론
- ✔ useRef는 DOM 요소에 접근하거나, 리렌더링 없이 값을 유지할 때 사용
- ✔ useRef를 활용하면 불필요한 리렌더링을 방지하고, 성능을 최적화할 수 있음
- ✔ 주요 사용 사례: DOM 조작, 이전 값 저장, setTimeout/Interval ID 저장, 값 변경 없이 상태 유지
참고 자료
Top comments (2)
- DavidYang2월 19일
우와 댓글이다~
- Olivia2월 19일
오오 ~~ :) 너무 글 좋네용