๊ฐ์
๋ฏธ์ | ๊ธฐ๊ฐ | Repository | PR & Review | github pages | storybook |
---|---|---|---|---|---|
์ฅ๋ฐ๊ตฌ๋ 1๋จ๊ณ | 23-05-23 - 23-05-26 | Repo | PR & Review | ๐ ์ฅ๋ฐ๊ตฌ๋ | ๐ ์คํ ๋ฆฌ๋ถ |
๋ฏธ์ ํ๊ณ
๋ฒ์จ ๋ ๋ฒจ 2์ ๋ง์ง๋ง ๋ฏธ์ ์ด๋ค. ๋ ๋ฒจ 2์ ๋ง์ง๋ง ๋ฏธ์ ์ ๋ฐ๋ก ์ด์ ๋ฏธ์ ์ด์๋ ์ฅ๋ฐ๊ตฌ๋ ๋ฏธ์ ์ ์ฐ์ฅ์ ์ด๋ค. ์ง๊ธ๊น์ง ์๋ฒ ์์ด mock ๋ฐ์ดํฐ๋ก ๊ฐ๋ฐ์ ํ๋ค๋ฉด, ์ฅ๋ฐ๊ตฌ๋ ํ์ ๋ฏธ์ ์ ๋ฐฑ์๋ ํฌ๋ฃจ์ ํจ๊ป ํ์ ์ ํ๋ฉด์ ์๋ฒ๋ฅผ ์ฐ๋์ ํด์ผ ํ๋ค.
๋ฐ๋ก ์ด์ ๋ฏธ์ ์์ MSW๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ API ํต์ ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ํ๊ฒฝ์ ๋ง๋ค์ด ๋๋ฉด์ ๊ฐ๋ฐ์ ํ์๋ค. ๋๋ฌธ์ ์๋ฒ๋ง ์ ์์ฑ์ด ๋๋ค๋ฉด ํฐ ๋ฌด๋ฆฌ ์์ด ์๋ฒ๋ฅผ ์ฐ๋์ ํ ์ ์์๋ค. ๋ก์ปฌ์์๋ง ํ์ธํ๋ ๊ฒ์ด ์๊ตฌ ์ฌํญ์ด์๋๋ฐ, ํจ๊ป ํ์ ์ ํ๋ ๋ฐฑ์๋ ํฌ๋ฃจ์ธ ๋ฒ ๋ฒ ์ ์๋จ์ด ์๋ฒ๋ฅผ ๋ฐฐํฌ๋ฅผ ํด์ฃผ์ด์ ์ค์ ๋ฐฐํฌ ํ์ด์ง์์๋ ์๋ฒ๋ฅผ ์ฐ๋ํ ์ ์์๋ค. ์๋ก ๋ ๋จ์ด์ ธ ์์ง๋ง API๋ก ์ฐ๊ฒฐ์ด ๋๋ ๋์ฑ ์ฌ๋ฐ๊ฒ ๋ฏธ์ ์ ์งํํ ์ ์์๋ค.
์ฅ๋ฐ๊ตฌ๋ ํ์ ๋ฏธ์ ์ 1๋จ๊ณ ์๊ตฌ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ํด๋ผ์ด์ธํธ
- ์๋ฒ ์ฐ๋์ ํตํด ์ํ ๋ชฉ๋ก์ ๋ณด์ฌ์ค๋ค.
2. ์ฌ์ฉ์ ๋ณ ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ์ด ์ ์์ ์ผ๋ก ๋์ํ๊ฒ ๋ง๋ ๋ค.
- ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์์ดํ
๋ชฉ๋ก์ ํ์ธํ ์ ์๋ค. (์ฅ๋ฐ๊ตฌ๋ ์์ดํ
๋ชฉ๋ก ์กฐํ)
- ์ํ์ ์ฅ๋ฐ๊ตฌ๋์ ์ถ๊ฐํ ์ ์๋ค. (์ฅ๋ฐ๊ตฌ๋ ์์ดํ
์ถ๊ฐ)
- ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์์ดํ
์ ์๋์ ๋ณ๊ฒฝํ ์ ์๋ค. (์ฅ๋ฐ๊ตฌ๋ ์์ดํ
์๋ ๋ณ๊ฒฝ)
- ์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ์์ดํ
์ ์ญ์ ํ ์ ์๋ค. (์ฅ๋ฐ๊ตฌ๋ ์์ดํ
์ญ์ )
3. ์น ํ๋ก ํธ์๋ ์๊ตฌ์ฌํญ
- ์ฌ์ฉ์๋ ์ฌ๋ฌ ์๋ฒ ์ค ํ๋๋ฅผ ์ ํํ ์ ์๋ค.
- ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
์๋ฒ์ ์ฐ๋ํ์ฌ ๊ธฐ์กด์ ๊ธฐ๋ฅ์ธ ์์ดํ ๋ชฉ๋ก ์กฐํ, ์์ดํ ์ถ๊ฐ, ์๋ ๋ณ๊ฒฝ, ์ญ์ ๋ ํฐ ์ด๋ ค์์ด ์์๋ค. ๋จ์ํ ์๋จ๊ณผ ๋ฒ ๋ฒ ์ ์๋ฒ ์ฃผ์๋ก ๋ฐ๊พธ์๋๋, ์ ๋์๋ค.(์ ์ด๋ ๊ทธ๋ ๊ฒ ๊ธฐ์ตํ๋ค.)
๋ณด๋ค ์ด์ ์ ๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ๋ค.
- Suspense์ ErrorBoundary
- ์๋ฒ์ํ์ UI์ํ๋ฅผ ๋๊ธฐํํ๊ธฐ
ํ๋ํ๋ ๋ง์ ๋ด์ฉ์ด ๋ด๊ธธ ๊ฒ์ผ๋ก ์์๋๋ค. ๋๋ฌธ์ 'ํ์ดํ๋ก๊ทธ๋๋ฐ ์งํ ๊ณผ์ ' ๋ค์์ ์์ธํ ๋๋์๋ณธ๋ค.
๐ฌ ํ์ดํ๋ก๊ทธ๋๋ฐ ์งํ ๊ณผ์ (With BN)
์ฐํ ์ฝ์์์ ๋ง์ง๋ง ํ์ดํ๋ก๊ทธ๋๋ฐ์ด๋ค. ๋ง์ง๋ง์ ์ฐํ ์ฝ์ ์ธ๊ธฐ์คํ์ธ ๋๋ฆฌ์ ํจ๊ปํ์๋ค. ๋๋ฆฌ์๊ฒ๋ ๋ง์ ๊ณ ๋ง์์ด ์์๋ค. ๊ทธ์ค ํ ๊ฐ์ง๋ ์ด์ ์ฅ๋ฐ๊ตฌ๋ ๋ฏธ์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋์ ๋๋ฆฌ ์ค ํ๋์ ์ฝ๋๋ฅผ ์ ํํด์ผ ํ๋๋ฐ, ๋๋ฆฌ๊ฐ ๋์ ์ฝ๋๋ก ํ์ ๋ฏธ์ ์ ์งํํ์๊ณ ์ ๊ทน์ ์ผ๋ก ์ด์ผ๊ธฐ๋ฅผ ํด์ค ๊ฒ์ด๋ค. ์ฒ์๋ถํฐ ํจ๊ป ์์ฑ ํ ์ฝ๋๋ผ๋ฉด ์ฝ๋์ ๊ตฌ์กฐ์ ํ๋ฆ์ ํ์ ํ๋๋ฐ ์ฌ๋ฌ์์ ์์์ ๊ฒ์ด๋ค. ํ์ง๋ง ๊ฐ์ ์ด์ ์ฅ๋ฐ๊ตฌ๋ ๋ฏธ์ ์ ์งํํ์๋ค. ๊ทธ๋์ ์๋ก์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ดํดํ๋ ๋ฐ์๋ ์ด๋ ์ ๋ ๋น์ฉ์ด ๋ ๋ค๊ณ ์๊ฐํ๋ค. ๋๋ฌธ์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ดํด, ํ์ ํ๋ ๊ฒ์ ์ฌ๊ฐ ํ๋ ์ผ์ด ์๋์์ ๊ฒ์ด๋ค. ๋์ ์ฝ๋๋ฅผ ๋ณด๊ณ ์ด์ฌํ ๋ถ์ํ๊ณ ์ดํดํ๊ธฐ ์ํด ํ์ด ๋๋ฆฌ์๊ฒ ๊ณ ๋ง๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ํ๊ณ ์ถ๋ค.(์ ๋ง ์ํ์ ํ๋ฆ์ด ๊ฝ์ด์์ ํ ๋ฐ ๋ง์ด๋ค...)
์ด์ ๋ฏธ์ ์ ์งํํ๋ฉด์ ๋๋ฆ Suspense๋ฅผ ๋์ ํ๊ณ ์ ๋ ธ๋ ฅํ์ง๋ง, ๋ง์๋๋ก ๋์ง ์์ ์์ํ ๋ง์์ ์ง๋ ์ฑ Suspense๋ฅผ ๋์ ํ์ฌ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํ์๋ค. ํ์ง๋ง ์ฐ์ฐํ ๋ง์์ ๊ฐ์์ง ์์๋ค. ํ์ง๋ง ์ด๋ฒ ๋๋ฆฌ์์ ํ์ดํ๋ก๊ทธ๋๋ฐ์ ํตํด Suspense๋ฅผ ์ด๋ป๊ฒ ์ ์ฉํ๋์ง ๋ฐฐ์ธ ์ ์์๋ค. ๊ฐ๋จํ ์๊ฐ์ '์๊ฐ๋ณด๋ค Suspense๋ฅผ ๊ฐ์ธ์ผํ ๊ณณ์ด ๋ง๋ค. ์ฆ, ์ฝ๋๋ ๊น๋ํด์ง์ง๋ง ๊ท์ฐฎ๋ค.'๋ผ๋ ๊ฒ์ด๋ค. ์์ผ๋ก ์ ์ฉํ๊ฒ ์ฌ์ฉํ ๋ฟ ์๋๋ผ Suspense๊ฐ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง๋ ์์๊ฐ ๋ณด์.
์ฅ๋ฐ๊ตฌ๋ ๋ฏธ์ ์์ ์งํํ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ๋ฐฑ์๋ ํฌ๋ฃจ๋ค๊ณผ ํ์ ํ์ฌ ์๋ฒ๋ฅผ ์ฐ๋ํ๋ ๊ฒ์ด ์ด๋ฒ 1๋จ๊ณ ๋ฏธ์ ์ ๋ชฉํ์๋ค. ๋๋ฌธ์ ์๋ก์ด ์ปดํฌ๋ํธ, ํ์ด์ง๋ฅผ ๋ง๋ค ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋์ ๋๋ฆฌ ๋ชจ๋ ํฌ๊ฒ ๋ถ๋ด๊ฐ์ ๊ฐ์ง์ง ์๊ณ ์งํํ์๋ค. MSW๋ฅผ ํตํด ์ด๋ฏธ ํต์ ์ ์ผ์ถ? ํ๋ด๋ฅผ ๋๊ธฐ ๋๋ฌธ์ ๋ฒ ๋ฒ ์ ์๋จ์ด ์๋ฒ๋ฅผ ๋ณด๋ด์ฃผ๊ธฐ ์ ๊น์ง Suspense, ErrorBoundary, ์ ์ญ ์ํ ๊ด๋ฆฌ์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ฉฐ ์ฝ๋ ๋ฆฌํฉํฐ๋ง์ ์งํํ์๋ค. ๋ํ ์๋ฒ๋ฅผ ์ ํํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์๋ค.
์์์ผ์๋ ์ ๋ฆ ์บ ํผ์ค์์ ๋ฐฑ์๋ ํฌ๋ฃจ์ธ ๋ฒ ๋ฒ ์ ์๋จ๊ณผ ํจ๊ป ํ์ ์ ์งํํ์๋ค. ์ฌ์ค 1๋จ๊ณ์์๋ ํจ๊ป ์ด์ผ๊ธฐ๋ฅผ ๋๋ ๋ถ๋ถ์ด ์์๋ค. ์ด๋ฏธ ๋ช ์ธ์๊ฐ ์ ํด์ ธ ์์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ๊ทธ๋ ์ ๊ฐ๋จํ ์ฐ๋์ด ์ ๋๋์ง, ์ด๋ค ์ค๋ฅ๊ฐ ๋ํ๋๋์ง์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ฉด์ ํจ๊ป ๋ฏธ์ ์ ์งํํ์๋ค. ๋ฒ ๋ฒ ์ ์๋จ๋ ํจ๊ป ์ด์ผ๊ธฐ๋ฅผ ์ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์ด๋ ค์ด ๊ฒ ์์ด ์ค๋ฌด์คํ๊ฒ ํ์ ์ ์งํํ ์ ์์๋ค.
Suspense์ ErrorBoundary
์ด๋ฒ ๋ฏธ์ ์์ ๊ฐ์ฅ ๋จผ์ ์งํํ ์์ ์ด ๋ฐ๋ก Suspense์ ErrorBoundary๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด์๋ค. ๋ณด๋ค ์ ์ธ์ ์ผ๋ก ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Suspense์ ErrorBoundary๋ฅผ ๊ผญ ํ์ฉํ๊ณ ์ถ์์ง๋ง, ์๊ฐ๋๋ก ์ ๋์ง ์์ ์ง๊ธ๊น์ง ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํตํด ๋ฐ์ดํฐ๊ฐ ํ์นญ ํ๋ ๊ณผ์ (pending, rejected, fulfiled)์ ๋ฐ๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง์ ํ์๋ค. ๋น์ฐํ ์์ฌ์ ๋ค. ๋คํํ ๋๋ฆฌ์ ๋์์ ํตํด ์ด๋ฒ ๋ฏธ์ ์์๋ ์ ์ฉํ ์ ์์๋ค.
์๋์์ Suspense ์์ฃผ๋ก ์ด์ผ๊ธฐ๋ฅผ ํ์ด๋ณธ๋ค.
Suspense๋?
์ฐ์ ๋ด๊ฐ ์ ์ฉํ๊ณ ์ถ์๋ Suspense๊ฐ ๋ฌด์์ธ์ง๋ถํฐ ์ง๊ณ ๋์ด๊ฐ ๋ณด์. Suspense์ ๋ํด ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ๊ณ ์๋ค.
<Suspense> lets you display a fallback until its children have finished loading.
์ฆ, Suspense๋ ํ๋์ ์ปดํฌ๋ํธ์ด๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์์ ๋ก๋ฉ์ด ๋๊ฐ์ง ์ ๊น์ง ์์ ๋์ fallback์ ๋ณด์ฌ์ค ์ ์๋ค. ๋๋ฌธ์ children, fallback์ Props์ ๊ฐ์ง๋ค. ์์ธํ ๋ด์ฉ์ ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ !
๋ ์ Suspense๋ฅผ ๋์ ํ๊ณ ์ถ์ด ํ๋๊ฐ?
์ถฉ๋ถํ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํตํด ๋ฐ์ดํฐ๋ฅผ fetching(๋น๋๊ธฐ ํต์ )ํ๋ ๊ณผ์ ์ ๋ํ๋ผ ์ ์๋ค. ํ์ง๋ง ๋ฆฌ์กํธ๋ฅผ ๋ณด๋ค ์ ์ธ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด Suspense๋ฅผ ํญ์ ์ฌ์ฉํ๊ณ ์ถ์๋ค. ์ ์ธํ์ ๋ฐ๋๋ ๋ช ๋ นํ์ด๋ค. ์ง๊ธ๊น์ง ๋ด๊ฐ ํด์จ ๋ฐฉ์์ ๋ช ๋ นํ์ด๋ผ๊ณ ํ ์ ์๋ค. ์ฆ, ์ด๋ป๊ฒ์ ์ด์ ์ ๋๊ณ ์ฝ๋๋ฅผ ์์ฑํ์๋ค. ์๋์ ์์๋ฅผ ์ดํด๋ณด์.
if(status === "pending") { // ๋๋ loading
return (<Loading />)
}
return <Children />
status์ ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ํ๋ค. status์ ์ํ๋ฅผ if๋ฌธ์ ํตํด ๋ด๊ฐ ์ง์ ํ๋จ์ ํ๊ณ ์ด์ ๋ฐ๋ฅธ ์ปดํฌ๋ํธ๋ฅผ return ํด์ผ ํ๋ค.
์์ ๊ฐ์ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ์ Suspense๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ณด๋ค ๋ ์ง๊ด์ ์ผ๋ก ๋ฐ๋๊ฒ ๋๋ค. ์ฆ, ๋ ์ด์ status๋ผ๋ ์ํ๋ฅผ ๊ด๋ฆฌํ์ง ์์๋ ๋๋ค. ๋จ์ง Suspense๋ฅผ ์ ์ธํจ์ผ๋ก์จ ์์์ loading์ผ ๋์ ์ํฉ์ ๋ํ๋ผ ์ ์๊ฒ ๋๋ค. ์ด๋ฐ ์ ์ด ๋งค๋ ฅ์ ์ผ๋ก ๋๊ปด์ก๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ง์ด๋ค.
return <Suspense fallback={<Loading />}>
<Children />
</Suspense>
์ด๋ป๊ฒ ๋๋์ง๋ ์๊ฐํ์ง ์์๋ ๋๋ค. ๊ทธ์ Suspense๋ฅผ ์ฌ์ฉํ๊ธฐ๋ง ํ๋ฉด ๋๋ค. ๋ง์น ์ฐ๋ฆฌ๊ฐ ๋ ์ํผ๋ฅผ ๋ณด๋ฉฐ ์์์ ๋ง๋๋ ๊ฒ์ด ์๋๋ผ ์์์ ์์ ์์์ ์ฃผ๋ฌธํ๋ ๊ฒ์ฒ๋ผ ๋ง์ด๋ค.
ํ ์ค์ SLASH 21 ์ปจํผ๋ฐ์ค ์ค ์ด์ ๊ด๋ จ๋ ๋ด์ฉ์ด ์๋ค. ์ ๋ง ๋ง์ ๋์์ด ๋์๋ ๋ด์ฉ์ด์๊ณ ์ด๋ฅผ ๋ณด๊ณ Suspense๋ฅผ ๋ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.(์ด๋ฅผ ๋ฏธ๋ฆฌ ์์๋๋ผ๋ฉด,,)
๊ทธ๋ฌ๋ฉด ์ง๊ธ๊น์ง ์ Suspense๋ฅผ ๋์ ํ์ง ์์๋๊ฐ?
์ ํํ ๋งํ์๋ฉด ๋์ ํ์ง ์์ ๊ฒ์ด ์๋๋ผ, ์ง์์ด ๋ถ์กฑํ์ฌ ๋์ ํ์ง ๋ชปํ๋ค. Suspense๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ํ์ ํ์ง๋ ์๊ณ ๋นจ๋ฆฌ ๋ฏธ์ ์ ๋์ ํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์ Suspense๋ฅผ ๋ ์ด๋ ต๊ฒ ์๊ฐํ์ง ์์๋ ์ถ๋ค.
์ผ๋ฐ์ ์ธ fetch ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ๋ Suspense๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ฌ๋ฌ ๊ธฐ์ ๋ธ๋ก๊ทธ์์ ์ฐพ์๋ณธ ๊ฒฐ๊ณผ fetch ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋๋ถ์ด Promise ๊ฐ์ฒด๋ฅผ throwํด์ฃผ๋ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํ๋ค. ์ด๋ฌํ ๊ฒ์ ๋ชจ๋ฅด๊ณ ๋จ์ํ fetch ๋ฉ์๋๋ง ์ฌ์ฉ์ ํ๋ ๋น์ฐํ Suspense๋ฅผ ๋์ ํ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.
์ด์ , Suspense๋ฅผ ๋์ ํด ๋ณด์!
Suspense ๋์ ์ ์ํด Promise ๊ฐ์ฒด๋ฅผ throwํด์ฃผ๋ ๋ฌด์ธ๊ฐ๋ฅผ ํฌํจํ fetch ์ ํธ ํน์ ํ ์ ๋ง๋ค์ด์ผ ํ๋๊ฐ? ์๋๋ค! ์์ง Suspense๋ฅผ ๋์ ํ๊ธฐ ์ํ ์๊ตฌ ์ฌํญ์ ๋ถ์์ ํ๊ณ ๋ฌธ์ํ๋์ง ์์๋ค๊ณ ํ๋ค. ์ฒ์ฒํ ๊ธฐ๋ค๋ ค๋ณด์.
๋์ , ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์์๋ ์ด๋ฏธ Suspense๋ฅผ ์ ์ฉํ ์ ์๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ํ๊ณ ์๋ค.(์๋๋ ๊ณต์๋ฌธ์์ ๋ด์ฉ์ด๋ค.)
Data fetching with Suspense-enabled frameworks like Relay and Next.js
Relay, Next.js๋ฟ ์๋๋ผ Recoil์์๋ Suspense๋ฅผ ๋์ ํ ์ ์๋ค. selector์ ํจ๊ป ์ฌ์ฉํ ์ ์๋๋ฐ, ์๋๋ ํด๋น ๋ด์ฉ์ด ๋ด๊ธด Recoil ๊ณต์๋ฌธ์์ ๋ด์ฉ์ด๋ค.
์ด๋ฅผ ๋ฐํ์ผ๋ก Suspense๋ฅผ ๋ฏธ์ ์ ๋์ ํ ์ ์์๋ค.
Suspense๋ฅผ ๋์ ํ๊ธฐ ์ํ ์ค๋น๊ณผ์
์ง๊ธ๊น์ง ๋ฏธ์ ์์ recoil๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด atom๋ฅผ ์ฌ์ฉํ๋ค. atom์ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๋ ๋๋ง ํ๊ณ ์ ๋ฐ์ดํธ๋ฅผ ์งํํ๋ค. ํ์ง๋ง ๋น๋๊ธฐ๋ฅผ ์ํ๋ก ๊ฐ์ง๊ณ ์์ ์ ์๋ค. ์ ๋ฆฌํ์๋ฉด, ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋๋ ๋น๋๊ธฐ๋ฅผ ์ํ๋ก ๊ฐ์ง๊ณ ์ถ๋ค.
2. ์ฆ, ์ํ๊ฐ pending, fulfilled, rejected์ธ์ง ์๊ณ ์ถ๋ค.
3. atom์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ต์ ์ด์ง๋ง ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ค.
4. ๊ฒฐ๋ก ์ atom์ผ๋ก Suspense๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ด Suspense๋ฅผ ๋์ ํ๋ ์ฒซ๊ฑธ์์ด์๋ค. Recoil ๊ณต์๋ฌธ์์์๋ ์ ์ ์๋ฏ์ด Suspense๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ selector๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. ํ์ง๋ง,,, ์ฌ๊ธฐ์ ๋ ๋ฌธ์ ..! selector๋ ์ฝ๊ธฐ ์ ์ฉ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ฐ์ดํธ๋ฅผ ํ ์ ์๋ค. set ๋ฉ์๋์ ์ฌ์ฉ ํ๋ฉด ์ฐ๊ธฐ๋ ํ ์ ์์ง๋ง ๋ณด๋ค ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ผ๋ก atom๊ณผ selector๋ฅผ ์ฐ๊ฒฐํ๋ค. ๋ฐ๋ก atom์ default๋ฅผ selector์ ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
export const cartItemsStateSelector = selector({
key: 'cartItemsStateSelector',
get: ({ get }) => {
const server = get(serverState);
return fetchData({ url, method, server }); // ๋น๋๊ธฐ ํต์ ๊ณผ์
},
});
const cartItemsState = atom({
key: 'cartItemsState',
default: cartItemsStateSelector,
});
์ ์ฝ๋๋ ์ค์ ๋ฏธ์ ์์ ์ฌ์ฉํ ์ฝ๋์ด๋ค. ์ฅ๋ฐ๊ตฌ๋ ๋ฌผํ์ ๋ชฉ๋ก์ ๋ถ๋ฌ์ ์ํ๋ก ๋ง๋๋ ๊ณผ์ ์ด๋ค. ์ํ๋ฅผ ๋ฐํ์ผ๋ก ๋ ๋๋ง์ ํด์ผ ํ๊ณ ์ ๋ฐ์ดํธ๋ ํด์ผ ํ๊ธฐ ๋๋ฌธ์ atom์ ์ฌ์ฉํ์๊ณ Suspense๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด default๋ฅผ selector๋ฅผ ๋ฐํ์ผ๋ก ๋ง๋ค์๋ค.
selector์ get ๋ฉ์๋๋ฅผ ๋ณด๋ฉด ๋ฆฌํดํ๋ ๊ฐ์ Promise ๊ฐ์ฒด๊ฐ ๋๋ค. ์ด๋ฅผ ๋ฐํ์ผ๋ก Promise ๊ฐ์ฒด๊ฐ pending์ธ์ง fulfilled์ธ์ง rejected์ธ์ง๋ฅผ Suspense์ ErrorBoundary๊ฐ ํ๋จํ๊ฒ ๋๋ค.
๋ญ๊ฐ,, ๋ ๊ณ ๋ฏผ์ ํ๊ณ ํ์ต์ ์งํํ๊ฒ ๋๋ฉด ๊ตณ์ด atom์ ์ฌ์ฉํ์ง ์๊ณ selector๋ก๋ง ํด๋ ๋ ๊ฒ ๊ฐ๋ค. ๋ํ ์๋ฒ ์ํ์ UI ์ํ๋ฅผ ๋๊ธฐํํ๋ ๊ณผ์ ์ด ๋ฐ๋์ ํ์ํ๊ธฐ ๋๋ฌธ์ recoil์ด ์๋๋ผ ๋น๋๊ธฐ ํต์ ์ ๋์ฑ ํนํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ react query๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ง ์์๊น? ํ๋ ์๊ฐ์ด ๋ ๋ค. ๋ฌผ๋ก , ์์ง ์ฌ์ฉํด ๋ณธ ์ ์ ์์ง๋ง ๊ทธ๋ ๋ค๊ณ ๋ค์๋ค:)
์๋ฌดํผ Susepense๋ฅผ ์ฌ์ฉํ ์ค๋น๋ฅผ ๋ง์ท๋ค.
๋๋์ด Suspense๋ฅผ...!
์ ์ฝ๋์์ cartItemsState(์ฅ๋ฐ๊ตฌ๋ ๋ฌผํ)๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ณณ์ผ๋ก ๊ฐ๋ณด์. ๊ฐ์ฅ ๋จผ์ ๋ ์ค๋ฅด๋ ๊ณณ์ ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง๊ฐ ๋ ๊ฒ์ด๋ค. ์ฅ๋ฐ๊ตฌ๋ ๋ฌผํ์ ๋ ๋๋ง์ ๋ด๋นํ๋ ์ปดํฌ๋ํธ๋ ๋ค์๊ณผ ๊ฐ์ด 3๊ฐ์ง์ด๋ค. ์๋๋ก ๊ฐ์๋ก ์์ ์ปดํฌ๋ํธ์ด๋ค.
- CartList: ์ฅ๋ฐ๊ตฌ๋ ์ ์ฒด ํ์ด์ง
- CartItems: ์ฅ๋ฐ๊ตฌ๋ ๋ฌผํ ๋ชจ๋
- CartItem: ์ฅ๋ฐ๊ตฌ๋ ๋ฌผํ ํ๋
์ ์ปดํฌ๋ํธ๋ค ์ค, cartItmesState๋ฅผ ๊ฐ์ ธ์ค๋ ๊ณณ์ CartItems ์ปดํฌ๋ํธ์ด๋ค. ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ์๋ค.
function CartItems() {
const cartItems = useRecoilValue(cartItemsState);
return (
<>
{cartItems?.map((item) => (
<CartItem cartId={item.id} product={item.product} key={item.product.id} />
))}
</>
);
}
Suspense๊ฐ ๋ณด์ด๋๊ฐ? ๋ณด์ด์ง ์๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋์ Suspense๋ฅผ ์ฌ์ฉํด์ผ ํ๋๊ฐ? ๋ณด๋ฅ ์ค์ธ ๋ฐ์ดํฐ์ธ cartItems๊ฐ ์กด์ฌํ๋ ์ปดํฌ๋ํธ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํด์ผ ํ๋ค. ์ฆ, CartList์์ Suspense๋ฅผ ์ฌ์ฉํ์ฌ CartItems๋ฅผ ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค. ๋ง์ฝ ๊ฐ์ธ์ฃผ์ง ์๋๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ํ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด Suspense๋ก CartItems๋ฅผ ๊ฐ์ธ์ฃผ์.
function CartList() {
return (
<S.Container>
// ...
<Suspense
fallback={Array.from({ length: 3 }, (_, index) => (
<SkeletonCartItem key={index} />
))}
>
<CartItems />
</Suspense>
// ...
</S.Container>
);
}
์ด๋ก์จ cartItems์ด pending์ผ ๋(์์ง ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์์ ๋) Suspense์ fallback์ ์ ์๋ ์ปดํฌ๋ํธ๊ฐ ๋์ ๋ ๋๋ง์ด ๋๋ค.
์์ผ๋ก Suspense๋ฅผ ์ ๋ค๋ฃจ๊ณ ์ถ๋ค. ์ค์ผ๋ ํค UI๊ฐ ์ด์๋ค,,
ErrorBoundary๋ ์ด๋ป๊ฒ?
ErrorBoundary๋ ์ด๋ป๊ฒ ํ ๊น? ๋น๋๊ธฐ ํต์ ์ด ์คํจํ๊ฒ ๋๋ฉด Promise๊ฐ์ฒด๋ rejected๊ฐ ๋๋ค. ์ด๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ์ด๋ฐ ์๋ฌ๋ฅผ ErrorBoundary๊ฐ ์บ์นํ๊ฒ ๋๋ค. ๋ฏธ์ ์์๋ ๋ชจ๋ ์๋ฌ๋ฅผ ์ก์๋ด๊ธฐ ์ํด ๊ฐ์ฅ ์ต์๋จ์ Outlet ์ปดํฌ๋ํธ๋ฅผ ErrorBoundary๋ก ๊ฐ์๋ค.
function App() {
return (
<>
<GlobalStyle />
<Suspense fallback={<LoadingHeader />}>
<Header />
</Suspense>
<CommonPageStyle>
<ErrorBoundary fallback={NotFound}> // ์๋ถ๋ถ!!
<Outlet />
</ErrorBoundary>
<Suspense>
<QuickMenu />
<QuickMenuMobile />
</Suspense>
</CommonPageStyle>
</>
);
}
export default App;
์ฌ๋ฐ๋ ์ ์ ErrorBoundary์ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์๋๋ผ ํด๋์คํ ์ปดํฌ๋ํธ๋ผ๋ ๊ฒ์ด๋ค. ์๋ฌ๋ฅผ ์ผ์น ํ๋ getDerivedStateFromError ์๋ช ์ฃผ๊ธฐ ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํจ์ผ๋ก ์๊ฐ๋๋ค. ์์ธํ ์ฝ๋๋ ์๋์์ ํ์ธํ ์ ์๋ค.
์๋ฒ์ํ์ UI์ํ๋ฅผ ๋๊ธฐํํ๊ธฐ
๋ฆฌ์กํธ๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ๊ฐ์ฅ ๋ง์ด ํ ๊ณ ๋ฏผ์ด ๋ฐ๋ก ์ํ์ด๋ค. ๋ฌด์์ด ์ํ์ด๊ณ ์ด๋ป๊ฒ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋์ง ๋ฑ ๊ณ ๋ คํด์ผ ํ ์ ์ด ํ๋ ๊ฐ์ง๊ฐ ์๋๋ค. ์์ผ๋ก ๊ณ์ ์ ๋ณตํด ๊ฐ์ผ ํ ๋ถ๋ถ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ์ค ์ด๋ฒ ๋ฏธ์ ์์๋ ์๋ฒ์ํ, UI์ํ์ ๋ํด ๋๋ฆ? ๊ณ ๋ฏผ์ ํด๋ณด์๋ค. ์ด๋ฅผ ์ ๋ฆฌํ ๋ด์ฉ์ด๋ค.
์ฐ์ ๋ด๊ฐ ์๊ฐํ๋ ์๋ฒ์ํ๋ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ ๋ฐ์์จ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ UI์ํ๋ ํ๋ฉด์ ๋ ๋๋ง ๋๊ณ ์๊ฐ์ ๋ฐ๋ผ ๋ณํํ ์ ์๋ ๊ฒ์ด๋ค. ์ด ๋ ์ํ๋ ๋ชจ๋ ๋ณํ ์ ์๋ค. ๋ฐ์ดํฐ์ ์ฑ๊ฒฉ์ ๋ฐ๋ผ ๋ค์ํ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค. ์ผ์ ์๊ฐ๋ง๋ค ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๋ฐ์์์ผ ํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์์ ์ด๋ฒคํธ์ ์ํด ์ ๋ฐ์ดํธ๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๋ฐ์์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค. ๋ํ ์ด๋ฐ ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋ก ๋ ๋๋ง์ด ๋์ด ์ฆ๊ฐ์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์๋ ค์ค์ผ ํ๋ ๊ฒฝ์ฐ ๋ฑ๋ฑ ๋ณ์๋ ๋ค์ํ ๊ฒ์ด๋ค. ๊ฐ์ฅ ํํ ๊ฒฝ์ฐ๋ '์ฌ์ฉ์์ ์ด๋ฒคํธ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๋๊ณ ์ด๋ฐ ์ต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฆ๊ฐ์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค์ผ ํ๋ ๊ฒฝ์ฐ'์ผ ๊ฒ์ด๋ค.
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์์ฌ๊น? ๊ฐ์ฅ ํฐ ์ด์ ๋ ํ๋ฉด์ ๋ ๋๋ง์ ํ๊ธฐ ์ํด์์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ํ๋ก ๋ง๋ค ํ์๊ฐ ์์๊น? ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ๋ค๋ฉด ์ํ๋ก ๋ง๋ค์ง ์์๋ ๋๋ค๊ณ ์๊ฐํ๋ค. ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น? ๋น์ฅ ๋ ์ค๋ฅด๋ ํด๊ฒฐ์ฑ ์ ์ํ๋ก ๋ง๋ค์ด ๊ด๋ฆฌํ๋ ๊ฒ์ด์๋ค. ๋ํ ์ด๋ฒ ๋ฏธ์ ์ ๊ฒฝ์ฐ productsState์ ์ํ๋ก ๋ง๋ค์ง ์์๋ ๋์๊ฒ ์ง๋ง Suspense ๋์ ์ ์ํด recoil์ selector์ ์ฌ์ฉํ์ฌ ์ํ๋ก ๋ง๋ค์๋ค.
์ผ๋ง๋ ์์ฃผ ๋๊ธฐํํด์ผ ํ ๊น?
์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธด ๋ฌผํ์ ์๋์ ์๋ก ๋ค์ด๋ณด์. ์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ๋ฌผํ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ฌผํ์ ์๋์ ์ฆ๊ฐ์ ํ๋ค. ์ด๋ ์๋ฒ์ ํต์ ์ด ์ผ์ด๋๊ฒ ๋๊ณ DB์๋ ์ต์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๋๋ถ์ด ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ง๋ ํ๋ฉด์๋ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ค.
๋ง์ฝ ์ด ๋์ด ๋ค๋ฅด๊ฒ ๋๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ฅ๋ฐ๊ตฌ๋์ ๋ชจ๋ ๋ฌผํ์ ๋ด๊ณ ์ฃผ๋ฌธํ๊ธฐ ์ํด ์ฅ๋ฐ๊ตฌ๋ ํ์ด์ง์ ๋ค์ด๊ฐ๋๋ฐ ๋ด๊ฐ ์๊ฐํ๋ ๋ฌผํ์ด ์๊ณ ์๋์ด ์๋ค. ๋น์ฐํ ๋นํฉํ ์๋ฐ์ ์๋ ์ํฉ์ด๋ค. ๊ทธ๋์ ์๋ฒ์ ํต์ ์ด ์ผ์ด๋ ๋, ํ๋ฉด์ ๋ณด์ฌ์ง๋ ์ํ๊ฐ๋ ํจ๊ป ์ ๋ฐ์ดํธ๋ฅผ ํด์ผ ํ๋ค.
์ฆ, ๋ฏผ๊ฐํ ๋ด์ฉ์ด ์๋๋๋ผ๋ ์๋ฒ์ํ์ UI์ํ๋ฅผ ํญ์ ๋๊ฐ์ด ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค.
์์ง์ ๋ฌด์ธ๊ฐ ๋นํจ์จ์ ์ธ ๋๊ธฐํ
์๋ฒ์ํ์ UI์ํ๋ฅผ ํญ์ ๋๊ฐ์ด ์ ์งํ๊ธฐ ์ํด ์ฌ์ฉ์๊ฐ ์๋ฒ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ์ด๋ฒคํธ๋ฅผ ๋ฐ์์์ผฐ์ ๋, ์ ๋ฐ์ดํธํ๋ ๋ก์ง๋ฟ ์๋๋ผ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๋ก์ง๋ ํจ๊ป ์คํํ ์ ์๋๋ก ํ์๋ค. ๋ค์์ ์ฌ์ฉ์๊ฐ ์ฅ๋ฐ๊ตฌ๋์ ๋ฌผํ์ ๋ด๊ฑฐ๋ ์๋์ ์ฆ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ๋ ์ฌ์ฉ๋๋ ํจ์์ด๋ค.
const updateCartItem: UpdateCartItem = async (url, method, body) => {
// ์ฅ๋ฐ๊ตฌ๋ ์
๋ฐ์ดํธ
await fetchData<{ ok: boolean }>({ url, method, body, server });
// ์
๋ฐ์ดํธ ๋ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ๊ฐ์ ธ์ค๊ธฐ
const data = await fetchData<CartItemType[]>({ url: FETCH_URL.cartItems, method: FETCH_METHOD.GET, server });
const newCartItems = data.map((cartItem) => {
return {
...cartItem,
isSelected: isSelected(cartItem.id),
};
});
// UI์ํ ์
๋ฐ์ดํธ
setCartItems(newCartItems);
};
์ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๊ฐ์ง๋ค.
1. ์ฅ๋ฐ๊ตฌ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ํ ๋น๋๊ธฐ ํต์ ์ ์งํํ๋ค.
2. ์ ๋ฐ์ดํธ๋ ์ต์ ์ ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์ํ ๋น๋๊ธฐ ํต์ ์ ์งํํ๋ค.
3. ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ํ๋ฉด ๋ ๋๋ง์ ํ์ํ UI์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
์๋์ 1 ์ฌ๋ฆฌ๊ธฐ ์ํด ์์ ํจ์๊ฐ ์คํ๋๋ ๊ฒ์ด๋ค. 10์ ์ฌ๋ฆฌ๊ธฐ ์ํด์ 10๋ฒ์ด ์คํ๋๊ณ , 50์ ์ฌ๋ฆฌ๊ธฐ ์ํด์ 50๋ฒ์ ์คํ... ์ญ์ ๋ค์ ์๊ฐํด๋ ๋๋ฌด ๋นํจ์จ์ ์ด๋ค. ํ ๋ฒ์ ๋ฌถ์ด์ ๋น๋๊ธฐ ํต์ ์ด ํ ๋ฒ๋ง ์คํ๋๊ฒ ํ๋ ๊ฒ์ด ๊น๋ํด ๋ณด์ธ๋ค.
์ด ๋ถ๋ถ์ Throttling, Debounding์ ํตํด ํด๊ฒฐํ๊ฑฐ๋ UI๋ฅผ ๋ฏธ์ ์์ ์๊ตฌํ๋ ์ฌํญ๊ณผ ๋ค๋ฅด๊ฒ ๊ตฌํํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ค.
์ด๋ป๊ฒ ์ ์ฉ์ ํด์ผ ํ ๊น?๋ ์์ผ๋ก ๋ด๊ฐ ๊ฐ์ง๊ณ ๊ฐ์ผ ์์ ์ด๋ค.
๐ ์ํ ์
1. ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์๊ฒ ์๋ฒ๋ฅผ ์ฐ๊ฒฐํ์๋ค.
2. ๋ง์ง๋ง์ ๋ฐฐํฌํ๋ ๊ฒ์ด ์๋๋ผ ์ค๊ฐ์ ๋ฐฐํฌ๋ฅผ ํ์ฌ ๋ฐฑ์๋ ํฌ๋ฃจ๋ค์๊ฒ ์ค๊ฐ ์ํฉ์ ์๋ ค์ฃผ๋ฉฐ ๋ฏธ์ ์ ์งํํ์๋ค.
๐ ์์ฌ์ด ์
1. ๋ง์ง๋ง ํ์ดํ๋ก๊ทธ๋๋ฐ์ด์ฌ์ ๊ทธ๋ฐ์ง ์๊ฐ์ ๋ฑ ์ ํ์ง ์๊ณ ํด์ ํผ๋์ค๋ฌ์ ๋ค.
2. ํ๊ณ ๋ฅผ ์์ฑํ๋๋ฐ ๊ธ์ด ์ด์ํ๋ค๊ณ ๋๊ปด์ง๋ค. ์์ ๊ฐ์ด ๋ถ์กฑํด์ง๋ ๊ธฐ๋ถ์ด๋ค.
๐ ์์ผ๋ก์ ๋ค์ง
1. ์ฐ์ต์ ๋ง์ด ํ์.
2. ๋ด ์๊ฐ์ ๋งํ๊ณ ๊ธ๋ก ํํํ์.
3. ๊ธฐ์ ์ด ์๋๋ผ ๋ด ์๊ฐ
'๐ ์ฐ์ํํ ํฌ์ฝ์ค > Level2' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ๋ฒจ2 - ์ธํฐ๋ทฐ (0) | 2023.06.23 |
---|---|
๋ ๋ฒจ2 ์ฅ๋ฐ๊ตฌ๋ ํ์ - Step2 (0) | 2023.06.22 |
๋ ๋ฒจ2 ์ฅ๋ฐ๊ตฌ๋ - Step2 (0) | 2023.06.06 |
๋ ๋ฒจ2 ์ฅ๋ฐ๊ตฌ๋ - Step1 (0) | 2023.05.27 |
๋ ๋ฒจ2 ํ์ด๋จผ์ธ - Step3 (0) | 2023.05.15 |