React๋ ์ํ ๊ธฐ๋ฐ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ ๋งํผ state(์ํ)๊ฐ ์ค์ฌ์ด ๋๋ ๊ตฌ์กฐ๋ค. ์ค๋์ React ์ฑ์ ๊ตฌ์ฑํ ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด์ ๋ณธ์ง์ ์ธ ๋ค์ ๋ค ๊ฐ์ง ์ฃผ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌ์กํธ ๊ธฐ์ด ํต์ฌ๊ณผ ์ปดํฌ๋ํธ ๊ตฌํ์ ์์๋ณด๋ ค๊ณ ํ๋ค.
- useState๋ก ์ํ ๋ง๋ค๊ธฐ
- ๊ตฌ์กฐ ๋ถํด ํ ๋น์ผ๋ก props์ state ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ
- ๋ฐฐ์ด ๋ฐ์ดํฐ ๋ฐ๋ณต ์ฒ๋ฆฌ(map)
- setInterval์ ํ์ฉํ ์ค์๊ฐ ์๊ณ ๊ตฌํ
๐ฆState
React์์ ์ํ์ ๊ฐ๋
React์ ๊ธฐ๋ณธ ์ฒ ํ์ UI๋ ์ํ์ ๋ฐ๋ผ ์๋์ผ๋ก ๊ฐฑ์ ๋์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ํ(state)๋ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค.
- ์ฌ์ฉ์ ์ ๋ ฅ, ๋คํธ์ํฌ ์๋ต, ์๊ฐ ํ๋ฆ ๋ฑ์ ๋ฐ๋ผ ๋ณํ ๊ฐ๋ฅ
- ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํ๋ฉด(UI)๋ฅผ ์๋์ผ๋ก ๋ค์ ๋ ๋๋งํด์ผ ํ๋ ๊ฐ
์ฆ, ๋ค์๊ณผ ๊ฐ์ ๋ฐ์ดํฐ๋ ์ํ๋ก ๊ด๋ฆฌํด์ผ ํ๋ค:
- ๋ฒํผ ํด๋ฆญ ํ์
- ์ ๋ ฅ ํผ์ ๊ฐ
- API ์์ฒญ ๊ฒฐ๊ณผ
- ์๊ฐ
useState
React์์๋ useState๋ผ๋ ํ ์ ์ ๊ณตํด ์ํ๊ฐ์ ๊ด๋ฆฌํ๋ค. ์๋๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์นด์ดํฐ ์์ ๋ค.
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0); // ์ํ ์ด๊ธฐ๊ฐ: 0
return (
<div>
<p>ํ์ฌ ์นด์ดํธ: {count}</p>
<button onClick={() => setCount(count + 1)}>+1</button>
<button onClick={() => setCount(count - 1)}>-1</button>
</div>
);
}
- const [count, setCount] = useState(0) -> count๋ ํ์ฌ ์ํ๊ฐ, setCount๋ ์ด ๊ฐ์ ๋ฐ๊พธ๋ ํจ์๋ค.
- setCount()๋ฅผ ํธ์ถํ๋ฉด, React๋ count ๊ฐ์ ์๋ก์ด ๊ฐ์ผ๋ก ๊ต์ฒดํ๊ณ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ , ์ต์ UI๋ฅผ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค๋ค.
React์์ ์ํ๋ฅผ ์ง์ ๋ฐ๊พธ์ง ์๊ณ setCount() ๊ฐ์ ํจ์๋ฅผ ๋ฐ๋์ ๊ฑฐ์ณ์ผ ํ๋ ์ด์ ๋, React๊ฐ ์ด ๋ณํ๋ฅผ ๊ฐ์งํ๊ณ UI๋ฅผ ๋๊ธฐํํ๊ธฐ ์ํด์๋ค. ์ฆ, ์ํ ๊ด๋ฆฌ ์์ด ์ง์ DOM์ ์กฐ์ ํ๋ฉด ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
- UI์ ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ถ์ผ์น
- ๋ณต์กํ ์กฐ๊ฑด๋ฌธ๊ณผ ํ์ด๋จธ ๊ด๋ฆฌ ํ์
- ํ์ , ์ ์ง๋ณด์๊ฐ ์ด๋ ค์
useState๋ ์ด ๊ณผ์ ์ ์์ ํ ์๋ํํด์ค๋ค.
๐ ๏ธ๊ตฌ์กฐ ๋ถํด ํ ๋น: React์ ์ฐฐ๋ก ๊ถํฉ ๋ฌธ๋ฒ
destructuring assignment, ๊ฐ์ฒด๋ ๋ฐฐ์ด์์ ํ์ํ ๊ฐ์ ์ถ์ถํด ๋ณ์์ ๋ฐ๋ก ๋ด๋ ๋ฌธ๋ฒ
React์์๋ ๊ตฌ์กฐ ๋ถํด ํ ๋น์ ๋ง์ด ์ด๋ค! ์?
- useState๊ฐ ๋ฐฐ์ด์ ๋ฐํํ๊ธฐ ๋๋ฌธ์, [state, setState]๋ก ๋ฐ์ ์ ์๋ค.
- props๋ ๊ฐ์ฒด์์ ์ํ๋ ์์ฑ๋ง ๊บผ๋ด ์ธ ์ ์๋ค.
props ๊ตฌ์กฐ ๋ถํด
function Greeting({ name, age }) {
return <p>{name}๋์ {age}์ด์
๋๋ค.</p>;
}
// ์ฌ์ฉ
<Greeting name="์ฑํธ" age={3} />
์ํ ๊ตฌ์กฐ ๋ถํด
const [user, setUser] = useState({ name: '์ฑํธ', age: 3 });
const { name, age } = user; // ๊ตฌ์กฐ ๋ถํด
๊ตฌ์กฐ ๋ถํด ๋๋ถ์ user.name, user.age์ฒ๋ผ ๊ธธ๊ฒ ์ธ ํ์ ์์ด ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค
๐บ๏ธ.map()
React์์๋ ๋ฐฐ์ด์ ํ๋ฉด์ ์ถ๋ ฅํ๋ ค๋ฉด .map()์ ์ฌ์ฉํด JSX๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
const fruits = ['๐ ์ฌ๊ณผ', '๐ ๋ฐ๋๋', '๐ ํฌ๋'];
function FruitList() {
return (
<ul>
{fruits.map((fruit, idx) => (
<li key={idx}>{fruit}</li>
))}
</ul>
);
}
- fuits.map(...) -> ๊ฐ ํญ๋ชฉ๋ง๋ค JSX <li>๋ฅผ ๋ง๋ค์ด ๋ฐฐ์ด๋ก ๋ฐํ
- key = {idx} : React๊ฐ ๊ฐ ํญ๋ชฉ์ ์๋ณํ๊ธฐ ์ํ ๊ณ ์ key ํ์
React๋ ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ถ๋ ฅํ ์ ์๋ค. JSX๋ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, ๋ฐฐ์ด ๋ด ๊ฐ ์์๋ฅผ JSX๋ก ๋ณํํ ๋ค์ ์ถ๋ ฅํด์ผ ํ๋ค. ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด map()์ด๋ค.
โฐ์๊ณ ๊ตฌํํ๊ธฐ
React์์๋ ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค๋ ค๋ฉด ์ผ์ ์ฃผ๊ธฐ๋ก ์ํ๋ฅผ ๊ฐฑ์ ํด์ผ ํ๋ฉฐ, ์ด๋ฅผ ์ํด useEffect์ setInterval์ ์กฐํฉํ๋ค.
import { useEffect, useState } from 'react';
function Clock() {
const [time, setTime] = useState(new Date());
useEffect(() => {
const timer = setInterval(() => {
setTime(new Date());
}, 1000);
return () => clearInterval(timer); // ์ธ๋ง์ดํธ ์ ํ์ด๋จธ ์ ๋ฆฌ
}, []);
return <h2>ํ์ฌ ์๊ฐ: {time.toLocaleTimeString()}</h2>;
}
- useState(new Date()) -> ํ์ฌ ์๊ฐ์ ์ํ๋ก ์ ์ฅ
- useEffect(() => {...}, []) -> ๋ง์ดํธ ์ ๋ฑ ํ๋ฒ ์คํ
- setInterval(...) -> 1์ด๋ง๋ค setTime()์ ํธ์ถํด ์ํ ์ ๋ฐ์ดํธ
- clearInterval() -> ์ปดํฌ๋ํธ ์ ๊ฑฐ ์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง๋ฅผ ์ํ ์ ๋ฆฌ(cleanup)
React๋ฅผ ๋ณธ์ง์ ์ผ๋ก ์ดํดํ๋ ค๋ฉด ์ํ๊ฐ ๋ณํ ๋ UI๊ฐ ๋ณํ๋ค๋ ๊ด์ ์ ๋์น์ง ์์์ผ ํ๋ ๊ฒ ๊ฐ๋ค. ์ค๋์ ๋ค์ ํ๋ฆ์ผ๋ก ์ด ์๋ฆฌ๋ฅผ ๊ณต๋ถํด ๋ณด์๋ค.
- useState๋ UI๋ฅผ ์ํ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค ์ ์๋ ํต์ฌ ๋๊ตฌ
- ๊ตฌ์กฐ ๋ถํด๋ ์ํ์ props๋ฅผ ๊ฐ๊ฒฐํ๊ณ ๋ช ํํ๊ฒ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฌธ๋ฒ์ ๋๊ตฌ
- .map()์ ์ด์ฉํ ๋ฐ๋ณต ๋ ๋๋ง์ ๋ฆฌ์คํธ ๊ธฐ๋ฐ UI์ ๊ธฐ๋ณธ
- useEffect์ ํใ ๋จธ๋ ์๊ฐ ํ๋ฆ ๊ฐ์ ์ธ๋ถ ์ด๋ฒคํธ๋ฅผ React ์ปดํฌ๋ํธ์ ๋ฐ์ํ ์ ์๊ฒ ํด์ค๋ค.
์ด ๋ค๊ฐ์ง ๊ฐ๋ ์ React๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ก์ ํธ์ ์ถ๋ฐ์ ์ด์ ์์์ ์ด๋ค. ๋ค์์๋ useEffect์ ์์กด์ฑ ๋ฐฐ์ด๊ณผ ์กฐ๊ฑด๋ถ ๋ ๋๋ง, ์ปดํฌ๋ํธ ๋ถ๋ฆฌ ์ ๋ต๋ค์ ๋ ๊ณต๋ถํด๋ด์ผ ํ ๋ฏ.
'๐๏ธํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐ๋ธ์ฝ์ค] react task app 2 (0) | 2025.06.21 |
---|---|
[๋ฐ๋ธ์ฝ์ค] Redux (2) | 2025.06.16 |
[๋ฐ๋ธ์ฝ์ค] React์ JSX, UI ํจ๋ฌ๋ค์์ ์ ํ (1) | 2025.06.14 |
[๋ฐ๋ธ์ฝ์ค] ํ์ ์คํฌ๋ฆฝํธ: ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ถํฐ ํด๋์ค๊น์ง (0) | 2025.06.11 |
[๋ฐ๋ธ์ฝ์ค] ํ์ ์คํฌ๋ฆฝํธ ๊ธฐ์ด(ํ์ , ์ธํฐํ์ด์ค, ์ด๊ฑฐํ) (2) | 2025.06.10 |