๐พ React๋ก UI๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋จ๊ณ
๐ฌ ์ด๋ฒ ๊ธ์ React ๊ณต์๋ฌธ์์ ๊ธ์ ๊ณต๋ถํ๋ฉฐ ๋๋ฆ๋๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
์์ธํ ๋ด์ฉ์ ์๋ React ๊ณต์๋ฌธ์ ์ฐธ๊ณ ํ๋ฉฐ ํ์ตํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๐
1. UI๋ฅผ ์ปดํฌ๋ํธ ๊ณ์ธต์ผ๋ก ์ชผ๊ฐ๊ธฐ
๐ ์ปดํฌ๋ํธ๋ก ์๊ฐํ๊ธฐ
→ ๋จ์ผ์ฑ ์ ์์น์ ๋ฐ์ํ๊ณ ์ ํ๋ค๋ฉด ์ปดํฌ๋ํธ๋ ์ด์์ ์ผ๋ก๋ ํ ๊ฐ์ง ์ผ๋ง ํด์ผ ํ๋ค. ๋ง์ฝ ์ปดํฌ๋ํธ๊ฐ ์ ์ ์ปค์ง๋ค๋ฉด ์์ ํ์ ์ปดํฌ๋ํธ๋ก ์ชผ๊ฐ ๋ค.
2. React๋ก ์ ์ ์ธ UI ๊ตฌํํ๊ธฐ
• ์ ์ ์ธ ๋ฒ์ ์ ๋จผ์ ๋ง๋ค๊ณ ์ํธ์์ฉ์ ๊ฐ๋ณ๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด๋ค.
• ๋ฐ์ดํฐ ๋ชจ๋ธ(์ ํ์ ์๋ณธ ๋ชฉ๋ก)์ ๋ ๋๋งํ๋ ์ฑ์ ์ ์ ๋ฒ์ ์ ๋ง๋ค๊ธฐ ์ํด ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ , props
๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค. (์ ์ ์ธ ๋ฒ์ ์ ๋ง๋ค ๋ state
์ฌ์ฉ์ X)
โ๏ธ ์ฑ์ ๋ง๋ค ๋ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฐ๋ผ ์์ธต๋ถ์ ์๋ ์ปดํฌ๋ํธ๋ถํฐ ํํฅ์(top-down)์ผ๋ก ๋ง๋ค๊ฑฐ๋, ํ์ธต๋ถ์ ์๋ ์ปดํฌ๋ํธ ๋ถํฐ ์ํฅ์(bottom-up)์ผ๋ก ๋ง๋ค ์ ์๋ค. ๊ฐ๋จํ ์์์์๋ ๋ณดํต ํํฅ์์ผ๋ก ๋ง๋๋ ๊ฒ ์ฝ์ง๋ง, ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ์ํฅ์์ผ๋ก ๋ง๋ค๊ณ ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด์ ๊ฐ๋ฐํ๊ธฐ๊ฐ ๋ ์ฝ๋ค.
→ ๊ณ์ธต๊ตฌ์กฐ์ ์ต์๋จ ์ปดํฌ๋ํธ๋ props๋ก ์ ํ์ ์๋ณธ ๋ชฉ๋ก์ ๋ฐ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ต์๋จ ์ปดํฌ๋ํธ๋ถํฐ ํธ๋ฆฌ์ ๋งจ ์๋ ๊น์ง ํ๋ฌ๊ฐ๊ธฐ ๋๋ฌธ์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ(one-way data flow)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
3. ์ต์ํ์ ๋ฐ์ดํฐ๋ง ์ด์ฉํด์ ์๋ฒฝํ๊ฒ UI State ํํํด๋ด๊ธฐ
• UI๋ฅผ ์ํธ์์ฉ(interactive)ํ๊ฒ ๋ง๋ค๋ ค๋ฉด ์ ์ ๊ฐ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํด์ผ ํ๋ค. React๋ state๋ฅผ ํตํด ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๋ค.
• ๋ณํ๋ ๊ฐ๊ณผ ๋ณํ์ง ์๋ ๊ฐ์ ์๊ฐํด์ผ ํ๋ค. ๋ณํ๋ ๊ฐ์ ์ํ(state)๋ก ๋๋ค. ์ํ๋ ์ต์ํํ๋ ๊ฒ์ด ์ข์ผ๋ฉฐ, ์ํ๊ฐ ๋ง์์๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์กํด์ง๋ค.
• ์ ํ๋ฆฌ์ผ์ด์ ์ด ํ์๋ก ํ๋ ๊ฐ์ฅ ์ต์ํ์ state๋ฅผ ์ฐพ๊ณ ์ด๋ฅผ ํตํด ๋๋จธ์ง ๋ชจ๋ ๊ฒ๋ค์ด ํ์์ ๋ฐ๋ผ ๊ทธ๋๊ทธ๋ ๊ณ์ฐ๋๋๋ก ๋ง๋ ๋ค. → ์ฑ์ ๋์ํ๋ ์ต์ํ์ state๋ค๋ง ์ด์ฉํ๋ ์ค๋ณต๋ฐฐ์ ์์น(Don’t repeat Yourself)
์์ ์ดํ๋ฆฌ์ผ์ด์ ๋ด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
1. ์ ํ์ ์๋ณธ ๋ชฉ๋ก → props๋ฅผ ํตํด ์ ๋ฌ๋์๊ธฐ ๋๋ฌธ์ state๊ฐ ์๋
2. ์ ์ ๊ฐ ์ ๋ ฅํ ๊ฒ์์ด → ์๊ฐ์ ๋ฐ๋ผ ๋ฐ๋๊ณ , ๋ค๋ฅธ ๊ฒ์ผ๋ก๋ถํฐ ๊ณ์ฐ์ด ๋ถ๊ฐํ๋ฏ๋ก state
3. ์ฒดํฌ๋ฐ์ค์ ๊ฐ → ์๊ฐ์ ๋ฐ๋ผ ๋ฐ๋๊ณ , ๋ค๋ฅธ ๊ฒ์ผ๋ก๋ถํฐ ๊ณ์ฐ์ด ๋ถ๊ฐํ๋ฏ๋ก state
4. ํํฐ๋ง ๋ ์ ํ๋ค์ ๋ชฉ๋ก → ์ ํ์ ์๋ณธ ๋ชฉ๋ก๊ณผ ๊ฒ์์ด, ์ฒดํฌ๋ฐ์ค์ ๊ฐ์ ์กฐํฉํด์ ๊ณ์ฐํ ์ ์๊ธฐ ๋๋ฌธ์ state๊ฐ ์๋
4. State๊ฐ ์ด๋์ ์์ด์ผ ํ ์ง ์ ํ๊ธฐ
1. ํด๋น state๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋งํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ ์ฐพ๊ธฐ
2. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ๋ถ๋ชจ ์ปดํฌ๋ํธ ์ฐพ๊ธฐ
→ ๋ง์ฝ state๊ฐ ํน์ ์ปดํฌ๋ํธ์์๋ง ์ ์๋ฏธํ๋ค๋ฉด, ํน์ ์ปดํฌ๋ํธ์ ๋๋ฉด ๋๋ค.
→ state๋ ์ฌ๊ธฐ ์์นํ ์ ์๋ค.
→ ํน์ ๊ณตํต ๋ถ๋ชจ ์์์ ์ปดํฌ๋ํธ์ ๋๊ฑฐ๋, ์ ์ ํ ์ปดํฌ๋ํธ๋ฅผ ์ฐพ์ง ๋ชปํ์๋ค๋ฉด state๋ฅผ ์์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๋ง๋ค์ด์ ์์ ๊ณ์ธต์ ์ถ๊ฐํ๋ค.
5. ์ญ ๋ฐ์ดํฐ ํ๋ฆ ์ถ๊ฐํ๊ธฐ
React๋ ์ ํต์ ์ธ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ(two-way data binding)๊ณผ ๋น๊ตํ๋ฉด ๋ ๋ง์ ํ์ดํ์ ํด์ผ ํ์ง๋ง ๋ฐ์ดํฐ ํ๋ฆ์ ๋ช ์์ ์ผ๋ก ๋ณด์ด๊ฒ ๋ง๋ค์ด์ ํ๋ก๊ทธ๋จ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ ํ ์ ์๊ฒ ๋์์ค๋ค.
์์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์๊ฐํด๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
• state๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ปดํฌ๋ํธ → FilterableProductTable
• ์ฌ์ฉ์๊ฐ input์ ๋ณ๊ฒฝํ ๋๋ง๋ค state๋ฅผ ์ ๋ฐ์ดํธ ํด์ผํ๋ ์ปดํฌ๋ํธ → SearchBar
SearchBar์ FilterableProductTable ๋์ state๋ฅผ ์ ๋ฐ์ดํธ์ํค๊ธฐ ์ํด์๋ ๋ณ๊ฒฝ๋๋ ํจ์๋ฅผ SearchBar๋ก ์ ๋ฌํด state๊ฐ ์ ๋ฐ์ดํธ๋์ด์ผ ํ ๋๋ง๋ค ํธ์ถ๋๋๋ก ํ๋ฉด ๋๋ค.
function FilterableProductTable({ products }) {
const [filterText, setFilterText] = useState('');
const [inStockOnly, setInStockOnly] = useState(false);
return (
<div>
<SearchBar
filterText={filterText}
inStockOnly={inStockOnly}
onFilterTextChange={setFilterText}
onInStockOnlyChange={setInStockOnly}
/>
...
<input
type="text"
value={filterText}
placeholder="Search..."
onChange={(e) => onFilterTextChange(e.target.value)}
/>
โ๏ธ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ชป๋ ์ ๋ณด๋ ๋ ๊ณต์ ํ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
'Frontend Dev > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React์ Props Drilling๊ณผ ์ํ๊ด๋ฆฌ (0) | 2023.06.25 |
---|---|
React Hooks - useEffect (0) | 2023.05.31 |
React ๊ธฐ๋ณธ, props ์ฌ์ฉํ๊ธฐ (0) | 2023.05.23 |
React state์ ๊ฐ๋จํ๊ฒ ์์๋ณด๋ useState (0) | 2023.05.23 |
React ๊ธฐ๋ณธ, JSX(JavaScript XML)์ JSX ๋ฌธ๋ฒ ๊ท์น ํ๋ฒ์ ์์๋ณด๊ธฐ (0) | 2023.05.18 |