
1. ์ React๋ฅผ ์ฌ์ฉํ๋๊ฐ?
2. React์ ์ ์ญ ์ํ๊ด๋ฆฌ
3. React์ ์๋ฒ ๋ฐ์ดํฐ ์์ฒญ
4. React Hooks
๊ธฐ์ ์คํ์ ์ ํ์ ํ๋ก์ ํธ์ ์ฑ๊ณต๊ณผ ์ง๊ฒฐ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ๋ค์ ๊ฐ๋ฐํ์ง ์๊ณ ๊ธฐ์กด์ ์กด์ฌํ๋ ๊ธฐ์ ์คํ ์์ ์ฐ๋ฆฌ๊ฐ ํ์ํ ๋งํผ ๊ฐ๋ฐํ๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ํํ ๊ธฐ์ ์คํ์ ์ง์ ๋ฐ๋ผ์ ๊ฐ๋ฐ ๋ฅ๋ฅ ์ด ํฅ์๋๊ณ , ์ ์ง ๋ณด์๋ฅผ ์ฉ์ดํ๊ฒ ํ๋ฉฐ, ํ์ ๊ฐ์ ํ์ ์ ์ํํ๊ฒ ํฉ๋๋ค.
๋ฌด์๋ณด๋ค ๊ธฐ์ ์คํ์ ํ๋ก์ ํธ์ ํ์ฅ์ฑ๊ณผ ๋ฏธ๋์ ์ฑ์ฅ ๊ฐ๋ฅ์ฑ์ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ฌ์ฉํ๋ ๊ธฐ์ ์ด ์ปค๋ฎค๋ํฐ์์ ๋๋ฆฌ ์ง์๋๊ณ , ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ ๋๋ค๋ฉด, ํ๋ก์ ํธ๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ฐ์ ํ ์ ์์ต๋๋ค. ๋ฐ๋ฉด, ์ง์์ด ์ ์ฐจ ์ค์ด๋ค๊ฑฐ๋ ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์ ์ธ๋ฉด๋ฐ๋ ๊ธฐ์ ์ ์ ํํ ๊ฒฝ์ฐ, ํ๋ก์ ํธ๋ ๊ธฐ์ ์ ๋ถ์ฑ์ ์ ์ง ๋ณด์์ ์ด๋ ค์์ ์ง๋ฉดํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ฌ์ ๋ฏธ๋์ ํธ๋ ๋๋ฅผ ์์ธกํ๊ณ , ํ๋ก์ ํธ๊ฐ ์ฅ๊ธฐ๊ฐ์ ๊ฑธ์ณ ์ง์ ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.

1. ์์ฅ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฑฐ๋ํ ์ปค๋ฎค๋ํฐ์ ๋ฆฌ์์ค
GitHub์์ ์์ 5๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ ์ค ํ๋์ด๋ฉฐ, ๋๊ท๋ชจ ์ปค๋ฎค๋ํฐ์ ์ง์์ ๋ฐ๊ณ ์์ต๋๋ค. ๋ํ Fortune 500๋ ๊ธฐ์
( Netflix, Uber, Amazon, Airbnb ๋ฑ)์์๋ ์ ํธํ๋ ๊ธฐ์ ์
๋๋ค.
2. ๊ฐ๋
์ฑ ๋ฐ ์ ์ง ๋ณด์
JSX ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์ฌ UI ์ฝ๋๊ฐ ๋์ฑ ๊ฐ๋
์ฑ์ด ๋์์ง๊ณ ์ ์ง ๋ณด์๊ฐ ์ฉ์ดํฉ๋๋ค.
3. React Native
๋ฆฌ์กํธ์ UI๋ฅผ ๋ง๋๋ ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ ์น์ด ์๋ ํ๋ซํผ์์ ํ์ฉํ ์ ์๋๋ก ๊ธฐ์ ์ ํ์ฅํ์ต๋๋ค. React Native๋ ์๋๋ก์ด๋(Android)์ ์์ดํฐ(iOS)์ ๋ชจ๋ฐ์ผ ์ฑ์ ๋ง๋๋ ๋ํ์ ์ธ ๊ธฐ์ ๋ก ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
4. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋์ ํธํ์ฑ
๋ฆฌ์กํธ๋ ๋จ๋
์ผ๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง, ์ฃผ๋ก ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์ ํจ๊ป ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋๋ ๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router)๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ๊ฐ์ ์ ํ์ ๊ด๋ฆฌํ๊ณ , ์ํ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ฆฌ๋์ค(Redux)๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ์ ์ ํฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ฌ ๊ฐ๋ฐ ํ ์ ์๋ค๋๊ฒ์ด ํฐ ์ฅ์ ์
๋๋ค.

Redux๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ React ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์
๋๋ค.
๋จ์ผ ์คํ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ๋ฅผ ์ค์ ์ง์ค์์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค. Redux๋ ์์ธก ๊ฐ๋ฅํ ์ํ ๋ณํ๋ฅผ ์ํ ๊ฐ๋ ฅํ ํจํด์ ์ ๊ณตํ๋ฉฐ, ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
MobX๋ ๋จ์ํ๊ณ ๊ฐ๋จํ API๋ฅผ ๊ฐ์ง ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Observable ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ๋ณํ๋ฅผ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. MobX๋ Redux์ ๋น๊ตํ์ฌ ๋ ์ ์ฐํ๊ณ ์ง๊ด์ ์ธ ๋ฐฉ์์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
React์ ๋ด์ฅ๋ Context API๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์ ๊ท๋ชจ์ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ๋จ์ํ ์ํ ๊ด๋ฆฌ์๋ Redux๋ MobX๋ณด๋ค ๊ฐ๋จํ ๋์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ณต์กํ ์ํ ๊ด๋ฆฌ์๋ ํ๊ณ๊ฐ ์์ ์ ์์ต๋๋ค.
Facebook์์ ๊ฐ๋ฐํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, React ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ง์ ์ปดํฌ๋ํธ ์ฌ์ด์์ ๊ณต์ ๋๋ ์ํ๋ฅผ ๊ฐํธํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ํ์ ๋ณ๊ฒฝ ๋ฐ ์ฝ๊ธฐ๊ฐ ๊ฐ๋จํ๋ฉฐ, ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ๋ฑ์ ํน์ง์ด ์์ต๋๋ค.
Zustand์ ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ React ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ๋จ์ผ ํจ์๋ก ์ํ๋ฅผ ์ ์ํ๊ณ , ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. Zustand๋ Context API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ๊ฐ๋จํ API์ ํจ๊ป ์ํ์ ๊ตฌ๋ ๊ณผ ์ ๋ฐ์ดํธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.

Redux์ ํจ๊ป thunk ๋ฏธ๋ค์จ์ด(RTK Query)๋ฅผ ํตํด ์๋ฒ ๋ฐ์ดํฐ์ฒ๋ฆฌ๋ฅผ ๋น๋๊ธฐ๋ก ์ํํ ์ ์๊ฒ ํฉ๋๋ค. ํ์ง๋ง Redux๋ ํด๋ผ์ด์ธํธ ์ธก ์ดํ๋ฆฌ์ผ์ด์
์ํ ๊ด๋ฆฌ์ ์ค์ ์ ๋๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ์นญํด์ผํ๋ ์ดํ๋ฆฌ์ผ์ด์
์์ ์บ์ฑ์ ๋ฌธ์ ์ ์ด ์์ต๋๋ค.
๋ฐ์ดํฐ ํจ์นญ ๋ฐ ์บ์ฑ์ ์ ๋ฆฌ, ๋ง์ ๋คํธ์ํฌ ์์ฒญ๊ณผ ๋ฐ์ดํฐ ํจ์นญ์ด ์์ผ๋ฉด ์ ํฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก React ์ดํ๋ฆฌ์ผ์ด์ ์ ์๋ฒ ์ํ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์บ์ฑํ๊ณ , ๋๊ธฐํํ๊ณ , ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ์ฝ๊ฒ ํด์ค๋๋ค.
Hook์ ํตํด ๋ผ์ดํ ์ฌ์ดํด ๊ธฐ๋ฅ๊ณผ state ๊ด๋ฆฌ ๊ธฐ๋ฅ ์ฝ๋๋ฅผ ์งค ์ ์๋ค.
์ํ ๋ณ๊ฒฝ, ์ฆ ๊ฐ์๋์ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ ํจ์๋ก ๊ทธ์ ๋ฐ๋ฅธ ์๋ช ์ฃผ๊ธฐ๋ฅผ ํตํด ๋ค์ํ ์ด๋ฒคํธ๋ฅผ ์คํํ ์ ์๋ค
useEffect์ ๋์ผํ์ง๋ง, DOM์ด ๊ทธ๋ ค์ง๊ธฐ ์ด์ ์์ ์ ๋๊ธฐ์ ์ผ๋ก ์ํ๋๋ค.useEffect๋ฅผ ์ฐ๊ณ ๊ตฌํ์ด ์๋ ๋๋ง ์ฌ์ฉ ๊ถ์ฅreturn๊ฐ์ด ์์ผ๋ฉด ์ฌ์ฉimport { useMemo, useEffect, useState } from "react";
export default function UseMemo() {
const [val, setVal] = useState("");
const [isKorea, setIsKorea] = useState(true);
// useMemo๋ฅผ ์ฌ์ฉ์ํ๋ฉด isKorea ๊ฐ๋ฟ๋ง ์๋๋ผ val๊ฐ์ด ๋ณํด๋ useEffect() ์คํ๋
// const location = { country: isKorea ? "ํ๊ตญ" : "์ผ๋ณธ" };
const location = useMemo(() => {
return {
country: isKorea ? "ํ๊ตญ" : "์ผ๋ณธ",
};
}, [isKorea]); // isKorea๊ฐ์ด ๋ฐ๊ท๋๋ง ์คํ
useEffect(() => {
console.log("useEffect... ํธ์ถ");
}, [location]);
const onChange = (event: React.FormEvent<HTMLInputElement>) => {
const {
currentTarget: { value },
} = event;
setVal(value);
};
return (
<header>
<div>UseMemo๐</div>
<h2>ํ๋ฃจ์ ๋ช ๋ผ ๋จน์ด์?</h2>
<input value={val} onChange={onChange} />
<h2>์ด๋ ๋๋ผ์ ์์ด์?</h2>
<p>๋๋ผ: {location.country}</p>
<button onClick={() => setIsKorea(!isKorea)}>Update</button>
</header>
);
}
DOM์ ์ ๊ทผํ๊ฒ ๋๋ ์ผ์ด ์๊ธด๋ค๋ฉด ์ ๊ทผํ๊ฒ ํด์ฃผ๋ Hooks ํจ์export default function UseRef() {
const nameFocus = useRef<HTMLInputElement>(null); // useRef๋ก inputํ๊ทธ ์ ๊ทผ
const [inputs, setInputs] = useState("");
const onFocus = () => {
if (nameFocus.current) {
nameFocus.current.focus(); // useRef๋ก inputํ๊ทธ ํฌ์ปค์ฑ
}
};
return (
<div>
<input
name="์ด๋ฆ"
value={inputs}
ref={nameFocus}
/>
<button onClick={onFocus}>ํฌ์ปค์ค ์ฃผ๊ธฐ</button>
</div>
);
}
๐ค useRef , useMemo์ Callbcack์ ์ฌ์ฉํด์ ์ด๋ป๊ฒ ์ต์ ํ๋ฅผ ํ ์ ์๋๊ฐ?
๋ฉ๋ชจ์ด์ ์ด์
๋ง์ฝ ์ด๋ ํ ์ฐ์ฐ์ด๋ ํจ์๊ฐ ๋ณต์กํด์ ๊ฒฐ๊ณผ๊ฐ ์ค๋๊ฑธ๋ฆฐ๋ค (30์ด)
๋ฆฌ์กํธ๋ ์ํ๊ฐ ๋ฐ๋๋ฉด ๋๋๋ง, ํ์ง๋ง ๋๋๋ง ๋ ๋ ๊ฐ์ด ๋ฐ๋์ง ์๋ ๋ถ๋ถ์ด๋ผ๋ฉด ํ๋ฒ ๋ ์คํํด์ผํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ์๋ฐ๋๋ ์ฐ์ฐ์ด๋ ํจ์๋ฅผ ๋๋๋ง์ด ๋๋๋ผ๋ ์ฌ์์ฑํ์ง ์๋๋ก ๊ฐ์ด๋ ํจ์๋ฅผ ์ฌ์ฌ์ฉ
์ฆ, ๋๋๋ง ์ ํ์ ์๋ ์ฐ์ฐ์ ์๊ฐ์ ์ค์ฌ์ฃผ๊ธฐ ์ํด ์ฌ์ฉ