인프런 커뮤니티 질문&답변
useRef, useState count 비교
해결된 질문
작성
·
24
0
안녕하세요 강사님!
강의에서 useRef는 값이 변경되었을 때 리렌더링을 발생시키지 않으므로 값이나 DOM 요소를 참고하고 싶을 때 사용한다고 하셨는데요.
1)
강의 예제 중, 수정이 일어난 횟수를 countRef에 담기도록 하셨는데, 이 때 값이 변경되어 'onChange 함수에서 setInput 함수를 호출함으로써 리렌더링이 발생하는 것이고, countRef.current++는 리렌더링이 발생함과 동시에 값이 증가 되는 것 뿐이다'라고 이해하면 되는 것일까요? 1번 코드 참고하시면 됩니다!
2)
위처럼 이해를 하다가 문득 궁금한 것이 생겼는데, 2번 코드처럼..
useState의 input 객체에 count 프로퍼티를 추가하여 0으로 초기화 해주었습니다.
그리고 onChange 함수에서 setInput으로 count를 +1 시켜주었는데요.
1번 예제처럼 수정할 때 마다 count가 +1 되는 것을 의도하였는데,
이 때 textarea에서 ㄱ을 입력했다면,
setInput 함수는 한 번 호출되며 textarea 수정과 count 증가가 동시에 발생하고 'textarea 수정 + count 증가' 이렇게 리렌더링이 한 번 발생하는 걸까요?
3) 만약 2번 질문의 답이 '결국 setInput 함수가 한 번 호출되며 작동하는 것이므로 리렌더링은 한 번이다.' 라면, 1번과 2번 코드는 '리렌더링이 발생할 때 마다 count 증가'라는 점에서 같은 결과인 걸까요..?
질문이 좀 복잡하지만.. 답변해주시면 감사하겠습니다..!
1) useRef 사용하여 count
import { useRef, useState } from "react";
export default function Test() {
const [input, setInput] = useState({
name: "",
bio: "",
});
const countRef = useRef(0);
console.log(input);
console.log(countRef.current);
const onChange = (e) => {
countRef.current++;
setInput({
...input,
[e.target.name]: e.target.value,
});
};
return (
<div>...</div>
)
}2) useState로 count
import { useState } from "react";
export default function Test() {
const [input, setInput] = useState({
name: "",
bio: "",
count: 0,
});
console.log(input);
const onChange = (e) => {
setInput({
...input,
[e.target.name]: e.target.value,
count: input.count + 1,
});
};
return (
<div>...</div>
)
}답변 2
1
안녕하세요 tjsgh9352님 순서대로 답변드릴게요
1번 질문
결과적으로는 맞습니다. 그러나 더 엄밀히 따지면 다음의 순서대로 동작합니다.
컴포넌트 리렌더링은 함수가 종료된 이후에 일어난다는것이 핵심입니다
countRef.current의 값 증가
setInput 함수 호출 -> State 업데이트
컴포넌트 리렌더링
2번 질문
네 맞습니다.
이때 참고로 만약 같은 이벤트 핸들러(onChange) 내에서 setInput을 두번 호출해 textarea의 값과 count를 각각 변경했다고 하더라도 리액트는 이를 합쳐서 처리합니다. 따라서 리렌더링은 이럴 경우에도 한번만 발생합니다. 자세한 내용은 아래의 공식문서를 참고해보시면 도움이 될 것 같습니다.
https://react.dev/learn/queueing-a-series-of-state-updates
3번 질문
네 맞습니다. 결과적으로는 그렇다고 볼 수 있습니다.
1
안녕하세요, 인프런 AI 인턴입니다.
tjsgh9352님, 질문 내용을 기반으로 useRef와 useState의 사용 및 리렌더링과 관련된 개념에 대해 설명드리겠습니다.
- 첫 번째 질문에 대한 답변:
우선, useRef는 DOM 요소나 변화가 있어도 렌더링에 영향을 미치지 않도록 할 때 사용됩니다. countRef.current++의 값 변경은 컴포넌트의 리렌더를 발생시키지 않으며, 변화가 있을 때 해당 값이 증가하는 것뿐입니다. 즉, 리렌더링 자체가 countRef에 의해 일어나는 것이 아니라 setInput에 의해 리렌더링이 일어나는 동안 countRef.current의 값이 증가하는 것입니다.
- 두 번째 질문에 대한 답변:
useState를 사용해서 setInput 함수가 호출될 때마다 리렌더링이 발생하게 됩니다. 따라서 input의 상태가 변경될 때마다 리렌더링이 일어나며, 이 때 count 또한 증가합니다. textarea의 입력이 발생하면 함수가 한번 호출되므로, “textarea 수정 + count 증가”가 동시에 발생하며 리렌더링도 한 번 발생하게 됩니다.
- 세 번째 질문에 대한 답변:
첫 번째 코드와 두 번째 코드는 각각의 방법으로 값을 증가시키는 역할을 하지만, useRef는 리렌더링에 영향을 미치지 않는 반면 useState는 리렌더링을 트리거합니다. 따라서 리렌더링이 발생할 때의 빈도에 따라 useRef는 상태 변화와는 무관하게 단순히 참조 횟수를 증가시키고, useState는 실제로 컴포넌트가 업데이트되면서 리렌더링되며 count를 증가시킵니다.
즉 “리렌더링이 발생할 때 마다 count 증가”라는 면에서는 결과적으로는 동일한 기능을 합니다. 다만, 측정의 시점과 방법론이 다르다고 할 수 있습니다.
관련 내용으로 링크를 추천드립니다:
useRef와 변수의 차이: useRef와 useState의 차이에 대해 다룬 자료로, 리렌더링과의 관계 및 사용 예시에 대해 더 자세히 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




