useRef
1. useRef란?
useRef는 렌더링에 상관없이 값을 저장하거나, DOM 요소에 직접 접근할 때 사용하는 Hook입니다.
1.1 useState vs useRef
| 특징 | useState | useRef |
|---|---|---|
| 값 변경 시 리렌더링 | O | X |
| 값의 불변성 | 불변 (setState로만 변경) | 가변 (직접 수정 가능) |
| 주 사용처 | 화면에 표시되는 데이터 | DOM 접근, 타이머 ID 저장 |
1.2 기본 구조
const ref = useRef(초기값);
// 값 접근
console.log(ref.current);
// 값 변경
ref.current = 새로운값;
2. DOM 요소에 접근하기
useRef의 가장 일반적인 사용법은 DOM 요소에 직접 접근하는 것입니다.
import { useRef } from 'react';
function App() {
const inputRef = useRef(null);
function handleClick() {
inputRef.current.focus();
}
return (
<div>
<input ref={inputRef} type="text" />
<button onClick={handleClick}>포커스 넣기!</button>
</div>
);
}
export default App;
버튼을 클릭하면 inputRef.current가 가리키는 input 요소에 포커스가 들어갑니다. 바닐라 JS의 document.querySelector('input').focus()와 같은 역할입니다.
왜 document.querySelector를 안 쓸까요?
React는 컴포넌트로 구성되는데, 같은 컴포넌트가 여러 번 사용되면 동일한 클래스/아이디가 충돌할 수 있습니다. CSS Module을 사용하면 클래스명이 자동 생성되어 querySelector로 접근하기 어렵습니다. useRef는 각 컴포넌트 인스턴스별로 독립적인 참조를 제공합니다.
3. 값 저장하기 (리렌더링 없이)
useRef로 저장한 값은 변경해도 리렌더링이 발생하지 않습니다.
function Counter() {
const count = useRef(0);
const handleCountUp = () => {
count.current = count.current + 1;
console.log(`count: ${count.current}`); // 콘솔에는 증가한 값 출력
};
return (
<div>
<div>{count.current}</div> {/* 화면은 0으로 유지 */}
<button onClick={handleCountUp}>증가</button>
</div>
);
}
버튼을 클릭하면 콘솔에는 증가한 값이 출력되지만, 화면의 숫자는 변하지 않습니다. 리렌더링이 발생하지 않기 때문입니다.
4. 실습
자동 저장 기능이 있는 메모장을 만들어보세요. useRef로 타이머를 관리합니다.
[기본 코드]
import { useRef, useState, useEffect } from 'react';
function AutoSaveMemo() {
const [content, setContent] = useState('');
const [lastSaved, setLastSaved] = useState(null);
const timerRef = useRef(null);
const handleChange = (e) => {
setContent(e.target.value);
};
return (
<div>
<h1>자동 저장 메모장</h1>
<textarea
value={content}
onChange={handleChange}
placeholder="메모를 입력하세요..."
/>
{lastSaved && <p>마지막 저장: {lastSaved}</p>}
</div>
);
}
export default AutoSaveMemo;
[요구사항]
-
자동 저장 기능
- 입력 후 1초 뒤 localStorage에 저장
- 저장 완료 시 "마지막 저장: HH:MM:SS" 표시
-
타이머 관리 (useRef 활용)
- 새 입력 시 이전 타이머 취소
- 컴포넌트 언마운트 시 타이머 정리
-
데이터 복원
- 페이지 새로고침 시 저장된 내용 불러오기