Frontend

[React] useRef 사용해보기

min_ee 2025. 7. 4. 18:16

 

useRef란?

useRef는 변경 가능한 ref객체를 생성하며, 이 객체는 .current라는 property를 가진다.

이 값을 DOM 요소에 연결하거나, 렌더링 사이에 유지해야하는 값을 저장하는데 사용할 수 있다.

 

const ref = useRef(초기값);
ref.current = 저장할 값;

- 값이 바뀌어도 컴포넌트는 다시 렌더링되지 않는다.

- DOM 요소에 직접 접근할 때도 사용된다.

 

실습해보기

input에 포커스 주기

버튼을 눌렀을 때 input에 포커스가 가도록 만들어봤다.

useRef로 해당 DOM 요소에 직접 접근할 수 있다.

import { useRef } from "react";

const FocusInput = () => {
	const inputRef = useRef<HTMLInputElement>(null);

	const handleClick = () => {
		inputRef.current?.focus();
	};

	return (
		<div>
			<h2>useRef로 input 포커스</h2>
			<input
				ref={inputRef}
				type="text"
				placeholder="클릭 시 포커스 됨"
				style={{ marginRight: "1rem" }}
			/>
			<button onClick={handleClick} style={{ marginTop: "1rem" }}>
				포커스 주기
			</button>
		</div>
	);
};

export default FocusInput;

포커스 주기 버튼을 클릭하면 input에 focus가 활성화되는 것을 확인할 수 있다.

렌더링 횟수 추적하기

useRef는 값이 바뀌어도 렌더링되지 않는다는 특징이 있다.

해당 특징을 활용해 컴포넌트가 몇 번 렌더링됐는지를 추적해봤다.

import { useEffect, useRef, useState } from "react";

const RenderCount = () => {
	const [value, setValue] = useState("");
	const renderCount = useRef(1);

	useEffect(() => {
		renderCount.current += 1;
	});

	return (
		<div>
			<h2>랜더링 횟수 추적</h2>
			<input value={value} onChange={(e) => setValue(e.target.value)} />
			<p>랜더링 횟수: {renderCount.current}</p>
		</div>
	);
};

export default RenderCount;

input값을 변경할 때마다 렌더링 횟수가 올라가는 것을 확인할 수 있다.

renderCount는 상태가 아니라서 리렌더링이 발생하지 않는다.

 

정리

- useRef는 렌더링 없이 값을 저장하거나 DOM에 직접 접근할 때 사용된다.

- .current를 통해 값을 읽거나 쓸 수 있다

- 상태처럼 렌더링을 유발하지 않기 때문에 성능 최적화에 유리할 때도 있다.

- input 포커스, 이전 값 저장, 외부 라이브러리 DOM 접근 등에 자주 쓰인다.

 

 

useRef는 프로젝트를 진행하면서 모달 팝업을 제어나 특정 DOM에 포커스를 줄 때 사용했었는데

이번에 정리해보면서 렌더링 없이 값을 유지할 수 있다는 특징을 명확히 이해하게 되었다.

단순한 도구 같지만 상황에 따라 꽤 유용하게 활용할 수 있는 Hook이라는걸 다시 느꼈다.

 

공식 문서

 

useRef – React

The library for web and native user interfaces

react.dev