๊ฐ์ - Section 5 : React.js ์ ๋ฌธ
์ ๋ฐ๋ฏธ : https://www.udemy.com/course/winterlood-react-basic/
์ธํ๋ฐ :
[2024] ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ(React.js) : ๊ธฐ์ด๋ถํฐ ์ค์ ๊น์ง ๊ฐ์ | ์ด์ ํ Winterlood - ์ธํ๋ฐ
์ด์ ํ Winterlood | ๊ฐ๋ ๋ถํฐ ๋ ํนํ ํ๋ก์ ํธ๊น์ง ํจ๊ป ๋ค๋ค๋ณด๋ฉฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฆฌ์กํธ๋ฅผ ์ด ๊ฐ์๋ก ํ ๋ฒ์ ๋๋ด์. ํ์ต์ ์งง๊ฒ, ์์ฉ์ ๊ธธ๊ฒ 17์๊ฐ ๋ถ๋์ All-in-one ๊ฐ์!, ๋ฆฌ์กํธ, ํ ๊ฐ์๋ก
www.inflearn.com
State๋ก ์ฌ์ฉ์ ์ ๋ ฅ ๊ด๋ฆฌํ๊ธฐ
* ๊ฐ๋จํ ํ์๊ฐ์ ํผ์ ๋ง๋ค์ด ๋ณด์.
/*
๊ฐ๋จํ ํ์ ๊ฐ์
ํผ
1. ์ด๋ฆ
2. ์๋
์์ผ
3. ๊ตญ์
4. ์๊ธฐ์๊ฐ
*/
import { useState } from "react";
const Register = () => {
const [name, setName] = useState("์ด๋ฆ");
const [birth, setBirth] = useState("");
const [country, setCountry] = useState("");
const [bio, setBio] = useState("");
const onChangeName = (e) => {
setName(e.target.value);
}
const onChangeBirth = (e) => {
setBirth(e.target.vlaue);
}
const onChangeCountry = (e) => {
setCountry(e.target.value);
}
const onChangeBio = (e) => {
setBio(e.target.value);
}
return (
<div>
<div>
<input value={name} onChange={onChangeName} placeholder="์ด๋ฆ" />
</div>
<div>
<input value={birth} onChange={onChangeBirth} type="date" />
</div>
<div>
<select value={country} onChange={onChangeCountry}>
<option value={""}></option>
<option value={"kr"}>ํ๊ตญ</option>
<option value={"us"}>๋ฏธ๊ตญ</option>
<option value={"uk"}>์๊ตญ</option>
</select>
</div>
<div>
<textarea value={bio} onChange={onChangeBio} />
</div>
</div>
)
}
export default Register;
* ์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ค์ ๋ฐ๊ฒฌ๋๋ค. ๊น๋ํ๊ฒ ๊ณ ์ณ๋ณด์.
import { useState } from "react";
const Register = () => {
const [input, setInput] = useState({
name : "",
birth : "",
country : "",
bio : ""
});
const onChange = (e) => {
setInput({
...input,
[e.target.name] : e.target.value
})
}
return (
<div>
<div>
<input name="name" value={input.name} onChange={onChange} placeholder="์ด๋ฆ" />
</div>
<div>
<input name="birth" value={input.birth} onChange={onChange} type="date" />
</div>
<div>
<select name="country" value={input.country} onChange={onChange}>
<option value={""}></option>
<option value={"kr"}>ํ๊ตญ</option>
<option value={"us"}>๋ฏธ๊ตญ</option>
<option value={"uk"}>์๊ตญ</option>
</select>
</div>
<div>
<textarea name="bio" value={input.bio} onChange={onChange} />
</div>
</div>
)
}
export default Register;
* ๋ฐ๋ ์
- ์ํ ๊ด๋ฆฌ ๋ฐฉ์ ํตํฉ : ์ ๋ ฅ ํ๋๋ณ๋ก ๊ฐ๊ฐ useState๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ๊ด๋ฆฌ ํ๋ ์ํ๋ค์ ๋จ์ผ ๊ฐ์ฒด(input)๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ ๋ ฅ์ํ๋ฅผ ํตํฉ ๊ด๋ฆฌํ๋๋ก ์์ ํจ
- onChange ํจ์ ํตํฉ : ํ๋๋ง๋ค ๋ณ๋๋ก ์ ์ํ๋ onChange ํจ์๋ฅผ ํ๋๋ก ํตํฉํ์ฌ, name ์์ฑ์ ํตํด ๋์ ์ผ๋ก ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ๋๋ก ๊ฐ์
- ์ํ ์ ๋ฐ์ดํธ ๋ฐฉ์ : ์ ๊ฐ ์ฐ์ฐ์(...)๋ก ๊ธฐ์กด ์ํ ๋ณต์ฌํ [e.target.name]์ ๊ฐ์ ๋ฐ๋ผ ํด๋น ํค์ ๊ฐ์ ๋ณ๊ฒฝ
useRef - ์ปดํฌ๋ํธ ๋ณ์ ์์ฑํ๊ธฐ
* useRef ๋? ํจ์ํ ์ปดํฌ๋ํธ์์ DOM ์์๋ฅผ ์ง์ ์ฐธ์กฐํ๊ฑฐ๋ ์ปดํฌ๋ํธ์ ์ํ ๋ณํ ์์ด ๊ฐ์ ์ ์ฅํ๋๋ฐ ์ฌ์ฉ.
* useRef์ ํน์ง
- DOM ์์ ์ ๊ทผ : ํน์ DOM ์์์ ์ ๊ทผํ์ฌ ์ง์ ์กฐ์(ํฌ์ปค์ค ์ด๋, ์คํฌ๋กค ์กฐ์, HTML ์์ ํฌ๊ธฐ ๊ณ์ฐ ๋ฑ)
- ๊ฐ ์ ์ฅ : ์ปดํฌ๋ํธ๊ฐ ๋ค์ ๋ ๋๋ง๋๋๋ผ๋ useRef์ ์ ์ฅ๋ ๊ฐ์ ๋ณํ์ง ์๋๋ค.
*useRef์ useState์ ์ฐจ์ด์
ํน์ง | useState | useRef |
๋ฆฌ๋ ๋๋ง | ์ํ๊ฐ ๋ณ๊ฒฝ ์ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋ง ํจ | ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฆฌ๋ ๋๋งํ์ง ์์ |
์ฃผ์ ๋ชฉ์ | ์ปดํฌ๋ํธ์ ์ํ ๊ด๋ฆฌ ๋ฐ UI ์ ๋ฐ์ดํธ | DOM ์์ ์ ๊ทผ ๋๋ ๋ฆฌ๋ ๋๋ง ์์ด ๊ฐ ์ ์ฅ |
๊ฐ ์ด๊ธฐํ ์์ | ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋ ์ด๊ธฐํ ๋จ | ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋ ๋ ํ ๋ฒ ์ด๊ธฐํ ๋จ |
์ ์ฅ ๊ณต๊ฐ | ๋ฆฌ๋ ๋๋ง ์ ์๋ก์ด ์ํ ๊ฐ์ผ๋ก ๊ต์ฒด | ๋ ๋๋ง ๊ฐ์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ์ ์ง(current) |
๊ฐ ์ ๋ฐ์ดํธ ๋ฐฉ์ | setState๋ฅผ ํตํด ์ํ ๊ฐ์ ๋ณ๊ฒฝ | ref.current ๋ฅผ ์ง์ ์์ |
๋ ๋๋ง ์ฌ๋ถ | ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง ํจ | ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ํ๋ฉด์ ์ํฅ์ ๋ฏธ์ง์น ์์ |
DOM ์กฐ์ ๊ฐ๋ฅ ์ฌ๋ถ | DOM ์์์ ์ง์ ์ ๊ทผํ ์ ์์ | DOM ์์๋ฅผ ์ง์ ์ฐธ์กฐํ๊ณ ์กฐ์ ๊ฐ๋ฅ(ref) |
๋ฐ์ดํฐ ์ด๊ธฐํ ์ฌ๋ถ | ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์ํ ๊ฐ ์ฌ์ค์ | ๋ฆฌ๋ ๋๋ง ์์๋ ๊ฐ์ด ์ด๊ธฐํ ๋์ง ์์ |
์ฃผ์ ์ฌ์ฉ ์ฌ๋ก | - ์ฌ์ฉ์ ์
๋ ฅ ์ฒ๋ฆฌ - ์ํ์ ๋ฐ๋ผ UI ๋๊ธฐํ - ์ํ ๋ณ๊ฒฝ ํธ๋ฆฌ๊ฑฐ |
- DOM ์์ ํฌ์ปค์ค - ๊ฐ ์ ์ฅ ๋ฐ ์ด์ ๊ฐ ์ถ์ - ๋ ๋๋ง ์์ด ๊ฐ ์ ์ง |
* useRef์ ๋ฆฌ๋ ๋๋ง
const Register = () => {
const refObj = useRef(0);
console.log("Register ๋ ๋๋ง");
return (
<div>
<button onClick={() => {
refObj.current++;
console.log(refObj.current);
}}>++</button>
</div>
)
}
export default Register;

- ์์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ๊ณ console ์ฐฝ์ ๋ณด๋ฉด, ๋ฒํผ์ ๋๋ฌ๋ "Register ๋ ๋๋ง"์ ์ฒ์ ํ ๋ฒ๋ง ์ถ๋ ฅ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฆ, ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ๋ฆฌ๋ ๋๋งํ์ง ์๋๋ค.
* useRef์ DOM ์ ์ด
const Register = () => {
const inputRef = useRef();
const onSubmit = () => {
if(input.name === ""){
// ์ด๋ฆ์ ์
๋ ฅํ์ง ์์ผ๋ฉด ์ด๋ฆ์ ์
๋ ฅํ๋ DOM ์์ ํฌ์ปค์ค
inputRef.current.focus();
}
}
return (
<div>
<div>
<input ref={inputRef} name="name" value={input.name} onChange={onChange} placeholder="์ด๋ฆ" />
</div>
<button onClick={onSubmit}>์ ์ถ</button>
</div>
)
}
export default Register;
- ์์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ๊ณ name ๊ฐ์ด ๋น์ด์๋ ์ํ์์ ์ ์ถ ๋ฒํผ์ ๋๋ฅด๋ฉด, ์ด๋ฆ ์ ๋ ฅ ํ๋์ ํฌ์ปค์ค๊ฐ ์ด๋ํ๋ ๊ฒ์
ํ์ธํ ์ ์๋ค. ์ด๋ useRef๋ฅผ ์ฌ์ฉํด DOM ์์๋ฅผ ์ง์ ์กฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์ ๋ ฅ๊ฐ์ด ๋น์ด ์์ด๋ ๋ฆฌ๋ ๋๋ง ์์ด
์ฆ์ ํฌ์ปค์ค๋ฅผ ์ค์ ํ ์ ์๋ค๋ ์ ์ด useRef์ ์ฃผ์ ํน์ฑ์ด๋ค.
* ๊ทธ๋ ๋ค๋ฉด JavaScript ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ ๊น?
์ ๋ ฅ์ ํ๋ฉด ์นด์ดํธ๊ฐ ๋์ด๋๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์
const countRef = useRef(0); // ์ด๊ธฐ๊ฐ์ด 0์ธ ref
let count = 0; // ์ด๊ธฐ๊ฐ์ด 0์ธ ์ผ๋ฐ ๋ณ์
const onChange = (e) => {
countRef.current++;
count++;
console.log("ref : " + countRef.current);
console.log("count : " + count);
setInput({
...input,
[e.target.name] : e.target.value
})
}

- ์ผ๋ฐ ๋ณ์(count)
: count๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ ๋๋ง๋ค ์ด๊ธฐํ๋จ. ์ด์ ๋, ์ผ๋ฐ ๋ณ์๋ ๋ ๋๋ง๋ง๋ค ํจ์๊ฐ ์๋ก ํธ์ถ๋๋ฏ๋ก ๋งค๋ฒ ์๋ก์ด ๊ฐ์ผ๋ก ๋ฎ์ด์์์ง. ์ฆ, ๋ณ๊ฒฝ์ ์ฆ์ ์ ์ฉ๋์ง๋ง ์ง์์ฑ์ด ์์.
- useRef(countRef)
: useRef๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋์ด๋ ์ด๊ธฐํ ๋์ง ์์. ์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ๋ ์ดํ์ ๊ณ์ ๊ฐ์ด ๋์ ๋จ.
React Hooks
* React Hooks ๋? ๋ฆฌ์กํธ ๋ฒ์ 16.8์์ ๋์ ๋ ๊ธฐ๋ฅ์ผ๋ก, ํจ์ํ ์ปดํฌ๋ํธ์์ ์ํ๊ด๋ฆฌ์ ๋ผ์ดํ ์ฌ์ดํด ๋ฉ์๋ ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ค๋ค.
* Hooks์ ํน์ง
- ํด๋์ค ์ปดํฌ๋ํธ ๋์ฒด : ํจ์ํ ์ปดํฌ๋ํธ์์๋ state์ lifecycle์ ์ฌ์ฉํ ์ ์์ด ํด๋์ค ์ปดํฌ๋ํธ ๋์ฒด ๊ฐ๋ฅ
- ์์ ์๋ฐ ์คํฌ๋ฆฝํธ ํจ์ : ํจ์ํ ์ปดํฌ๋ํธ๋ ๊ฐ๊ฒฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ก์ง ์์ฑ์ ์ ํฉ
- ์ถ๊ฐ ๊ธฐ๋ฅ ์ ๊ณต : ๊ธฐ์กด์ ์๋ '์ปค์คํ ํ (Custom Hooks)'์ ํตํด ๋ก์ง ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
- ํธ์ถ ์์ ๋ณด์ฅ : React๋ ํ ํธ์ถ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ํ ๊ด๋ฆฌ ๋ฐ ๋ ๋๋ง์ด ์์ ์ ์
* Hooks ์ฌ์ฉ ๊ท์น
- ์ต์์์์๋ง ํธ์ถ : ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ, ํจ์ ๋ด๋ถ์์ ํธ์ถํ๋ฉด ์๋๋ฉฐ ํญ์ ์ปดํฌ๋ํธ ์ต์์์์ ํธ์ถํด์ผ ํจ.
- React ํจ์ํ ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ : ํด๋์ค ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์์
- ์ปค์คํ ํ ์์ฑ ๊ฐ๋ฅ : ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด use๋ก ์์ํ๋ ์ปค์คํ ํ ์ ๋ง๋ค ์ ์๋ค.
'IT > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ] - ๋ผ์ดํ์ฌ์ดํด (1) | 2024.11.28 |
---|---|
[ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ] - ํ๋ก์ ํธ 1 (์นด์ดํฐ ์ฑ) (0) | 2024.11.25 |
[ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ] - React.js ์ ๋ฌธ 2 (1) | 2024.11.22 |
[ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ] - React.js ์ ๋ฌธ 1 (1) | 2024.11.19 |
[ํ์ ํฌ๊ธฐ๋ก ์๋ผ ๋จน๋ ๋ฆฌ์กํธ] - React.js ๊ฐ๋ก (1) | 2024.11.15 |