
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ํ๋ ํ๋ก ํธ์๋ ์ํ ๊ด๋ฆฌ
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ํ๋ ํ๋ก ํธ์๋ ์ํ ๊ด๋ฆฌ ๊ด๋ จ
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์ ์ํ(State)๋ UI์ ๋ฐ์ดํฐ์ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ํต์ฌ ์์์
๋๋ค. ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด, ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๋ฆฌ์กํธ(React)์์๋ useState
๋ผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋๋ฐ์. useState
๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๊น๊ฐ์ ์ค์ ํ๊ณ , ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ฉฐ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UI๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์ ์์ฃผ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.

๋ฆฌ์กํธ์ useState
๋ ๋ง์น ์ค๋งํธํ ์์คํ
์ฒ๋ผ ์๋ํฉ๋๋ค. ๋ฒํผ ํ๋๋ก ์กฐ๋ช
๊ณผ ์จ๋๋ฅผ ์๋์ผ๋ก ์ ์ดํ ์ ์๋ ํธ๋ฆฌํจ์ ์ ๊ณตํฉ๋๋ค. ํ์ง๋ง ์ด๋ฐ ์๋ํ ์์คํ
์ด ์๋ค๋ฉด,
์ฐ๋ฆฌ๋ ๊ฐ ๋ฐฉ์ ์กฐ๋ช
์ ์ผ์ผ์ด ์ผ๊ณ ๋๊ณ ์จ๋๋ฅผ ์๋์ผ๋ก ์กฐ์ ํด์ผ ํ๊ฒ ์ฃ . ๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์กํธ ์์ด, ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ผ๋ก๋ ์ด๋ฐ ์ํ ๊ด๋ฆฌ ๋ฐฉ์์ ์ง์ ๊ตฌํํ ์ ์์๊น์?
์ฌ์ค ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ง ํ์ฉํด๋ ๋น์ทํ ๋ฐฉ์์ ์ํ ๊ด๋ฆฌ ๋ก์ง์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ๋ฆฌ์กํธ์ useState๊ฐ ์ด๋ป๊ฒ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ UI๋ฅผ ๊ฐฑ์ ํ๋์ง ๊ฐ๋จํ
์ดํด๋ณธ ๋ค์, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํด ์ ์ฌํ ์ํ ๊ด๋ฆฌ ๋ก์ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค.
๋ฆฌ์กํธ์ useState
๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด useState
๋ผ๋ ํ
(Hook)์ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์ ํ
์ด๋, ์ํ์ ๋ฆฌ์กํธ์ ๋ผ์ดํ์ฌ์ดํด ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ ๋๊ตฌ๋ก, ๋ํ์ ์ธ ํ
์ผ๋ก๋ useState
, useEffect
, useContext
๋ฑ์ด ์์ต๋๋ค.
๋ฆฌ์กํธ์ useState
๋ ์ํ ๋ณ๊ฒฝ ์ Virtual DOM์ ํตํด ํ์ํ ๋ถ๋ถ๋ง ์
๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ์ํ์ UI๋ฅผ ์๋์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ต์ ํ๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ฉด, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ํ์ UI๋ฅผ ๋ช
์์ ์ผ๋ก ์ฐ๊ฒฐํด์ผ ํ๋ฉฐ, ์๋์ผ๋ก DOM์ ์กฐ์ํด์ผ ํฉ๋๋ค.
1) useState ์ฌ์ฉ ์์
์ํ(State)๋ UI์ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ๋ฆฌ์กํธ์ useState
๋ ์ด๋ฅผ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค. useState
๋ฅผ ํ์ฉํ ๊ฐ๋จํ ์นด์ดํฐ ์์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด์, useState
์ ๋ํด ์ข ๋ ์์ธํ ์์๋ณผ๊ฒ์.
import ๋ฆฌ์กํธ, { useState } from "๋ฆฌ์กํธ";
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
์์ ์ฝ๋์์ useState(0)
์ ์ด๊น๊ฐ์ 0์ผ๋ก ์ค์ ํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ฆฌ์กํธ๋ ์ด ์ด๊น๊ฐ์ ๊ธฐ์ตํ๊ณ , count
๋ผ๋ ๋ณ์๋ฅผ ํตํด ํ์ฌ ์ํ ๊ฐ์ ์ ๊ณตํฉ๋๋ค. ์ํ ๊ฐ์ ๋ณ๊ฒฝํ๋ ค๋ฉด setCount
๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋๋๋ฐ์, ์ ์ฝ๋์์๋ ๋ฒํผ์ ํด๋ฆญํ ๋ setCount(count + 1)
๋ฅผ ํธ์ถํด์ ์ํ ๊ฐ์ 1์ฉ ์ฆ๊ฐ์ํค๊ณ ์์ต๋๋ค.
2) useState๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์
์ด๋ ๊ฒ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ์กํธ๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ , ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ์ฌ ์ต์ ์ํ๋ฅผ ํ๋ฉด์ ๋ฐ์ํฉ๋๋ค. ์ฆ, ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ์ซ์๊ฐ ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์์ฃ . ์ด ๊ณผ์ ์ ๋ฆฌ์กํธ๋ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์ํ ๋ณ๊ฒฝ ์ ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ๊ณ , Virtual DOM์ ํ์ฉํด ์ค์ DOM ์กฐ์์ ์ต์ํํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
๋ฆฌ์กํธ์ useState๋ ๊ฐ๋ฐ์๊ฐ ๋ณต์กํ DOM ์กฐ์์ ์ง์ ์์ฑํ ํ์ ์์ด, ์ํ์ UI๋ฅผ ๊ฐ๋จํ๊ฒ ์ฐ๊ฒฐํ ์ ์๋๋ก ๋์์ค๋๋ค. ๋ฒํผ ํด๋ฆญ๊ณผ ๊ฐ์ ์ด๋ฒคํธ์ ๋ฐ๋ผ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋๋ฉฐ, ์๋ก์ด ์ํ๊ฐ ๋ฐ์๋ UI๋ฅผ ์๋์ผ๋ก ๊ฐฑ์ ํด ์ฃผ๋ ์ ์ด ๋ฐ๋ก useState์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
โ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธโ๋ก ์ํ ๊ด๋ฆฌํ๊ธฐ
ํ๋ก ํธ์๋์์ ์ํ(State)๋ UI์ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๋ฆฌ์กํธ์ useState๋ ์ํ๋ฅผ ๊ฐ๋จํ ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ๋ฆฌ์กํธ ์์ด๋ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฌํ ์ํ ๊ด๋ฆฌ ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ํ ์ ์ฅ, ์ํ ๋ณ๊ฒฝ, UI์ ์ํ ์ฐ๊ฒฐ, ๊ทธ๋ฆฌ๊ณ ๋ค์ค ์ํ ๊ด๋ฆฌ๊น์ง์ ๊ฐ๋ ์ ๋ช ํํ ์ดํดํ ์ ์์ต๋๋ค.
1) ์ํ ์ ์์ ์ด๊ธฐํ
์ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ํต์ฌ ์์๋ก, UI ๋์์ ๊ฒฐ์ ์ง๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋ฌผ ์ฌ์ง ์จ๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ํ๋ ํ์ฌ ์ ํ๋ ํญ(currentTab
)๊ณผ ํด๋น ํญ์ ๋ง๋ ์ฌ์ง ๋ฐ์ดํฐ(photos
)๋ฅผ ์ ์ฅํฉ๋๋ค.

์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ ์ ์์ต๋๋ค.
this.state = {
currentTab: 'all', // ํ์ฌ ์ ํ๋ ํญ
photos: [], // ํ์ฌ ํญ์ ํด๋นํ๋ ์ฌ์ง ๋ชฉ๋ก
};
์ฌ๊ธฐ์ currentTab
์๋ ์ฌ์ฉ์๊ฐ ์ ํํ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ์ ์ฅํ๊ณ , photos
์๋ ํด๋น ์นดํ
๊ณ ๋ฆฌ์ ๋ง๋ ์ฌ์ง ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ๋ฆฌ์กํธ์ useState
์ ์ ์ฌํ๊ฒ ์ํ๋ฅผ ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ๋ฉฐ ์ด๊น๊ฐ์ ๋ช
์์ ์ผ๋ก ์ค์ ํฉ๋๋ค.
2) ์ด๊ธฐํ์ ๋ฐ์ดํฐ ๋ก๋
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ ๋, ์ด๊ธฐํ์ ๋ฐ์ดํฐ ๋ก๋๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์ฑ์ ํ๋ณดํ๋ ์ค์ํ ๊ณผ์ ์
๋๋ค. ๋ฆฌ์กํธ์์๋ useEffect
๋ฅผ ํตํด ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง ๋ ๋ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ์ํ๋ฅผ ๊ด๋ฆฌํ์ง๋ง, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ๊ณ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ก์ง์ ๋ช
์์ ์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค. ์ด๊ธฐํ ์์
์ ์ ๋๋ก ์ํํ์ง ์์ผ๋ฉด, UI์ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ํ์๋๊ฑฐ๋ ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ก์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฒซ ํ๋ฉด์ ์ ๋๋ก ๋ ๋๋งํ๊ธฐ ์ํด ํ์์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋ฌผ ์ฌ์ง ์จ๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๊ธฐ๋ณธ ํญ(all)์ ๋ํ ์ฌ์ง ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ์ด๋ฅผ ์ํ์ ์ ์ฅํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ์ด๊ธฐํ ์์ ์ ๋ด๋นํ๋ init ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
const init = async () => {
try {
const initialPhotos = await request('all'); // ๊ธฐ๋ณธ ํญ์ ์ฌ์ง ๋ฐ์ดํฐ ์์ฒญ
this.setState({
...this.state, // ๊ธฐ์กด ์ํ ์ ์ง
photos: initialPhotos, // ์ด๊ธฐํ๋ ์ฌ์ง ๋ฐ์ดํฐ ์ ์ฅ
});
} catch (error) {
console.error('Error loading initial data:', error); // ์ค๋ฅ ์ฒ๋ฆฌ
}
};
init();
์์ ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ก๋๋ ๋ ์คํ๋๊ณ , ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ํ ์ด๋ฅผ ์ํ์ ์ ์ฅํ๊ณ , UI๋ ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ๋ฐ์ํ์ฌ ๊ธฐ๋ณธ ํญ์ ์ฌ์ง์ ๋ ๋๋งํฉ๋๋ค.
์ด ์ด๊ธฐํ ๋ก์ง์ ์ํ ๊ด๋ฆฌ์ ์ฒซ ๋จ์ถ๋ฅผ ์ ๋ผ์ฐ๋ ์์ ์ ๋๋ค. ์ํ๊ฐ ์ ํํ ์ค์ ๋์ง ์์ผ๋ฉด, ์ดํ ์ํ ๋ณ๊ฒฝ ๋ฐ UI ๊ฐฑ์ ๊ณผ์ ์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฆฌ์กํธ์ useEffect์ฒ๋ผ ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์ง๋ง, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ด๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํด์ผ ํ๋ค๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
3) ์ํ ๋ณ๊ฒฝ๊ณผ UI ๊ฐฑ์
๋ฆฌ์กํธ์์๋ ์ํ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฉด Virtual DOM์ ํ์ฉํด ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ํจ์จ์ ์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค. Virtual DOM์ ์ค์ DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ์ต์ํ์ผ๋ก ์ ์ฉํ๋๋ก ์ต์ ํ๋ ๋ฐฉ์์ผ๋ก, ๊ฐ๋ฐ์๊ฐ ์ง์ DOM ์กฐ์ ๋ก์ง์ ์์ฑํ์ง ์์๋ ๋ฉ๋๋ค. ํ์ง๋ง ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ด๋ฌํ ์๋ํ๊ฐ ์์ผ๋ฏ๋ก, ์ํ ๋ณ๊ฒฝ ์ ๋ช ์์ ์ผ๋ก DOM๊ณผ ์ํ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ก์ง์ ์์ฑํด์ผ ํฉ๋๋ค.
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ํ ๋ณ๊ฒฝ๊ณผ UI ๊ฐฑ์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด setState ๋ฉ์๋๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ์๋ก์ด ์ํ๋ฅผ ๋ฐ์ ๋ด๋ถ ์ํ๋ฅผ ๊ฐฑ์ ํ ๋ค, ์ํ ๋ณํ์ ๋ฐ๋ผ ํ์ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์๋๋ ์ด๋ฌํ ๊ณผ์ ์ ๋ณด์ฌ์ฃผ๋ ์์ ์ฝ๋์ ๋๋ค.
this.setState = (newState) => {
this.state = newState;
tabBar.setState(this.state.currentTab); // ํญ UI ๊ฐฑ์
content.setState(this.state.photos); // ์ฌ์ง UI ๊ฐฑ์
};
setState
๋ฉ์๋๋ ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ฉฐ, UI์ ์ํ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ ๊ฐ์ง ์์
์ ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํญ์ ๋ณ๊ฒฝํ๋ฉด currentTab
์ํ๊ฐ ์
๋ฐ์ดํธ๋๊ณ , ์ด์ ๋ฐ๋ผ photos
์ํ๋ ๋ณ๊ฒฝ๋ฉ๋๋ค. ์ด๋ ๊ฒ ๋ณ๊ฒฝ๋ ์ํ๋ ๊ฐ๊ฐ tabBar
์ content ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋์ด UI๊ฐ ์๋กญ๊ฒ ๋ ๋๋ง ๋ฉ๋๋ค. ๋ฆฌ์กํธ์์๋ ์ด๋ฌํ ์ํ ๋ณ๊ฒฝ๊ณผ UI ๊ฐฑ์ ๊ณผ์ ์ Virtual DOM๊ณผ Reconciliation ๋ฑ์ ํตํด ์๋ํํ์ง๋ง, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ด๋ฅผ ๋ช
์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ฆฌ์กํธ์ ๋น๊ตํ์ ๋, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ ๊ทผ ๋ฐฉ์์ ๋ ๋ง์ ์์ ์ ์๊ตฌํ์ง๋ง, ์ํ์ UI๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง์ ๋ํ ๋ช ํํ ์ดํด๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋์ ๊ฐ์ ๋ก์ง์ ์ํ์ UI๋ฅผ ์ฐ๊ฒฐํ๋ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ตํ๋ ๋ฐ ์์ฃผ ํจ๊ณผ์ ์ด๋ฉฐ, ์ด ๊ณผ์ ์ ํตํด ๋ฆฌ์กํธ์ ์ํ ๊ด๋ฆฌ์ UI ๊ฐฑ์ ๋ฉ์ปค๋์ฆ์ด ์ ๊ณตํ๋ ํธ๋ฆฌํจ๊ณผ ์ต์ ํ์ ๊ฐ์น๋ฅผ ๋ ๊น์ด ์ดํดํ ์ ์์ต๋๋ค.
4) ๋ค์ค ์ํ ๊ด๋ฆฌ
๋ฆฌ์กํธ์ useState
๋ ์ฌ๋ฌ ์ํ๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉด์๋, ์ํ ๊ฐ์ ์์กด์ฑ์ ์์ฐ์ค๋ฝ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋๋ฌผ ์ฌ์ง ์จ๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์์๋ currentTab
๊ณผ photos
๊ฐ ์๋ก ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์์ต๋๋ค.
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ํ๋ฅผ ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ๋ฉฐ, ์ํ ๊ฐ์ ์์กด์ฑ์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๋ช
์์ ์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค. currentTab
์ ์ฌ์ฉ์๊ฐ ์ ํํ ํญ์ ๋ํ๋ด๋ฉฐ, ์ด์ ๋ฐ๋ผ photos
์ํ๊ฐ ์
๋ฐ์ดํธ๋ฉ๋๋ค.

์๋ฅผ ๋ค๋ฉด, ์ฌ์ฉ์๊ฐ โํ๋คโ ํญ์ ํด๋ฆญํ๋ฉด, currentTab
์ โํ๋คโ๋ก ๋ณ๊ฒฝ๋๊ณ , ์ด ๊ฐ์ ๋ฐ๋ผ photos
์ํ๊ฐ ์๋ก์ด ๋ฐ์ดํฐ๋ก ๊ฐฑ์ ๋ฉ๋๋ค. ์ด๋ฌํ ์ํ ๊ฐ ์์กด์ฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์ํ ๊ฐฑ์ ๋ก์ง์ ๋ช
์์ ์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
const tabBar = new TabBar({
$app,
initialState: this.state.currentTab,
onClick: async (name) => {
const newPhotos = await request(name); // ์๋ก์ด ์ฌ์ง ๋ฐ์ดํฐ ์์ฒญ
this.setState({
...this.state,
currentTab: name,
photos: newPhotos,
});
},
});
์ ์ฝ๋๋ ํญ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ onClick
ํธ๋ค๋ฌ๋ฅผ ํธ์ถํ์ฌ currentTab
๊ณผ photos
์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ฉฐ, ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด setState
๋ฉ์๋๊ฐ ํธ์ถ๋๊ณ , ๋ณ๊ฒฝ๋ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Tabbar์ Content ์ปดํฌ๋ํธ๊ฐ ๊ฐฑ์ ๋ฉ๋๋ค.
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ ์ํ ๊ด๋ฆฌ์ ์ฅ์
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ํ ๊ด๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๊ฒฝํ์ ๋ฆฌ์กํธ์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํน์ ํ๋ ์์ํฌ๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๊ณ , ์ํ ๊ด๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ฒด๊ณ์ ์ผ๋ก ์ตํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ด ๊ณผ์ ์ ํตํด ๋จ์ํ ์ด๋ ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ์์ค์ ๋์ด, ์ํ ๊ด๋ฆฌ์ ๋ณธ์ง์ ๊น์ด ์ดํดํ๊ณ ์์ฉํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ ์ ์์ต๋๋ค.
1) ๋ฆฌ์กํธ ๋์ ์๋ฆฌ ์ดํด
๋ฆฌ์กํธ๋ ์ํ ๋ณ๊ฒฝ ์ Virtual DOM์ ํ์ฉํด ํ์ํ ๋ถ๋ถ๋ง์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ๋งค์ฐ ์ค์ํ ์์์ด๊ณ , ๋ฆฌ์กํธ์ ์ฃผ์ ๊ฐ์ ์ค ํ๋๋ผ๊ณ ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ๊ณผ์ ์ ์๋ํ๋ก๋ง ๊ฒฝํํ๋ค๋ฉด, ๊ทธ ๋ด๋ถ ์๋ฆฌ๋ฅผ ์์ ํ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค.
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ํ ๊ด๋ฆฌ๋ฅผ ์ง์ ๊ตฌํํด ๋ณด๋ฉด, ์ํ์ UI๊ฐ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๊ณ , ์ด๋ค ๋ฐฉ์์ผ๋ก UI๊ฐ ๊ฐฑ์ ๋๋์ง๋ฅผ ๋ช ํํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ์ํ ๋ณ๊ฒฝ ํ ํน์ DOM ์์๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํด์ผ ํ๋ฏ๋ก, ๋ฆฌ์กํธ๊ฐ ์ ๊ณตํ๋ ํธ๋ฆฌํจ๊ณผ ์ต์ ํ์ ์ค์์ฑ์ ์ค๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ํตํด ๋ฆฌ์กํธ์ ์ํ ๊ด๋ฆฌ์ ๋ ๋๋ง ์ต์ ํ ๋ฉ์ปค๋์ฆ์ ๋ ๊น์ด ์ดํดํ ์ ์์ต๋๋ค.
2) ํ๋ ์์ํฌ ์์ด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ธฐ๋ณธ๊ธฐ ๊ฐํ
๋ฆฌ์กํธ์ ๊ฐ์ ํ๋ ์์ํฌ๋ ์ํ ๊ด๋ฆฌ์ UI ๊ฐฑ์ ์ ์๋ํํ์ฌ ๊ฐ๋ฐ์ ํธ๋ฆฌํ๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ถ์ํ๋ ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์ ์ฌ์ฉ๋๋ค๋ฉด, ํ๋ ์์ํฌ์ ๊ณผ๋ํ๊ฒ ์์กด์ ์ธ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ํ์ด ์์ต๋๋ค.
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํด ์ํ๋ฅผ ์ ์ํ๊ณ , ์ํ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ UI ๊ฐฑ์ ๋ก์ง์ ์์ฑํ๋ ๊ณผ์ ์ ์ํ ๊ด๋ฆฌ์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํํํ ๋ค์ง๋ ๋ฐ ํจ๊ณผ์ ์ ๋๋ค. ์ด ๊ฒฝํ์ ๋ฆฌ์กํธ๋ฟ ์๋๋ผ Vue, Svelte ๋ฑ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ฅผ ๋ฐฐ์ธ ๋๋ ํฐ ๋์์ด ๋ฉ๋๋ค. ๋ํ ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ์ง ์๋ ์ํฉ์์๋ ์ ์ฐํ๊ฒ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ญ๋์ ๊ธธ๋ฌ์ค๋๋ค.
3) ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ์ฑ
๋ชจ๋ ํ๋ก์ ํธ๊ฐ ๋ฆฌ์กํธ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ํ์๋ก ํ์ง๋ ์์ต๋๋ค. ํนํ ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋, ํน์ ํ๊ฒฝ์์๋ ๋ฆฌ์กํธ์ ์ถ์ํ๋ ์ํ ๊ด๋ฆฌ ๋ฐฉ์์ด ์คํ๋ ค ๋ถํ์ํ ๋ณต์ก์ฑ์ ๋ถ๋ฌ์ฌ ์ ์์ฃ .
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉด, ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๋ก์ง์ ์์ ํ ์ปค์คํฐ๋ง์ด์งํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๊ท๋ชจ ํ๋ก์ ํธ์์๋ ์ํ ๊ด๋ฆฌ์ UI ์ ๋ฐ์ดํธ๋ฅผ ๋จ์ํํ์ฌ ์ฑ๋ฅ๊ณผ ๊ฐ๋ฐ ์๋๋ฅผ ๋ชจ๋ ์ต์ ํํ ์ ์๋๋ฐ์. ๋ฆฌ์กํธ์ ์ํ ๊ด๋ฆฌ ๋ฐฉ์์ด ์ ํฉํ์ง ์์ ํ๋ก์ ํธ ํ๊ฒฝ์์๋ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ ๋ฐฉ์์ด ๋ ์ ํฉํ ๋๋ ๋ง์ต๋๋ค.
๋ง์น๋ฉฐ
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด ์ํ ๊ด๋ฆฌ์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๋ฐฐ์ฐ๋ ๊ณผ์ ์ ๋จ์ํ ๋ฆฌ์กํธ๋ฅผ ๋์ฒดํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋๋ค. ์ด๋ ์ํ์ UI๋ฅผ ์ฐ๊ฒฐํ๋ ์๋ฆฌ๋ฅผ ๊น์ด ์ดํดํ๊ณ , ๊ฐ๋ฐ์๋ก์์ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ๊ฐํํ๋ ๋ฐ ์ค์ ์ ๋ ํ์ต ๊ณผ์ ์ ๋๋ค. ์ด๋ฌํ ๊ฒฝํ์ ๋ฆฌ์กํธ๋ฟ๋ง ์๋๋ผ, ๋ค๋ฅธ ํ๋ ์์ํฌ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฐ๋ ํฐ ๋์์ด ๋ฉ๋๋ค.
๊ฒฐ๊ตญ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ ์ํ ๊ด๋ฆฌ ํ์ต์ ๊ฐ๋ฐ์๋ค์๊ฒ ๋ ๋์ ์ค๊ณ๋ฅผ ๊ณ ๋ฏผํ๊ฒ ํ๊ณ , ๋ค์ํ ํ๊ฒฝ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ญ๋์ ํค์์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋จ์ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๊ฐ ์๋, ๋๊ตฌ์ ํ๊ณ๋ฅผ ๋์ด์ค ์ ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์๋๋ก ๋์์ค ๊ฒ๋๋ค.
<์ฐธ๊ณ >