3. React
React๋?
React ์ปดํฌ๋ํธ
React ๋ฆฌ๋ ๋๋ง
IoC(Inversion of Control)
Library vs Framework
React
โ ์๋ ๊ฑฐ๋ผ์ ๋ณด๋ฉด ์ ๋ ์ค ์์๋๋ฐ, ์ต๊ทผ์ ์ ๋ฐ์ดํธ๊ฐ ๋จ.
๊ธฐ์กด์๋ ํด๋์ค ์ปดํฌ๋ํธ ์์ ๊ฐ ๋ง์์ง๋ง, ๋ง์ ๋ถ๋ถ์ด ํจ์ ์ปดํฌ๋ํธ๋ก ๋ณ๊ฒฝ๋์ด ์ฝ๊ธฐ์ ๊ด์ฐฎ๋ค.
React Beta ๋ฌธ์ โ ์์ฆ React ์ฌ์ฉ๋ฒ์ ๋ค๋ฃฌ ๋ฌธ์. ๋ฒ ํ ๋ฒ์ ์ด๊ณ ์์ฑ๋๊ฐ ๋ฎ์ง๋ง (+ ํ๊ตญ์ด ๋ฒ์ ์ด ์์ง๋ง) ์ด๊ฒ๋ถํฐ ์ฝ๋ ๊ฑธ ๊ถ์ฅ.
React๋ก ์์ ํ๋ ํ๋ก์ธ์ค๋ Thinking in React๋ฅผ ์ฐธ๊ณ . โ์ํโ๋ฅผ ๊ณจ๋ผ๋ด๋ ๊ฒ ํต์ฌ์ด๋ค. React๋ ์ง์ DOM์ ์ฐพ์์ ์์ฑ์ ์ถ๊ฐํ๊ณ element๋ฅผ ์ถ๊ฐํ๋ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ด ์๋ ์ ์ธ์ ํ๋ก๊ทธ๋๋ฐ์ ํ ์ ์๊ฒ ํด์ค๋ค. ํ๋ฉด์ UI๋ฅผ ์ด๋ป๊ฒ ๋ณด์ฌ์ฃผ๊ณ ์ถ์์ง React์๊ฒ ์ ๋ฌํ๋ฉด ๋๋ค. React๋ก UI(User Interface)๋ฅผ ๊ฐ๋ฐํ ๋ ๋จผ์ Component(์ปดํฌ๋ํธ)๋ผ๊ณ ๋ถ๋ฆฌ๋ ์กฐ๊ฐ๋ค๋ก ์ชผ๊ฐ์ผ ํฉ๋๋ค. ๊ทธ ํ์ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ง๋ค ์ ํฉํ state๋ฅผ ์์ฑํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ์ปดํฌ๋ํธ๋ค์ ํจ๊ป ์ฐ๊ฒฐํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ํ๋ฅด๊ฒ ํฉ๋๋ค. ์๋์์๋ React๋ฅผ ์ด์ฉํ์ฌ ์ ํ ๊ฒ์์ ํ ์ ์๋ ๋ฐ์ดํฐ ํ ์ด๋ธ์ ๋ง๋๋ ๊ณผ์ ์ ๋ํด ์๊ฐํด๋ณผ๊ฒ ๋จผ์ ๋ฐ์ดํฐ(JSON)์ ๋์์ธ ๋ชฉ์ ์ ์ ๋ฌ๋ฐ์๋ค๊ณ ๊ฐ์ ํ๋ค. React์์ UI๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก 5๊ฐ์ง ์คํ ์ ๋ฐ๊ฒ ๋๋ค.
Step 1: UI๋ฅผ ์ปดํฌ๋ํธ ๋จ์๋ก ์ชผ๊ฐ ๋ค
๋ชฉ์ ์ ์ปดํฌ๋ํธ์ ์๋ธ ์ปดํฌ๋ํธ์ ๋ค๋ชจ ๋ฐ์ค๋ฅผ ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ ์ด๋ฆ์ ๋ถ์ด๋ ๊ฒ์ผ๋ก ์์ํ๋ค. ๋ง์ฝ ๋์์ด๋์ ํจ๊ป ํ์ ํ๋ค๋ฉด, ์ด๋ฏธ ๋์์ธ ํด์์ ์ปดํฌ๋ํธ์ ๋ถ์ฌ๋์ ์ด๋ฆ์ด ์์ ์๋ ์๋ค. ๋ฐฐ๊ฒฝ ์ง์์ ๋ฐ๋ผ ๋์์ธ์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๋ ๋ค์ํ ๋ฐฉ์์ ์๊ฐํด๋ณผ ์ ์๋ค.
Programming: ํจ์ ํน์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋์ง ๊ฒฐ์ ํ๋ ๋ฐฉ์๊ณผ ๋๊ฐ๋ค. ๋จ์ผ์ฑ ์์์น(SRP)์ด๋ฉฐ ์ฆ ์ปดํฌ๋ํธ๋ ์ด์์ ์ผ๋ก ํ ๊ฐ์ง์ ์ผ๋ง ํด์ผ ํ๋ค. ๋ง์ฝ ์ปดํฌ๋ํธ๊ฐ ์ปค์ง๋ฉด, ์์ ์๋ธ ์ปดํฌ๋ํธ๋ค๋ก ๋ถ๋ฆฌ๋์ด์ผ ํ๋ค.
CSS: ๋ฌด์์ class selector๋ก ๋ง๋ค์ง ๊ณ ๋ คํ๋ค.
Design: ๋์์ธ ๋ ์ด์ด๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ๊ณ ๋ คํ๋ค.
๋ง์ฝ JSON์ด ์ ๊ตฌ์กฐํ๋์ด ์๋ค๋ฉด, UI์ ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ฅผ ์์ฐ์ค๋ฉ๊ฒ ๋งคํํ ์ ์๋ค. ์๋ํ๋ฉด, UI์ data model์ ์ข
์ข
๊ฐ์ ์ํคํ
์ฒ, ๊ฐ์ ๋ชจ์์ ๊ฐ์ง๋ค. ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๊ฐ data model์ ํ ์กฐ๊ฐ๊ณผ ๋งค์น๋๋๋ก UI๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๋ค. ProductTable์ Name๊ณผ Price๊ฐ ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฒ์ ์ทจํฅ์ ์ฐจ์ด๋ค. ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด๋ ๊ด์ฐฎ๋ค. ์ง๊ธ์ ๊ด์ฐฎ์ง๋ง ์ ๋ ฌ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ ๋ฑ ํค๋๊ฐ ๋ณต์กํด์ง๋ฉด, ๊ทธ๋๋ ProductTableHeader ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๊ฒ ํฉ๋นํ ๊ฒ์ด๋ค.
ํ์ฌ ๋ชฉ์
์ผ๋ก๋ถํฐ ์ปดํฌํดํธ๋ฅผ ์๋ณํ๊ณ ๋ถ๋ฆฌํ๋ฉด์ ์ ๋ฆฌํ๋ค. ๋ชฉ์
์์ ๋ค๋ฅธ ์ปดํฌ๋ํธ ๋ด๋ถ์ ๋ฑ์ฅํ๋ ์ปดํฌ๋ํธ๋ ๊ณ์ธต์ ์ผ๋ก ์์์ผ๋ก ๋ฑ์ฅํด์ผ ํ๋ค.
FilterableProductTable
SearchBar
ProductTable
ProductCategoryRow
ProductRow
Step 2: React๋ฅผ ์ ์ ๋ฒ์ ์ผ๋ก ๋ง๋ ๋ค
์ปดํฌ๋ํธ๋ฅผ ๊ณ์ธต์ผ๋ก ๊ตฌ๋ถํ๊ณ , ์ด์ ๋ app์ ๊ตฌํํ ์๊ฐ์ด๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ง ์๊ณ data model๋ฅผ ์ด์ฉํ์ฌ UI๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค (๋งํฌ์ , ํผ๋ธ๋ฆฌ์ฑ) ๋ณดํต UI๋ฅผ ๋จผ์ ์์ฑํ๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ ์ฝ๋ค. ์๋ํ๋ฉด UI๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง์ ํ์ดํ์ด ํ์ํ์ง๋ง ์๊ฐ์ ํ์ง ์์๋ ๋๊ณ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ์๊ฐ์ ๋ง์ด ํ์ํ์ง๋ง ํ์ดํ์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
Props๋ ๋ถ๋ชจ์์ ์์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. State๋ ์ค์ง ์ํธ์์ฉ์ ์ํ, ์ฆ ํญ์ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ ๊ฒ์ด๋ค. UI๋ฅผ ์์ฑํ ๋๋ state๋ ํ์์๋ค.
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ๋ top down
๋ฐฉ์๊ณผ bottom up
๋ฐฉ์์ด ์๋ค.
๊ฐ๋จํ ์ดํ๋ฆฌ์ผ์ด์
์ ์ผ๋ฐ์ ์ผ๋ก top-down
๋ฐฉ์์ด ์ฝ๊ณ ๊ท๋ชจ๊ฐ ์๋ ์ดํ๋ฆฌ์ผ์ด์
์ bottom-up
๋ฐฉ์์ด ์ฝ๋ค.
์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ํ์๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ ๋๋งํ๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๊ฐ ์๊ธฐ๊ฒ ๋๋ค. ์๋ํ๋ฉด ์ ์ app์ด๋ผ์ ์ปดํฌ๋ํธ๋ JSX๋ง returnํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ต์์ ์ปดํฌ๋ํธ๋ prop์ผ๋ก ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ฐ๊ฒ ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ one-way data flow(๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ)๋ผ๊ณ ๋ถ๋ฆฌ๋๋ฐ ๋ฐ์ดํฐ๊ฐ ์ต์์ ๋ ๋ฒจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๊ฐ์ฅ ๋ฐ๋ฅ์ ์๋ ์ปดํฌ๋ํธ ๊น์ง ์์์ ์๋๋ก ํ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
Step 3: ์ ์ ํ UI state๋ฅผ ์ฐพ๋๋ค
UI๋ฅผ ์ํธ์์ฉํ ์ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด์ ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ณํ์ํฌ ์ ์๋๋ก ํ๋๊ฒ์ด ํ์ํ๋ค. ์ด๋ฅผ ์ํด์ state๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ค.
state๋ ๋ฐ์ดํฐ๋ฅผ ๋ณํ์ํค๊ธฐ ์ํด์ app์์ ๊ธฐ์ตํ๊ณ ์์ด์ผ ํ๋ ์ต์ํ์ ์งํฉ์ด๋ค. state๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ์ฅ ์ค์ํ ์์น์ DRY (Don't Repeat Yourself). ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ์ํ ์ต์ํ์ ๊ฐ๋ง state๋ก ๋ง๋ค๊ณ ๊ทธ ์ด์ธ์ ๊ฒ๋ค์ ํ์์ ๋ฐ๋ผ state๋ฅผ ์ด์ฉํ ์ฐ์ฐ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, ์ผํ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ ์๋ค๊ณ ํ๋ฉด ์์ดํ ์ state ๋ฐฐ์ด์ ์ ์ฅํ ์ ์๋ค. ๋ง์ฝ ๋ฆฌ์คํธ์ ๋ด๊ธด ์์ดํ ์ ๊ฐ์๋ฅผ ํํํ๊ณ ์ถ๋ค๋ฉด, ๋ ๋ค๋ฅธ state์ ์์ดํ ๊ฐ์๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ state ๋ฐฐ์ด์์ ๊ธธ์ด๋ฅผ ์ด์ฉํด์ผ ํ๋ค.
์ด์ ์์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ค์ ์๊ฐํด๋ณด์.
์ ํ์ ์๋ณธ ๋ฆฌ์คํธ
์ ์ ๊ฐ ์ ๋ ฅํ ๊ฒ์์ด
์ฒดํฌ๋ฐ์ค์ ๊ฐ
ํํฐ๋ ์ ํ ๋ฆฌ์คํธ
์ด์ค์ ๋ฌด์์ด state์ผ๊น? ์๋์ ํด๋นํ์ง ์๋๊ฒ์ ์ฐพ์๋ณด์.
์ฌ์ฉ๋๋ ๋ด๋ด ๊ฐ์ด ๋ณํ์ง ์๋๋ค๋ฉด state๊ฐ ์๋๋ค.
props๋ฅผ ํตํด ๋ถ๋ชจ๋ก๋ถํฐ ์ ๋ฌ๋ฐ๋๋ค๋ฉด state๊ฐ ์๋๋ค.
์ปดํฌ๋ํธ ๋ด์ ์ด๋ฏธ ์กด์ฌํ๋ state๋ props๋ฅผ ์ด์ฉํ์ฌ ๊ณ์ฐํ ์ ์๋ค๋ฉด ํนํ state๊ฐ ์๋๋ค.
ํด๋นํ์ง ์๋๊ฒ๋ค์ state๊ฐ ๋ ๊ฒ์ด๋ค.
ํ๋์ฉ ์ดํด๋ณด์.
์ ํ์ ์๋ณธ ๋ฆฌ์คํธ๋ props๋ก ์ ๋ฌ๋ฐ๊ธฐ ๋๋ฌธ์ state๊ฐ ์๋๋ค.
๊ฒ์์ด๋ ๊ณ์ ๋ณํ๊ณ , ๋ฌด์ธ๊ฐ๋ก ๋ถํฐ ๊ณ์ฐํ ์ ์๊ธฐ ๋๋ฌธ์ state๋ก ๋ณด์ธ๋ค.
์ฒดํฌ๋ฐ์ค์ ๊ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ณ์ ๋ณํ๊ณ , ๋ฌด์ธ๊ฐ๋ก๋ถํฐ ๊ณ์ฐํ ์ ์๊ธฐ ๋๋ฌธ์ state๋ก ๋ณด์ธ๋ค.
ํํฐ๋ ์ ํ ๋ฆฌ์คํธ๋ ์ํ๊ฐ ์๋๋ค. ์๋ํ๋ฉด ์ ํ์ ์๋ณธ ๋ฆฌ์คํธ์ ๊ฒ์์ด, ์ฒดํฌ๋ฐ์ค์ ๊ฐ์ผ๋ก ๊ณ์ฐํ ์ ์๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ ๊ฒ์์ด์ ์ฒดํฌ๋ฐ์ค ๊ฐ๋ง state์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ๊ตญ์ด๋ก ์ฝ๊ณ ์ถ๋ค๋ฉด ์์ ๋ฌธ์์ ์ค๋ช ๋ง ์ด์ง ์ฐธ๊ณ ํ์(์ฝ๋๋ ์ฐธ๊ณ ํ์ง ๋ง ๊ฒ!).
React ์ฝ์ด ๊ฐ๋ฐ์๊ฐ ์ด React์ ๋ํ ์ดํด๋ฅผ ๋๋ ๊ธ (ํ๋ !)
Dan Abramov๋ ์ ์ด์ผ...
๋ ๋๋ง
๋ธ๋ผ์ฐ์ ์ view๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ
ํจ์๊ฐ ์คํ๋๋ ๊ฒ
createRoot (React 18)
function Greeting() {
return <p>Hello, world!</p>;
}
function main() {
const element = document.getElementById('root');
if (!element) {
return;
}
const root = ReactDOM.createRoot(element);
root.render(<Greeting />);
}
main();
์ฌ๋ฌ ๊ฐ์ Root๋ฅผ ๋ง๋ค ์ ์๊ณ , ์ฌ๋ฌ ๋ฒ renderํ ์ ์๋ค.
React๋ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ ํ๋ค.
Reconciliation(์ฌ์กฐ์ )
diffing algorithm
๋ฆฌ๋ ๋๋ง
State๊ฐ ๋ฐ๋ ๋ ๋ฆฌ๋ ๋๋ง์ด ๋๊ณ , ์๋ ๋ค๋ ๋ฆฌ๋ ๋๋ง์ด ๋๋ค.
Component๋ ์ต์์์ ํ๋์ ๋ถ๋ชจ๊ฐ ์์ด์ผ ํ๋ค.
React.createElement
jsx๊ฐ js๋ก ๋ณํ๋ ๋ ์ ๋ฉ์๋๋ฅผ ์คํํ๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก ํ๊ทธ ํน์ ์ปดํฌ๋ํธ๋ฅผ 1๊ฐ ๋ฐ๋๋ค.
Fragment
DOM์ ๋ ๋๋ง์ด ๋ ๋ ์ฌ๋ผ์ง๋ ํ๊ทธ, ์ฝ๋ ์์ฑ์ ๋ถ๋ชจ ํ๊ทธ์ ์ญํ ์ ํ๋ค.
๋ณด๋์ค
์ ์ด์ ์ญ์ (IoC: Inversion of Control)์ด Framework์ ์ฃผ์ํ ํน์ง์ด๊ณ , React๋ IoC๋ฅผ ํตํด ์ํ์ ์ ๋ฐ์ดํธ๊ฐ ์ฝํ ๋ณต์กํ ์ํฉ์ ๊ฐ๋จํ ์ ์ธํ UI๋ก ๊ตฌ์ฑํ๋ ํํ์ ๋๋ฆฐ๋ค(์ด๊ฒ ๋ฐ๋ก React์ ์ฒซ ๋ฒ์งธ ํน์ง์ด๋ค). ๊ทธ ๋๊ตฌ๋ ๋งค๋ฒ root๋ฅผ renderํ๋ ๋ฐฉ์์ผ๋ก ์ฐ๋ฉด์ โ์ด๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ง!โ๋ผ๋ฉฐ ๊ฐํํ์ง ์๋๋ค.
ํ์ง๋ง ์ผ๋ฐ์ ์ผ๋ก๋ (Martin Fowler์ ๊ฐํ์ฒ๋ผ) IoC๋ IoC ์ปจํ ์ด๋์ ์ฎ์ฌ์ DI์ ๋์์ด์ฒ๋ผ ์ฐ์ด๊ณ , Next.js, Remix ๊ฐ์ ๊ฑธ Framework์ด๋ผ๊ณ ๋ถ๋ฅด๋ ๋ฉด์ ๋ ๊ดํ ์ด๋ฐ ๊ฑธ๋ก ์ธ์ฐ์ง๋ ๋ง์. โ๋ฆฌ์กํธ ๊ฐ๋ฐ์๊ฐ ์ด๋ ๊ฒ ์ด์ผ๊ธฐํ๋ค๋๊น์!โ๋ผ๊ณ ํด๋ด์ผ ์๋ก ๊ฐ์ ๋ง ์ํ ๋ฟ์ด๋ค.
์ฐ๋ฆฌ๋ ์ค์ค๋ก ๋ชฐ๋๋๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ ์ด์ ์ญ์ ์ ๊ฒฝํํ๊ณ ์๋ค. ์ค์ค๋ก ๊ด๋ฆฌํ์ง ์๋๋ผ๋ ๊ตฌํ์ฒด์ ๊ฐ์ ์ ๋ฌํด์ฃผ๋ฉด, ๊ตฌํ์ฒด๊ฐ ๋์ ํด์ ํน์ ์ญํ ์ ํด์ฃผ๋ ๊ฒ. React์ ์ ์ธ์ ์ธ ๋ ๋๋ง๋ ์ ์ด์ ์ญ์ ์ด๋ค.
Last updated