๐ต ๊ฐ์ธ์ ์ผ๋ก ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๊ฒ ๊ฐ์ฅ ์ค์ํ ๋ฅ๋ ฅ ์ค ํ๋๊ฐ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ, ๋ชจ๋ํ ๋ผ๊ณ ์๊ฐํ๋ค!
์ปดํฌ๋ํธ๋ ๋ฆฌ์กํธ ์น์ ๊ตฌ์ฑํ๋ ๋จ์์ธ ๋งํผ ํ๊ฐ์ง์ ์ญํ ๋ง ํด์ผํ๋ค
๊ทธ๋ฌ๋ ๊ทธ๋ ๋ค๊ณ ํด์ ์ต๋ํ ์ชผ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฑ๋ฅ์ ๋ฐ๋์งํ์ง ์๋ค.
๋ชจ๋ํ์ ํต์ฌ์ ์ฌ์ฌ์ฉ์ฑ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๐โโ๏ธ ๊ทธ๋ ๋ค๋ฉด ์ ์ฌ์ฌ์ฉํ ๋ด์ฉ์ ์ปดํฌ๋ํธํ ํด์ฃผ์ด์ผ ํ ๊น?
๊ฐ์ฅ ๋จ์ ์ธ ์์๋ก ํ๋์ ์น์ฑ ๋ด์ ๋์ผํ ๋์์ธ์ ๋ฒํผ์ด ์ด๊ณณ ์ ๊ณณ์์ ํ ์คํธ๋ง ๋ฌ๋ฆฌํ์ฌ ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ, ํด๋น ์๋น์ค๊ฐ ๋ธ๋๋ฉ์ ๋ค์ํ๊ฒ ๋๋ฉด์ ๋์์ธ ์์คํ ๋ ๋ฌ๋ผ์ง๊ฒ ๋ ๊ฒฝ์ฐ, ์น ์ฑ ๋ด์ ๋ชจ๋ ๋ฒํผ์ ๋์์ธ๋ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ค.
์ด๋ ๋ฒํผ์ ์ปดํฌ๋ํธํํ์ง ์๊ณ ๋งค๋ฒ ๊ฐ๊ธฐ ๋ค๋ฅธ element๋ก ์์ฑํด๋์๋ค๋ฉด, ๊ทธ ๋ชจ๋ ๋ฒํผ์ ์ฐพ์๋ค๋๋ฉฐ ๊ฐ๊ฐ ๋์์ธ์ ๋ณ๊ฒฝํด์ฃผ์ด์ผ ํ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋, ๋ง์ฝ ํ๋์ ๋ฒํผ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ ์ด๊ณณ ์ ๊ณณ์์ ์ฌ์ฌ์ฉํ๊ณ ์์๋ค๋ฉด,
๊ทธ ํ๋์ ์ปดํฌ๋ํธ์ ์คํ์ผ๋ง ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋์์ ์น์ฑ ๋ด์ ๋ชจ๋ ๋ฒํผ์ ์คํ์ผ์ ๊น๋ํ ์ ๋ฐ์ดํธ์์ผ์ค ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด, ์ปดํฌ๋ํธ๋ ํ๊ฐ์ง์ ์ผ์ ๋ฐ๋ณต์ ์ผ๋ก ํ๋ ์น๊ตฌ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ๋ฌถ์ด๋ ๋ชจ๋์ด๋ค !
์ด๋ฌํ ๋ฐฉ์์ Computer Science ์์๋ โ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌโ, Separation of Concerns (SoC) ๋์์ธ ์์น์ด๋ผ๊ณ ํ๋ค.
์์ ๋ด์ฉ์์ ์ด์ผ๊ธฐํ ๊ฒ์ ๋ฐ๋ผ,
๊ฒฐ๊ตญ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ์ ๊ธฐ์ค์ ๋ค์๊ณผ ๊ฐ๋ค.
โ๏ธย ํ๊ฐ์ง์ ์ญํ ์ ํ๋๊ฐ?
โ๏ธย ๋ฐ๋ณต ์ฌ์ฉ๋๊ณ ์๊ฑฐ๋, ๋ฐ๋ณต ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋๊ฐ?
โ๏ธย UI์ ๊ด๋ จ๋ ์ผ์ ํ๋๊ฐ? **๊ธฐ๋ฅ(๋ก์ง)**๊ณผ ๊ด๋ จ๋ ์ผ์ ํ๋๊ฐ?
์์ ๊ธฐ์ค์ ๋ฐ๋ผ ๋์ ์ปดํฌ๋ํธ๊ฐ ๋ ๋ถ๋ฆฌ๋ ์ ์๋ ๊ธธ์ด ์๋์ง ๋์์์ด ๊ณ ๋ฏผํ๋ฉฐ
๋ชจ๋ํํ๊ณ ์ ๋ ธ๋ ฅํด๋ณด์ ! !
- ์ปดํฌ๋ํธ ๊ฐ์ ์ด๋๋๋ย
props
์ ๋ฌ๋ฆฌ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๊ด๋ฆฌ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด - ์ดํ๋ฆฌ์ผ์ด์ ์ ํ๋ฉด ๋ ๋๋ง์ ์ํฅ์ ๋ผ์น๋ค
- ์ฌ์ฉ์์ ์ธํฐ๋์ ์ ํตํดย ๋์ ์ผ๋ก ๋ณํ๋ย ๋ฐ์ดํฐ
- ์ง์ญ ์ํ : ์ปดํฌ๋ํธ ๋ด๋ถ์์๋ง ๊ด๋ฆฌ๋๋ ์ํ
- ex) Input์ ํตํด ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ
- ์ปดํฌ๋ํธ ๊ฐ ์ํ : ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๋๋๋ค๋ฉฐ ๊ด๋ฆฌ๋๋ ์ํ
- ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก prop๋ฅผ ํตํด ์ ๋ฌํ๋ค โ ์ฐ์๋ ๊ฒฝ์ฐ โProp Drillingโ
- ex) Modal์ฐฝ
- ์ ์ญ ์ํ : ํ๋ก์ ํธ ์ ์ฒด์ ์ํฅ์ ๋ผ์น๋ ์ํ
Client State | Server State | |
---|---|---|
์์น | ํด๋ผ์ด์ธํธ์ ์ ์ฅ๋ ๋ฐ์ดํฐ | ์๋ฒ๋ ์ธ๋ถ ๋ฐ์ดํฐ ์์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ |
์ ๊ทผ์ฑ | ํด๋ผ์ด์ธํธ๋ง ์ ๊ทผ ๊ฐ๋ฅ | ์ ๊ทผ ๊ถํ์ด ์๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ ์ ๊ทผ ๊ฐ๋ฅ |
๋ฐ์ดํฐ ๊ด๋ฆฌ | ํด๋ผ์ด์ธํธ์์ ๊ด๋ฆฌ (Redux, Recoil ๋ฑ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ) |
์๋ฒ์์ ๊ด๋ฆฌ (๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ) |
์ง์์ฑ | ์ธ์ ๊ฐ์ ํ์ฐ์ ์ผ๋ก ์ง์๋์ง ์์ | ์ผ๋ฐ์ ์ผ๋ก ์ธ์ ๊ฐ์ ์ง์์ฑ ์ ์ง |
๋คํธ์ํฌ ์์ฒญ | ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ค๋ฉด ๋คํธ์ํฌ ์์ฒญ์ด ํ์ํ ์ ์์ | ๋ฐ์ดํฐ ์ ๊ทผ ๋๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํด ๋คํธ์ํฌ ์์ฒญ์ด ํ์ํ ์ ์์ |
๋ณด์ | ํด๋ผ์ด์ธํธ๊ฐ ์ก์ธ์คํ ์ ์๊ณ ๋ณด์ ์์ค์ด ๋ฎ์ | ์ธ์ฆ ๋ฐ ์ํธํ๋ก ๋ณดํธํ ์ ์์ผ๋ฏ๋ก ๋ ์์ |
์ฑ๋ฅ | server state์ ๋นํด ์๋ ๋น ๋ฆ | client state์ ๋นํด ์๋ ๋๋ฆผ |
ํ์ฅ์ฑ | ํด๋ผ์ด์ธํธ ๊ธฐ๊ธฐ ์ฉ๋์ด ์ ํ์ ์ด์ด์ ํ์ฅ์ฑ์ด ๋ค์ ๋จ์ด์ง | ์ ์ฉ ์๋ฒ๋ ๋ฐ์ดํฐ ์์ค๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ฉ๋์ด ์ปค์ ํ์ฅ์ฑ์ด ๋น๊ต์ ๋์ |
์์ | ์ปดํฌ๋ํธ state, Redux state, ๋ธ๋ผ์ฐ์ ์ฟ ํค | DB ๋ ์ฝ๋, API ์๋ต, ์๋ฒ ์ธ์ ๋ฐ์ดํฐ |
- props๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๊ธฐ ์ํด์ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์น๋ ๋ฐฉ์์ ๋งํ๋ค.
๋ถ๋ชจ ์ปดํฌ๋ํธ โ ์ค๊ฐ ์ปดํฌ๋ํธ1 โ ์ค๊ฐ ์ปดํฌ๋ํธ 2โ โฆ โ ์ต์ข ์ปดํฌ๋ํธ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ต์ข ์ปดํฌ๋ํธ๋ก props๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ค๊ฐ ์ปดํฌ๋ํธ๋ค์ ๊ฑฐ์น๋ค.
- ์ด depth๊ฐ ๊น์ด์ง ์๋ก ์ํ๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ค์์ง๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด props drilling์ ๋ฐฉ๋ฒ์ผ๋ก props๋ฅผ ์ ๋ฌํ๊ธฐ๋ณด๋ค props๋ค์ด ๋ถํ์ํ ์ปดํฌ๋ํธ๋ค์ ๊ฑฐ์น์ง ์๋๋ก ์ค๊ณํ๊ฑฐ๋, ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์ ํ์ํ๋ค.
์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋! ํด๋น ์ํ๋ฅผ ๊ด๋ฆฌํด์ฃผ์ด์ผ ํ๋ค.
๐โโ๏ธ ์?
์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋, ํด๋น ๋ฐ์ดํฐ์ ์ถ์ฒ๊ฐ ๋์ผํด์ผ ํ๋ค. ๊ทธ๋์ผ ์๋ก์ ๋ณํ์ ๋์ ์ผ๋ก ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ **์ํ์ ์ผ๊ด์ฑ (=โ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑโ)**์ ์ ์ง์ผ์ผ ํ๋ค.
**โSingle Source of Truthโ**์ด๋ผ๋ ๋ฐฉ๋ฒ๋ก ์ด ์ด๋ฌํ ์ํ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ๋ฑ์ฅํ ๋ฐฉ๋ฒ๋ก ์ธ๋ฐ, ๋ง๊ทธ๋๋ก ์ ๋ขฐํ ์ ์๋ย ๋จ์ผ ์ถ์ฒ๋ฅผ ๋งํ๋ค.
์ด ๋ฐฉ๋ฒ๋ก ์ด React๊ฐ ํํ ๋ฐฉ๋ฒ๋ก ์ผ๋ก, ๊ฒฐ๊ตญ React์์ ์ํ๊ด๋ฆฌ๊ฐ ํ์ํ ์ด์ ๋ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ์ํด์, ์๋ก ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ๋ถํฌ๋์ด์๋ ํ๋์ ๋ฐ์ดํฐ๊ฐ ์๋ก ์ผ์นํ ์ ์๋๋ก ๊ด๋ฆฌํด์ฃผ๊ธฐ ์ํจ์ด๋ค.
Props Driling์ด ์ผ์ด๋์ง ์๋๋ก, ์ํ๊ฐ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ๋ ์ ์๋๋ก ํจ์จ์ ์ธ ์ค๊ณ๋ฅผ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ์ง๋ง,
๋ง์ฝ ์ต์ ์ ๋คํด ์ค๊ณํด๋ ์ด์ฉ ์ ์์ด ๋ถํ์ํ Props Drilling์ด ๋ง์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํ์ฉํ๋ ๊ฒ๋ ์ข๋ค.
์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ Client State / Server State์ ๋ฐ๋ผ ๋ถ๋ฅํ ์ ์๋ค.
๋ํ์ ์ธ ๋ช๊ฐ์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ์์๋ณด์.
๐ก Client State Library - Context API
- ๊ตฌ์ฑ์์
- Context : ์ ์ญ ์ํ ์ ์ฅ์.
- Context์ Provider์ Consumer๊ฐ ์ ์ฅ๋์ด์์
- Consumer์๋ Context๋ฅผ ํตํด ์ ๊ทผ ๊ฐ๋ฅ
- Provider : ์ ์ญ ์ํ ์ ๊ณต์.
- ์ ์ฅ์์ธ Context์ ์ํ๋ฅผ ์ ๊ณตํด์ฃผ๋ ์ญํ ์ ํจ
- ์ํ๋ฅผ ์ ๊ณต๋ฐ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ๋ Provider ํ์์ ์์ด์ผํจ
- ๋ฐ๋ผ์ ์ ์ญ ์ํ๋ก ์ธ ๊ฒฝ์ฐ, Provider๋ App.jsx๊ฐ์ ๋ฃจํธ ์ปดํฌ๋ํธ๊ฐ ๋๋ค.
- Consumer : ์ ์ญ ์ํ ์ฌ์ฉ์
- Context : ์ ์ญ ์ํ ์ ์ฅ์.
- ๋จ์ :
- ๋ฒ์๋ฅผ ์ ์ ์ํด์ฃผ์ง ์์ผ๋ฉด ๋ถํ์ํ ๋ ๋๋ง์ ์ผ์ผํจ๋ค
๐ก Client State Library - Redux
- ์ค์ ์ง์ค์ Storage์ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ํ Reducer๋ฅผ ์ฌ์ฉํจ
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฐ๋ฅธ๋ค.
- ์ฅ์ :
- ์ค๋๋ ๋งํผ ํํํ ์ปค๋ฎค๋ํฐ์ ๊ฐ๋ฐ์ ํ ์กด์ฌ
- ๊ฐ๋ฐ์ ์ฒ์ ์์ํ ๋ ์ฐธ๊ณ ํ ์ ์๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๊ต์ฅํ ๋ค์ํ ๋ฟ๋ง ์๋๋ผ, ๊ฐ๋ฐ ์ค์ ์์ด์๋ ๋ฒ๊ทธ๊ฐ ์๊ธธ ๊ฒฝ์ฐ ํด๊ฒฐํ๊ธฐ๊ฐ ์ฌ์
- ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ ๋น๋๊ธฐ, ๋ก๊ทธ ์์ ๋ฑ์ ์ฒ๋ฆฌํ ์ ์๋๋ฐ ์ด ๋ Redux๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฐ๋ผ์ Reducer ๋ฑ์ ๋จ์ ํ ์คํธ๊ฐ ๋น๊ต์ ์ฌ์
- ๋จ์ : ๋๋ถ๋ถ ๊ตฌ์กฐ๊ฐ ๋๋ฌด ๋ณต์กํด์ ๋ฌธ์ ๊ฐ ์๊น
- ๊ฐ๋จํ ์น์ฑ์ ๋ง๋ค ๋์๋ Action, Reducer, Action Creator ๋ฑ์ ์ฝ๋๋ฅผ ๋ชจ๋ ์์ฑํด์ผ ํจ.
- Recoil, MobX์๋ ๋ฌ๋ฆฌ State๊ฐ ๋ณ๊ฒฝ ๋ ๋ Component๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๋ฐ์ํ ๋ฉ์ปค๋์ฆ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ๋์ง ์์์ React์ ์์ฒด ๋ฉ์ปคํฐ์ฆ์ ํ์ฉํ๊ฑฐ๋ ์ถ๊ฐ์ ์ธ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํจ
๐ก Client State Library - Recoil
- ๋น๊ต์ ์ต๊ทผ์ ๋์จ ์๋ก์ด ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Facebook์ฌ์์ ๊ฐ๋ฐ
- ๊ฐ์ฅ React์ค๋ฌ์ด ์ํ๊ด๋ฆฌ๋ผ๋ ์ฒ ํ์ ๊ฐ๊ณ ์์
- ์ฅ์ :
- Redux, MobX์ ๋นํด ๋ ๊ฐ๋จํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์ ์ด์ฌ์๊ฐ ์์ํ๊ธฐ์ ์ ๋นํ๋ฉฐ, ์์ ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ๋ฐ ๊ณผ๋ํ ๋ณด์ผ๋ฌ ํ๋ ์ดํธ๊ฐ ํ์ํ์ง ์์
- component๊ฐ ๋ ๋๋ง ๋๋ ์๊ธฐ, ์ํ ๋ฑ์ ์ธ๋ฐํ๊ฒ ์ ์ด ๊ฐ๋ฅ (์ฑ๋ฅ ์ต์ ํ ๋ฑ์๋ ํ์ฉ ๊ฐ๋ฅ)
- Redux์๋ ๋ฌ๋ฆฌ Reactive ๋ฉ์ปค๋์ฆ์ ํ์ฌํ๊ณ ์๊ธฐ์, ๋์ ์ธ ๊ธฐ๋ฅ์ ์กฐ๊ธ ๋ ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
- ๋จ์ :
- ์ต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค ๋ณด๋, ์ฌ์ฉ์ ์ปค๋ฎค๋ํฐ๊ฐ ๋น๊ต์ ๋น์ฝํจ โ ์ด์๊ฐ ์๊ฒผ์ ๋, ํ๋ก ํด๊ฒฐํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์๋.
- Recoil์ ์ํ๊ด๋ฆฌ ์์ฒด๊ฐ ๊ต์ฅํ ์ธ๋ถํ ๋์ด ์๊ธฐ์ ์ด์ฌ์๊ฐ ์์ํ๊ธฐ์ ์ฝ๋๋ผ๋, ๋๋ฒ๊น ํ๊ฑฐ๋ ํ ์คํธ๋ฅผ ์งํํ๊ธฐ์ ์ด๋ ค์ธ ์๋ ์์ต๋๋ค.
๐ก Client State Library - MobX
- Redux์ ์ฌ๋ฌ ์ ์ ๋ณด์ํ์ฌ ๋์จ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- Redux๋ณด๋ค ์กฐ๊ธ ๋ ๊ฐ์ฒด ์งํฅ์ ์ด๋ฉฐ, Immutable.js ์ ๊ฐ์ ๋ถ๋ณ์ฑ์ ์ ์งํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตณ์ด ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ ํน์ง
- ์ฅ์ :
- Redux์ ๋นํด ์ ์ฒด์ ์ผ๋ก ์กฐ๊ธ ๋ ์ฌ์ด ๋ฌ๋์ปค๋ธ๋ฅผ ๊ฐ์ง
- ๊ฐ์ฒด ์งํฅ์ ์ด๊ณ ์บก์ํ๋ฅผ ์ง์ํ๊ธฐ์ ๊ฐ๋ฐ์ ์นํ์ ์ธ ํธ
- Redux์์ ์ ๊ณตํ์ง ์๋ ๋ฐ์ํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๊ธฐ์ ์กฐ๊ธ ๋ ์ฝ๊ฒ ๋์ ์น์ฑ ์ ์ ๊ฐ๋ฅ
- ๋จ์ :
- ์น์ฑ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด์ ๋ก์ง์ด MobX์ ์๋ ์ ๋ฐ์ดํธ์ ์์กดํ๊ธฐ์ ๋๋ฒ๊น ์ด ์กฐ๊ธ ๋ ์ด๋ ค์์ง ์ ์์
- Redux ๋งํผ ์ปค๋ฎค๋ํฐ๊ฐ ํฌ์ง ์์
- Validation ๊ตฌํ์ ์์ด ์ฝ๋๊ฐ ์กฐ๊ธ ๋ฒ์ก์ค๋ฝ๋ค๊ณ ์๋ ค์ ธ ์์
๐ก Server State Library - React Query
React์์ ๋ฐ์ดํฐ fetching
๊ณผ ์บ์ฑ ํ๋ก์ธ์ค
๋ฅผ ๊ฐ์ํํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ์ธ๋ถ(API ๋ฑ)๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ fetching ๋ฐ ์ ๋ฐ์ดํธ ๊ณผ์ ๊ฐ์ํ
- API ์์ฒญ์ ๋ก๋ฉ ๋ฐ ์ค๋ฅ ์ํ ๊ด๋ฆฌ
- ์บ์ฑ ์๋ ๊ด๋ฆฌ
Client์์ API์ ํต์ ์ ํ๊ธฐ ์ํด์๋ ์ถ๊ฐ์ ์ผ๋ก useEffect, useState๋ฅผ ํจ๊ป ์ฐ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ fetching ํด์๋ค.
ํ์ง๋ง React Query๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ํ ๋ค์ ํ์์ฑ์ด ์ฌ๋ผ์ง๋ค.
React Query์ ๋ํด ์์ธํ ์์๋ณด์ !
โ๏ธ React Query ์ฃผ์ ๊ฐ๋
Query
- API ์๋ํฌ์ธํธ, DB ๋ฑ์ ์๊ฒฉ ๋ฐ์ดํฐ ์์ค๋ก๋ถํฐ ๋ฐ์ดํฐ ์์ฒญ
- useQuery ํ ์ฌ์ฉ
Mutation
- ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๋ฐ์ดํธ
- useMutation ํ ์ฌ์ฉ
Query Caching
- Query ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
Query Invalidation
- ์ฟผ๋ฆฌ๋ฅผ ์ค๋๋ ์ํ๋ก ์ฌ๊ฒจ ๋ฌดํจํ
โ๏ธ useQuery ํ
๋ฐ์ดํฐ Fetching ์ฉ
API ์๋ํฌ์ธํธ๋ DB์์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ์ค๋๋ก ์๋ฒ์ ์์ฒญํ๋ ๊ฒ
useQuery๋ ๊ธฐ๋ณธ์ ์ผ๋ก
- ์ปดํฌ๋ํธ ์ต์ด mount ์์ ๋ฐ์ดํฐ๋ฅผ fetchingํด์ค๊ณ ,
- ์ดํ์ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ์ ๋ํด์๋ ์๋ ์คํ๋์ง ์๋๋ค. (๋ฐ์ดํฐ refetching ์ํด์ค)
โ๏ธ useMutation ํ
API ์๋ํฌ์ธํธ๋ DB์ ๋ฐ์ดํฐ๋ฅผ ์๋ก ์์ฑ, ์์ , ์ญ์
โ๏ธ Query Caching
์๊ฒฉ ์๋ฒ์ ํต์ ํ๋๋ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋จ์ถํ๊ณ ์,
์ฌ๋ฌ๋ฒ ๋ถ๋ฌ์ฌ ๋ฐ์ดํฐ๋ ์บ์์ ์ ์ฅํ์ฌ ๋ฐ๋ณตํด์ ํ์๋ก ํ ๊ฒฝ์ฐ ์๊ฒฉ ์๋ฒ๊ฐ ์๋ ์บ์์์ ๋น ๋ฅด๊ฒ ๊ฐ์ ธ์ฌ ์ ์๋ ๋ฐฉ์
useQuery ํ
์ฌ์ฉ ์, ์ง์ ํ๋ ๊ณ ์ ํค
๋ฐ์ ๋ฐํ๋ ๋ฐ์ดํฐ๊ฐ ์บ์ฑ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ์บ์ ๋ฐ์ดํฐ๋ ์ค๋๋(stale) ์ํ๋ก ๊ธฐ๋ก๋๋ค.
โ๏ธ Query Invalidation
์ง์ ํด์ค staleTime
๊ณผ ๋ฌด๊ดํ๊ฒ ์ฆ์ ๋ฐ์ดํฐ๋ฅผ stale ์ํ๋ก ์ฒ๋ฆฌํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์๋ฅผ ๋ค์ด, API์ POST ์์ฒญ์ ๋ณด๋ด ๋ฐ์ดํฐ ๊ฐ์ ์ ๋ฐ์ดํธํ ๋์, API ์๋ํฌ์ธํธ์ ์๋ ๋ฐ์ดํฐ์ ๊ฐ์ด ์บ์์ ์ ์ฅ๋์ด์๋ ๊ฐ๋ณด๋ค ๋ ์ต์ ์ํ๊ฐ ๋๊ณ , ์บ์์ ์ ์ฅ๋์ด์๋ ๋ฐ์ดํฐ๋ ๊ณง๋ฐ๋ก outdatedํ ๊ฐ์ด ๋์ด๋ฒ๋ฆฐ๋ค. ์ด๋ด ๋์ ์ฆ์ ์บ์ ๋ฐ์ดํฐ๋ฅผ stale ์ํ๋ก ์ฒ๋ฆฌํด์ค์ผ ํ๋ค.
React Query์ QueryClient ๊ฐ์ฒด์ invalidateQueries ๋ฉ์๋ ํ์ฉ
- ๋ชจ๋ ์ฟผ๋ฆฌ, ํน์ ๊ณ ์ ํค๋ฅผ ํตํด ํน์ ์ฟผ๋ฆฌ๋ฅผ stale ์ํ๋ก ์ฒ๋ฆฌํด์ฃผ๋ ์ญํ
๋ ๋๋ง์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํจ์ ๊ฒฐ๊ตญ ์ฑ๋ฅ ์ต์ ํ์ ์ง๊ฒฐ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ํ์ํ๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ๊ณ ๋ คํ์ฌ ์ฐ๋ฆฌ์ ํ๋ก์ ํธ๋ฅผ ์ง๋์ง๋ํ์ง ์๋๋ก ๋ง๋ค์ด์ฃผ์!
โ๏ธ useMemo
- useMemo๋ ์ข ์ ๋ณ์๋ค์ด ๋ณํ์ง ์์ผ๋ฉด ํจ์๋ฅผ ๊ตณ์ด ๋ค์ ํธ์ถํ์ง ์๊ณ ์ด์ ์ ๋ฐํํ ์ฐธ์กฐ๊ฐ์ ์ฌ์ฌ์ฉ ํ๋ค.
- ์ฆ, ํจ์ ํธ์ถ ์๊ฐ๋ ์ธ์ด๋ธํ ์ ์๊ณ ๊ฐ์ ๊ฐ์ props๋ก ๋ฐ๋ ํ์ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง๋ ๋ฐฉ์งํ ์ ์๋ค.
โ๏ธ React.memo ์ปดํฌ๋ํธ ๋ฉ๋ชจ์ด์ ์ด์
- React hook์ด ์๋๋ผ์ ํด๋์คํ ์ปดํฌ๋ํธ์์๋ ์ฌ์ฉํ ์ ์๋ค.
- React.memo๋ฅผ ํตํด ์ปดํฌ๋ํธ์ props๊ฐ ๋ฐ๋์ง ์์๋ค๋ฉด, ๋ฆฌ๋ ๋๋งํ์ง ์๋๋ก ์ค์ ํ์ฌ ํจ์ํ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง ์ฑ๋ฅ์ ์ต์ ํ ํด์ค ์ ์๋ค.
- ์ฝ๋ฐฑํจ์๋ฅผ ์ด์ฉํด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ํ๋จํ ์๋ ์๋ค
โ๏ธ useCallback
- useMemo๊ฐ ๋ฆฌํด๋๋ ๊ฐ์ memoize ์์ผ์ฃผ์๋๋ฐ, useMemo์ ๋น์ทํ useCallback์ย ํจ์ ์ ์ธ์ memoize ํ๋๋ฐ ์ฌ์ฉ๋๋ค
- useCallback์ผ๋ก ํจ์๋ฅผ ์ ์ธํด์ฃผ๋ฉด, ์ข ์ ๋ณ์๋ค์ด ๋ณํ์ง ์๋ ์ด์ ๊ตณ์ด ํจ์๋ฅผ ์ฌ์์ฑํ์ง ์๊ณ ์ด์ ์ ์๋ ์ฐธ์กฐ ๋ณ์๋ฅผ ๊ทธ๋๋ก ํ์ ์ปดํฌ๋ํธ์ props๋ก ์ ๋ฌํ์ฌ, ํ์ ์ปดํฌ๋ํธ๋ props๊ฐ ๋ณ๊ฒฝ๋์ง ์์๋ค๊ณ ์ธ์งํ๊ฒ ๋์ด ํ์ ์ปดํฌ๋ํธ์ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ ์ ์๋ค.
โ๏ธ ์์ ์ปดํฌ๋ํธ์ props๋ก ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ค ๊ฒฝ์ฐ ๋ณํํ์ง๋ง๊ณ ๋๊ฒจ์ฃผ๊ธฐ
- props์ ๊ฐ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋๊ฒจ์ฃผ๋ ๊ฒฝ์ฐ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๊ฐ props๋ก ๋ค์ด๊ฐ๋ฏ๋ก ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋ ๋๋ง๋ค ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ์์ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋๋ค.
- props๋ก ์ ๋ฌํ ๊ฐ์ฒด๊ฐ ๋์ผํ ๊ฐ์ด์ด๋ ์๋ก ์์ฑ๋ ๊ฐ์ฒด๋ ์ด์ ๊ฐ์ฒด์ ๋ค๋ฅธ ์ฐธ์กฐ ์ฃผ์๋ฅผ ๊ฐ์ง ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์์ ์ปดํฌ๋ํธ๋ ๋ฉ๋ชจ์ด์ ์ด์ ์ด ๋์ง์๋๋ค.
- ์์ฑ์ ํจ์๋ ๊ฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ํ์ ์ปดํฌ๋ํธ๋ก ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ด ์๋, state๋ฅผ ๊ทธ๋๋ก ํ์์ปดํฌ๋ํธ์ ๋๊ฒจ์ฃผ์ด ํ์ํ ๋ฐ์ดํฐ ๊ฐ๊ณต์ ๊ทธ ํ์์ปดํฌ๋ํธ์์ ํด์ฃผ๋ ๊ฒ์ด ์ข๋ค.
โ๏ธ ์ปดํฌ๋ํธ๋ฅผ ๋งคํํ ๋์๋ key๊ฐ์ผ๋ก index๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
- ๋ฆฌ์กํธ์์ ๋งคํ์ ํ ๋ ๋ฐ๋์ ๊ณ ์ key๋ฅผ ๋ถ์ฌํ๋๋ก ๊ฐ์ ํ๊ณ ์๋๋ฐ, ๋ฐฐ์ด์ index๊ฐ์ผ๋ก key๊ฐ์ ๋ถ์ฌํ๋ฉด ์ข์ง ์๋ค.
- ์๋ํ๋ฉด, ์ด๋ค ๋ฐฐ์ด์ ์ค๊ฐ์ ์ด๋ค ์์๊ฐ ์ฝ์ ๋ ๋ ๊ทธ ์ค๊ฐ ์ดํ์ ์์นํ ์์๋ค์ ์ ๋ถ index๊ฐ ๋ณ๊ฒฝ๋๋ค.
- ์ด๋ก ์ธํด key๊ฐ์ด ๋ณ๊ฒฝ๋์ด React๋ key๊ฐ ๋์ผ ํ ๊ฒฝ์ฐ, ๋์ผํ DOM Element๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๋ํ, ๋ฐ์ดํฐ๊ฐ key์ ๋งค์น๊ฐ ์๋์ด ์๋ก ๊ผฌ์ด๋ ๋ถ์์ฉ๋ ๋ฐ์ํ๋ค.
โ๏ธ useState์ ํจ์ํ ์ ๋ฐ์ดํธ
-
setState๋ฅผ ์ฌ์ฉํ ๋ ์๋ก์ด ์ํ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ๋ ๋์ , ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ด๋ป๊ฒ ํ ์ง ์ ์ํด ์ฃผ๋ ์ ๋ฐ์ดํธ ํจ์๋ฅผ ๋ฃ์ ์๋ ์๋๋ฐ, ์ด๋ ๊ฒ ํ๋ฉด useCallback์ ์ฌ์ฉํ ๋ ๋ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ๋ ๋ฐฐ์ด์ ๊ฐ์ ๋ฃ์ด์ฃผ์ง ์์๋ ๋๋ค.
// ์์) ์ญ์ ํจ์ const onRemove = useCallback( (id) => { setTodos(todos.filter((todo) => todo.id !== id)); }, [todos] ); // ์์) ํจ์ํ ์ ๋ฐ์ดํธ ํ const onRemove = useCallback((id) => { setTodos((todos) => todos.filter((todo) => todo.id !== id)); }, []);
โ๏ธ Input์ onChange ์ต์ ํ
- ๋ณดํต input ํ๊ทธ์ onChange ์ด๋ฒคํธ๋ฅผ ์ค๋ ํ์ดํ์ ํ ๋๋ง๋ค ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋์ด, ์ต์ ํ ๋ฐฉ๋ฒ์ ๋ง์ด ์ฐพ๊ณคํ๋ค.
- lodash ๋ผ๊ณ ์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ๊ธฐ๋ ํ๋๋ฐ, ์๋ ์ฝ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฐ์ง ์๊ณ ์ต์ ํ ์ํฌ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
// ์์) ์ต์ ํ ์ (X)
//UserList.jsx
function UserList() {
{...}
return (
<div>
<input
type="text"
value={text}
placeholder="์๋ฌด ๋ด์ฉ์ด๋ ์
๋ ฅํ์ธ์."
onChange={(event) => setText(event.target.value)}
/>
{...}
</div>
);
}
export default UserList;
// ์์) ์ต์ ํ ํ(O)
//UserList.jsx
function UserList() {
{...}
return (
<div>
<input
ref={searchRef}
type="text"
placeholder="์๋ฌด ๋ด์ฉ์ด๋ ์
๋ ฅํ์ธ์."
onKeyUp={() => {
let searchQuery = searchRef.current.value.toLowerCase();
setTimeout(() => {
if (searchQuery === searchRef.current.value.toLowerCase()) {
setText(searchQuery);
}
}, 400);
}}
/>
{...}
</div>
);
}
export default UserList;