useState vs useRef - team-yaza/mozi-client GitHub Wiki
React ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ input์ ๊ฐ์ ๊ด๋ฆฌํ ๋ useState๋ก ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ, useRef๋ก ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ
์ ๋ํด ํ์๊ณผ ํ ๋ก ํ์ต๋๋ค.
์ด ๊ธ์ ๊ทธ ํ ๋ก ์ ๊ธฐ๋ฐํฉ๋๋ค.
๋จผ์ , useState์ useRef๋ฅผ ๊ฐ๋จํ๊ฒ ๋น๊ตํ๋ ๊ฒ์ผ๋ก ์์ํด๋ณด๊ฒ ์ต๋๋ค.
React์์ ์ปดํฌ๋ํธ๋ ์์ ์ ์ํ ๋๋ props๊ฐ ๋ฐ๋๋ฉด ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด React์์๋ useState
๋ฅผ ํ์ฉํฉ๋๋ค.
const [state, setState] = useState(initialState);
useState
๋ ์ํ ์ ์ง ๊ฐ๊ณผ ๊ทธ ๊ฐ์ ๊ฐฑ์ ํ๋ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. setState
ํจ์๋ ์ state๋ฅผ ๋ฐ์ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง ํ์ ๋ฑ๋กํฉ๋๋ค.
์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋ง ์์ useState
๋ฅผ ํตํด ๋ฐํ๋ฐ์ ์ฒซ๋ฒ์งธ ๊ฐ์ ํญ์ ๊ฐฑ์ ๋ ์ต์ state๊ฐ ๋ฉ๋๋ค.
Ref๋ render ๋ฉ์๋์์ ์์ฑ๋ DOM ๋ ธ๋๋ React ์๋ฆฌ๋จผํธ์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
function CustomTextInput(props) {
// textInput์ ref ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ํตํด ์ ๋ฌ๋๊ธฐ ์ํด์
// ์ด๊ณณ์์ ์ ์๋์ด์ผ๋ง ํฉ๋๋ค.
const textInput = useRef(null);
function handleClick() {
textInput.current.focus();
}
return (
<div>
<input type="text"ref={textInput} />
<button onClick={handleClick}>click me</button>
</div>
);
}
React ๊ณต์ ๋ฌธ์์ ์ํ๋ฉด ref์ ๋ฐ๋์งํ ์ฌ์ฉ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํฌ์ปค์ค, ํ ์คํธ ์ ํ์์ญ, ํน์ ๋ฏธ๋์ด์ ์ฌ์์ ๊ด๋ฆฌํ ๋
- ์ ๋๋ฉ์ด์ ์ ์ง์ ์ ์ผ๋ก ์คํ์ํฌ ๋
- ์๋ ํํฐ DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ React์ ๊ฐ์ด ์ฌ์ฉํ ๋
๊ฒฐ๊ตญ React์์ ref๋ DOM์ ์กฐ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ํ์ง๋ง ref๋ฅผ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์๋์ ์์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
const refContainer = useRef(initialValue);
useRef
๋ .current
ํ๋กํผํฐ๋ก ์ ๋ฌ๋ ์ธ์(initialValue
)๋ก ์ด๊ธฐํ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ref ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
useRef
๋ ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
๋ํ useRef
๋ก ๋ง๋ ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๊ฒ์ ์ปดํฌ๋ํธ์ ๋ ๋๋ง๊ณผ ๋ฌด๊ดํฉ๋๋ค.
๋ค์ ๋งํ๋ฉด, .current
ํ๋กํผํฐ๋ฅผ ๋ณํํ๋ ๊ฒ์ด ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค์ง ์์ต๋๋ค.
๋ณธ์ง์ ์ผ๋ก useRef
๋ .current
ํ๋กํผํฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ์ ๋ด๊ณ ์๋ ์์
์ ๊ฐ์ต๋๋ค.
useRef
๋ ์์์ ๊ฐ์ผ๋ฏ๋ก useState
์ฒ๋ผ ์ปดํฌ๋ํธ ๋ด์ ๋ณ์ ๊ฐ์ ์กฐํ, ์์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๋ ์ฌ๋ก์ ์ํ๋ฉด, useRef
๋ ์ผ๋ฐ์ ์ผ๋ก ํน์ DOM์ ์ง์ ํ์ฌ ํด๋น ๋์ ์์ฑ๊ฐ์ ํ์
ํ๊ฑฐ๋ ์์ฑ๊ฐ์ ๋ณํ์ํค๋ ์ฉ๋๋ก ์ฌ์ฉํ ์๋ ์๊ณ , ์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ์ฅํ๋ ์์
๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
useState
์ useRef
์ ์ฌ์ฉ์ ๋น๊ตํด๋ณด๋ฉด ๋ ๋๋ง์์ ์ฐจ์ด์ ์ ๋ณด์
๋๋ค.
๋จผ์ useState๋ฅผ ์ฌ์ฉํด์ input์ ๋ง๋ค์ด ํ ์คํธ๋ฅผ ํด๋ณด๊ฒ ์ต๋๋ค.
function Input() {
const [value, setValue] = useState("")
return <input value={value} onChange={(e) => setValue(e.target.value)} />
}
export default Input
๋น์ฐํ๊ฒ๋ ์ํ๊ฐ ๋ฐ๋ ๋๋ง๋ค ๋ฆฌ๋ ๋๋ง๋๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
์ด์ useRef
๋ฅผ ์ฌ์ฉํด์ input ์ปดํฌ๋ํธ๋ฅผ ํ
์คํธ ํด๋ณด๊ฒ ์ต๋๋ค.
function Input() {
const inputRef = useRef(null)
return <input ref={inputRef} />
}
export default Input
์ ์ด์ ์ํ๋ก ๊ด๋ฆฌํ์ง ์์ผ๋ฏ๋ก ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ณ ๋ฏผํ๋ ์ ์ input ๊ฐ์ ๋ณ๊ฒฝํ ๋ ๋ ๋๋ง์ด ํ์ํ๊ฐ
์ ๋ํ ๋ถ๋ถ์ด์์ต๋๋ค.
ํ์๊ณผ ์ ์๊ฐ์ด ๊ฐ์๋ ๋ถ๋ถ์ input์ ์
๋ ฅํ๋ ๊ณผ์ ์์ ๋ ๋๋ง์ด ์ด๋ ๊ฒ ๋ง์ด ์ผ์ด๋์ผํ๋?
๋ผ๋ ์๊ฐ์ด์์ต๋๋ค.
๋ฐ๋ฉด ํ์๊ณผ ์ ์๊ฐ์ด ๋ฌ๋๋ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ดํ์ง: 'input์ ์
๋ ฅ๊ฐ ๋ํ ์ดํ๋ฆฌ์ผ์ด์
์ ์ํ์ด๊ธฐ ๋๋ฌธ์
useState
๋ก ๊ด๋ฆฌํด์ผํ๋ค' - ํ์: 'input ์
๋ ฅ๊ฐ์ ์ํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์
useRef
๋ก ๋ฆฌ๋ ๋๋ง์ ๋ง์์ผํ๋ค.'
๊ฒฐ๊ตญ input ๊ฐ์ ๊ด๋ฆฌํ ๋ useState vs useRef
๋ผ๋ ์ง๋ฌธ์ React์์ input๊ฐ์ด ์ํ์ธ๊ฐ
๋ผ๋ ์ง๋ฌธ์ผ๋ก ๊ท๊ฒฐ๋ฉ๋๋ค.
์ ์๊ฐ์ ์๋์ ๊ฐ์ต๋๋ค.
์ํ๋ ์ฃผ์ด์ง ์๊ฐ์ ๋ํด ์์คํ
์ ๋ํ๋ด๋ ๊ฒ์ผ๋ก ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฒ
์
๋๋ค.
์ฌ์ฉ์๊ฐ ์
๋ ฅํ๋ ๊ฐ ๋ํ ์ดํ๋ฆฌ์ผ์ด์
์ ์ํ๋ผ๊ณ ํ ์ ์๊ณ , ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ๋ณํ๋ input์ ๊ฐ์ useState
๋ก ๊ด๋ฆฌํด์ผํฉ๋๋ค.
input์ state๋ก ๊ด๋ฆฌํ ๋ ๋ฐ์ํ๋ ๋ฆฌ๋ ๋๋ง์ ๋ํ ๋ถ๋ถ์์๋ ๊ณผ์ฐ ๊ทธ input์ ๋ฆฌ๋ ๋๋งํ๋๊ฒ ๊ณ ๋น์ฉ ์ฐ์ฐ์ธ๊ฐ๋ผ๋ ์๋ฌธ์ ์ ๊ธฐํ๊ณ ์ถ์ต๋๋ค. input์ ํ์ดํํ ๋ ๋ฐ์ํ๋ ๋ ๋๋ง์ ๊ณ ๋น์ฉ ์ฐ์ฐ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋ฐ๋ฉด useRef
๋ก ๋ง๋ค์ด์ง ref๊ฐ์ฒด๋ DOM์ ์ ๊ทผํ ๋๋, ๋งค ๋ ๋๋ง์์ ๋ง๋ค์ด์ค์ผํ๋ ๊ณ ๋น์ฉ ๊ฐ์ฒด๋ ๊ฐ์ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ์ณ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฒฐ๋ก ์ input์์ ๋ฐ์ํ๋ ์ฌ์ฉ์์ ์ํธ์์ฉ ๋ํ ์ดํ๋ฆฌ์ผ์ด์
์ ์ํ์ด๋ฏ๋ก ์ํ๋ฅผ ์ํ๋ต๊ฒ ๊ด๋ฆฌํ๊ธฐ ์ํด useState๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
์
๋๋ค.
์ฌ๋ฌ๋ถ์ ์ด๋ป๊ฒ ์๊ฐํ์๋์?
22.08.03 ์ถ๊ฐ
์ด ๊ธ์์ ํ๋ ๊ณ ๋ฏผ์ด ๊ณต์๋ฌธ์์ ๋์์์์ต๋๋ค.
์ฐ๋ฆฌ์ ๊ณ ๋ฏผ์ ์ด ์ปดํฌ๋ํธ๊ฐ Controlled Component
์ธ๊ฐ Uncontrolled Component
์ธ๊ฐ์ ๋ํ ๊ณ ๋ฏผ์ด์์ต๋๋ค.
HTMLElement์ค์๋ ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ค์ด ์์ต๋๋ค.
- input
- select
- textarea
์ด HTMLElement๋ค์ ์ํ๋ฅผ ๋๊ฐ ๊ด๋ฆฌํ๋๋์ ๋ฐ๋ผ Controlled Component
์ Uncontrolled Component
๋ก ๋๋ฉ๋๋ค.
์๋ฆฌ๋จผํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ๊ฐ ๊ด๋ฆฌํ๋ค๋ฉด, Controlled Component
์๋ฆฌ๋จผํธ์ ์ํ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ ์๋ฆฌ๋จผํธ์ ์ฐธ์กฐ๋ง ์ปดํฌ๋ํธ๊ฐ ์์ ํ๋ค๋ฉด, Uncontrolled Component
์
๋๋ค.
์ฆ, ์ฝ๊ฒ ๋งํ๋ฉด useState
์ ์ํด ์ํ๋ก ๊ด๋ฆฌํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ ์ด ์ปดํฌ๋ํธ
๋ผ๊ณ ํ๊ณ , React๊ฐ ์ํ๋ก ์ถ์ ํ๊ณ ์์ง ์์ ์ปดํฌ๋ํธ๋ฅผ ๋น์ ์ด ์ปดํฌ๋ํธ
๋ผ๊ณ ํฉ๋๋ค. ๋น์ ์ด ์ปดํฌ๋ํธ
๊ฐ์ ๊ฒฝ์ฐ ref๋ฅผ ํ์ฉํด ์ค์ DOM์ ์ ๊ทผํฉ๋๋ค. ๋น์ ์ด ์ปดํฌ๋ํธ
๋ DOM์์ฒด์์ ๋ฐ์ดํฐ๊ฐ ๋ค๋ค์ง๋๋ค.
์๋๋ ๊ณต์๋ฌธ์์์ ์ธ์ฉํ ๋ฌธ์ฅ์ ๋๋ค.
In a controlled component, form data is handled by a React component. The alternative is uncontrolled components, where form data is handled by the DOM itself.
(๋ฒ์ญ) ๋๋ถ๋ถ ๊ฒฝ์ฐ์ ํผ์ ๊ตฌํํ๋๋ฐ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ์ด ์ปดํฌ๋ํธ์์ ํผ ๋ฐ์ดํฐ๋ React ์ปดํฌ๋ํธ์์ ๋ค๋ฃจ์ด์ง๋๋ค. ๋์์ธ ๋น์ ์ด ์ปดํฌ๋ํธ๋ DOM ์์ฒด์์ ํผ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฃจ์ด์ง๋๋ค.
form์ input ์ํ๊ฐ์ ๊ฒฝ์ฐ React๊ฐ ์ถ์ ํด์ ๊ทธ ๊ฐ์ผ๋ก ์ด๋ค ํ๋์ ํ ์ฌ์ง๊ฐ ์์ต๋๋ค. ์๋ฅผ๋ค์ด์ ๋ก๊ทธ์ธ ์ ํจ์ฑ ๊ฒ์ฌ ๋ก์ง์ด state๊ฐ ๋ณํจ์ ๋ฐ๋ผ ์คํ๋์ด์ผํ๋ฉด ์ ์ด ์ปดํฌ๋ํธ
๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ฉด์, ๋น์ ์ด ์ปดํฌ๋ํธ
๊ฐ์ ๊ฒฝ์ฐ๋ ์ค์ DOM์ ์ฐธ์กฐํด์ผํ๋ ๊ฒฝ์ฐ์ ํ์ํฉ๋๋ค. ๊ฐ์ฅ ํํ ๊ฒฝ์ฐ๋ก input์ focus๋ฅผ ํ๋ ์ํฉ์ ์๋ก ๋ค ์ ์์ต๋๋ค.
๋ฐ๋ผ์, ์ค์ DOM์ ์ ๊ทผํด์ผํ๋ ์ํฉ์ด ์๋๋ผ๋ฉด React ์ปดํฌ๋ํธ๊ฐ input์ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.(์ ์ด ์ปดํฌ๋ํธ
)