Controlled Component์ Uncontrolled Component
๐งฉ Controlled Component๋?
Controlled Component(์ ์ด ์ปดํฌ๋ํธ)๋ ์
๋ ฅ ์์์ ๊ฐ(value)์ ๋ฆฌ์กํธ์ ์ํ(state)๋ก ๊ด๋ฆฌํ๋ ์ปดํฌ๋ํธ์ด๋ค.
์ฆ, ์ ๋ ฅ ๊ฐ์ ์ฃผ๋๊ถ์ด DOM์ด ์๋ ๋ฆฌ์กํธ์ ์๋ค.
๋ฆฌ์กํธ์ ์ํ๊ฐ ์
๋ ฅ ์์์ ๊ฐ์ ๊ฒฐ์ ํ๊ณ , ์ฌ์ฉ์๊ฐ ์
๋ ฅ์ ๋ณ๊ฒฝํ๋ฉด onChange ์ด๋ฒคํธ๋ฅผ ํตํด ์ํ๋ฅผ ์
๋ฐ์ดํธ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React, { useState } from "react";
function ControlledInput() {
const [name, setName] = useState("");
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
setName(e.target.value);
};
return (
<div>
<input type="text" value={name} onChange={handleChange} />
<p>์
๋ ฅ๊ฐ: {name}</p>
</div>
);
}
export default ControlledInput;
โ ํน์ง
value๊ฐ ํญ์ ๋ฆฌ์กํธ ์ํ(state)์ ๋๊ธฐํ๋จ- ์ค์๊ฐ ์ ๋ ฅ ๊ฒ์ฆ, ์กฐ๊ฑด๋ถ ๋ ๋๋ง ๋ฑ ๋ณต์กํ ํผ ๋ก์ง ๊ตฌํ ๊ฐ๋ฅ
- ๋ฆฌ์กํธ ์ํ๋ฅผ ํตํด ์ ๋ ฅ ๊ฐ์ ๋ณํ๋ฅผ ์์ ํ ์ ์ดํ ์ ์์
๐งฉ Uncontrolled Component๋?
Uncontrolled Component(๋น์ ์ด ์ปดํฌ๋ํธ)๋ ์ ๋ ฅ ์์์ ๊ฐ์ด DOM ๋ด๋ถ์์ ์ง์ ๊ด๋ฆฌ๋๋ ๋ฐฉ์์ด๋ค. ์ฆ, ๋ฆฌ์กํธ๊ฐ ๊ฐ์ ์ ์ดํ์ง ์๊ณ DOM์ ์์ํ๋ ๊ตฌ์กฐ์ฃ .
์ด๋๋ ref๋ฅผ ์ฌ์ฉํด DOM์ ์ง์ ์ ๊ทผํ์ฌ ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import React, { useRef } from "react";
function UncontrolledInput() {
const inputRef = useRef<HTMLInputElement>(null);
const handleSubmit = () => {
alert(`์
๋ ฅ๊ฐ: ${inputRef.current?.value}`);
};
return (
<div>
<input type="text" ref={inputRef} />
<button onClick={handleSubmit}>์ ์ถ</button>
</div>
);
}
export default UncontrolledInput;
โ ํน์ง
- ์ ๋ ฅ ๊ฐ์ด DOM์์ ๊ด๋ฆฌ๋์ด ๋ฆฌ์กํธ ์ํ ์ ๋ฐ์ดํธ ๋น์ฉ์ด ์์
useRef๋ก ์ง์ ์ ๊ทผํด์ผ ํจ- ๋จ์ ์ ๋ ฅ/์ ์ถ ํผ์ ์ ํฉ
๐ง Controlled vs Uncontrolled ํ๋์ ๋น๊ต
| ๊ตฌ๋ถ | Controlled Component | Uncontrolled Component |
|---|---|---|
| ์ ๋ ฅ ๊ฐ ๊ด๋ฆฌ ์ฃผ์ฒด | React state | DOM |
| ๊ฐ ์ ๊ทผ ๋ฐฉ์ | state ๋ณ์ | ref (DOM ์ง์ ์ ๊ทผ) |
| ์ฃผ์ ์ด๋ฒคํธ | onChange | onSubmit ์์ ๋ฑ |
| ์ค์๊ฐ ๊ฒ์ฆ/์ ์ด | ๊ฐ๋ฅ | ๋ถ๊ฐ๋ฅ ๋๋ ๋ณต์ก |
| ์ฑ๋ฅ ๋ถ๋ด | ๋ค์ ์์ (์ํ ์ ๋ฐ์ดํธ) | ์๋์ ์ผ๋ก ์ ์ |
| ์ ํฉํ ์ํฉ | ์ค์๊ฐ ์ ๋ ฅ ๊ฒ์ฆ, ๋์ UI | ๋จ์ ์ ๋ ฅ, ์ ์ถ ์ ๊ฐ๋ง ํ์ํ ๋ |
์ธ์ ์ด๋ค ๋ฐฉ์์ ์จ์ผ ํ ๊น?
Controlled Component๋ฅผ ์จ์ผ ํ๋ ๊ฒฝ์ฐ
- ์ ๋ ฅ ์๋ง๋ค ์ ํจ์ฑ ๊ฒ์ฆ, ํฌ๋งทํ , ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ด ํ์ํ ๊ฒฝ์ฐ
- ๋ค์ค ์ ๋ ฅ ํ๋ ๊ฐ ์์กด ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋๋ง๋ค ์ฆ์ ํผ๋๋ฐฑ์ด ํ์ํ ๊ฒฝ์ฐ โ ์: ๋ก๊ทธ์ธ ํผ, ํ์๊ฐ์ ํผ, ์ค์๊ฐ ๊ฒ์์ฐฝ ๋ฑ
Uncontrolled Component๋ฅผ ์จ์ผ ํ๋ ๊ฒฝ์ฐ
- ๋จ์ํ ํ ๋ฒ์ ๊ฐ์ ์ ์ถ๋ง ํ๋ฉด ๋๋ ํผ
- ๋ฆฌ๋ ๋๋ง ๋ถ๋ด์ ์ค์ด๊ณ ์ถ์ ๋
- React ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(FormData, Vanilla JS)์ ํจ๊ป ์ฌ์ฉํ ๋ โ ์: ๊ฐ๋จํ ์ด๋ฉ์ผ ๊ตฌ๋ ํผ, ํ์ผ ์ ๋ก๋ ํผ ๋ฑ
๐ก ๋ง๋ฌด๋ฆฌ
Controlled Component์ Uncontrolled Component๋ ๋ฆฌ์กํธ ํผ ๊ด๋ฆฌ์ ๋ ๊ฐ์ง ํต์ฌ ์ถ์ด๋ค.
- Controlled: ๋ฆฌ์กํธ๊ฐ ๋ชจ๋ ๊ฒ์ ๊ด๋ฆฌ โ ์ ๊ตํ์ง๋ง ๋ณต์ก
- Uncontrolled: DOM์ด ๊ด๋ฆฌ โ ๊ฐ๋จํ์ง๋ง ์ ์ด ์ด๋ ค์
ํผ์ด ๋ณต์กํ ์๋ก Controlled ๋ฐฉ์์ด ์ ๋ฆฌํ๊ณ , ๋จ์ ์ ๋ ฅ๋ง ํ์ํ ๊ฒฝ์ฐ Uncontrolled ๋ฐฉ์์ด ํจ์จ์ ์.
