๐๋ฐฐํฌ๋งํฌ ๐Github
# ํ๊ณ
๊ธฐํ์ ๋ง์น ํ 4์ 25์ผ๋ถํฐ ๊ฐ์ธํ๋ก์ ํธ๋ฅผ ์์ํ๋ค. ์ง๋์ฃผ ๋ชฉ์์ผ(5/18)์ 1์ฐจ๋ก ๊ณผ์ ๋ฅผ ์ ์ถํ ํ, ์ด๋ฒ์ฃผ ์์์ผ(5/22)์ผ ๋ถํฐ ๋ฆฌํฉํ ๋งํ์ฌ ๊ฐ์ธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ฌด๋ฆฌํ๋ค. ์ฃผ๋ง์ ๊ฐ์ธ์ ์ธ ์ผ์ด ์์ด, ์ฃผ๋ก ํ์ผ์ ์์
ํ๋ค.
์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด ๋ฐฐ์ด๊ฑด, '์ํ ๊ด๋ฆฌ'์ 'data flow'์ ์ค์์ฑ์ด๋ค. 5/22 ~ 5/24 ๋์ ๋ก์ปฌ ์คํธ๋ก์ง๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ฉฐ ํ์ด์ง๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๊ฒ ๋ฆฌํฉํ ๋ง ํ์๋ค. ํ์ง๋ง, ๋ฆฌํฉํ ๋ง์ ๋ง์น๊ณ ๋์ ๋ก์ปฌ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ค์ผ ํ๋ ์ด์ ์ ๋ํด ๊ณ ๋ฏผํ๊ฒ ๋์๋ค. ๊ฒฐ๊ตญ, ๋ด๊ฐ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉํ ํ์๋ ์์๋ค. ํด๋น ๋ฌธ์ ๊ฐ ์๋ก๊ณ ์นจ ๋ฌธ์ ๋ผ๋ฉด, App.tsx์์ refresh ๋ ๋ ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ถ๋ฌ์ค๋ฉด ๋๋๊น ๋ง์ด๋ค. ์ด ๋ถ๋ถ์ ๊นจ๋ซ๊ณ ๋์ ๋ด ์ฝ๋๋ฅผ ์ดํด๋ณด๋ ์ํ๊ด๋ฆฌ๊ฐ ์๋ง์ด์๋ค. data flow๋ ์๊ฐํ์ง ์๊ณ ๋๋ถ๋ถ์ ์ํ๋ฅผ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์์ด์ '๋ ์ง๊ธ๊น์ง ๋ญํ๋?'๋ผ๋ ์๊ฐ์ด ์ ๋ก ๋ค์๋ค.
๋๋ถ๋ถ์ ์ฝ๋๋ฅผ ์์ ํ๋ ์ฝ 3์ผ์ด ๊ฑธ๋ ธ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ํ ๋๋ ๋งํฌ์
ํ์ data flow์ ์๊ฐ์ ํฌ์ํ๋๋ผ๋ฉด ํ๋ ์์ฌ์์ด ๋ค์๋ค.
์ดํ์ ํด๋น ์น์ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธ ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ์์ ํด๋๊ฐ ์์ ์ด๋ค.
## ๊ธฐ๋ฅ
- ๋ก๊ทธ์ธ/ํ์๊ฐ์
: Google social login ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- Today's Clothes
: ์ค๋์ ์๋ฅ์ ๋ณด๋ฅผ ์ฌ์ฉ์ ์์น์ ๋ ์จ ์ ๋ณด์ ํจ๊ป ๋ณด์ฌ์ค๋๋ค.
: ์ค๋ ๋ ์ง์ ๋ฑ๋ก๋ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ, ์ค๋ ๊ธฐ์จ์ ํด๋นํ๋ ๊ธฐ๋ณธ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- Closet
: ๋ค์์ฃผ์ ์
์ ์ท์ ๋ฏธ๋ฆฌ ๊ณํํ ์ ์์ต๋๋ค.
: ์ด๋ฏธ์ง CRUD๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- Record : ๊ณผ๊ฑฐ์ ์
๋ก๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์จ๋ณ๋ก ํํฐ๋งํ์ฌ ํ์ธํ ์ ์์ต๋๋ค.
- Talk
: ๊ณต์ ๋ user ์๋ฅ์ ๋ณด๋ฅผ ๋ ์ง, ๋ ์จ์ ํจ๊ป ํ์ธํ ์ ์์ต๋๋ค.
: ๋๊ธ์ ํตํด ๋ค๋ฅธ user์ ์ํตํ ์ ์์ต๋๋ค.
: ๋๊ธ CRUD๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
## ๊ธฐ์ ์ ์ธ ๋ฌธ์ ์ 1 - Recoil issue
โCan't perform a React state update on a component that hasn't mounted yet. This indicates that you have a side-effect in your render function that asynchronously later calls tries to update the component. Move this work to useEffect instead.
Uncaught Error: A component suspended while responding to synchronous input. This will cause the UI to be replaced with a loading indicator. To fix, updates that suspend should be wrapped with startTransition.โ
- Recoil์ ์ฌ์ฉํด ์ํ๊ด๋ฆฌ๋ฅผ ํ๋ ์ค ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. DB์ ๋ฐ์ดํฐ๋ ์ ์ ์ฅ๋๊ณ ์์ง๋ง, ์๋ก๊ณ ์นจ ํ์ง ์์ผ๋ฉด UI๊ฐ ์
๋ฐ์ดํธ ๋์ง ์๋๋ค. ํด๋น ๋ฌธ์ ๋ ๋ง์นจ ํ๋ก ํธ์๋ ๋ฉํ ๋๊ณผ ์ฝ 15๋ถ ๋์ ๋ฏธํ
ํ ๊ธฐํ๊ฐ ์์ด์ ์กฐ์ธ์ ๊ตฌํ๋ค. ํด๋น ๋ฌธ์ ๋ useRecoilValue๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์์๋ React.Suspense๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ํ์
จ๋ค. Recoil์ ์ฒ์ ๋ค๋ฃจ๋ค ๋ณด๋ ์์ง ๋ชจ๋ฅด๊ณ ๋ถ์กฑํ ์ ์ด ๋ง๋ค. ํด๋น ๋ถ๋ถ์ ๋ฌธ์๋ฅผ ์ฝ๊ณ ์ง์ ์ฌ์ฉํด ๋ณด๋ฉด์ ๊พธ์คํ ๋ณด์ํด๋๊ฐ์ผ๊ฒ ๋ค.
## ๊ธฐ์ ์ ์ธ ๋ฌธ์ ์ 2 - textarea lose focusing issue
Talk ํ์ด์ง์์ ํฌ์คํธ๋ฅผ ํด๋ฆญํ๋ฉด ๋ํ๋๋ ๋ชจ๋ฌ์ฐฝ์์ ๋๊ธ์ ์์ ํ๋ ค ํ๋ฉด textarea๊ฐ ๋ํ๋์ผํ๋ค. ํ์ง๋ง ๋๊ธ์ ์์ ํ๊ณ ์ ๊ธ์๋ฅผ ์
๋ ฅํ๋ฉด ๋จ ํ ๊ธ์๋ง ์
๋ ฅ์ด ๋๊ณ ํฌ์ปค์ค๋ฅผ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ด ๋ฌธ์ ๋ก ํ์ฐธ์ ๊ตฌ๊ธ๋งํ๋ค. ํด๋น ๋ฌธ์ ๋ ๊ณ ์ ํ key ๊ฐ์ ์์ฑํ๊ธฐ ์ํด ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ฌธ์ด์๋ค. ๊ฐ ๋๊ธ์ map()์ ์ด์ฉํด ๋ ๋๋งํ๋ ๊ณผ์ ์์ key๊ฐ์ผ๋ก v4()๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ผ v4()๋ก ์ธํด virtual dom๊ณผ real dom ๊ฐ์ ์ฐจ์ด๊ฐ ์๊ธฐ๊ณ ๋ฐ๋ผ์ ํ์ด์ง๊ฐ ๋ฆฌ๋ ๋๋ง๋๋ฉฐ textarea๋ ํฌ์ปค์ค๋ฅผ ์๊ฒ ๋๋ค. ํด๋น ๋ฌธ์ ๋ v4()๋ฅผ ์ง์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
reference)
02.14 - input์์ ํ ๊ธ์ ์ ๋ ฅ ํ focus๋ฅผ ์๋ ํ์ / string์ผ๋ก js object ๊ฐ์ ์ ๊ทผํ๊ธฐ
1. input์์ ํ ๊ธ์ ์ ๋ ฅ ํ focus๋ฅผ ์๋ ํ์ react๋ก input์ ์ฌ์ฉํ๋ค๋ณด๋ฉด, ๊ฐ๋ ํ ๊ธ์ ์ ๋ ฅ ํ input์ focus๊ฐ ์ฌ๋ผ์ง๋ ํ์์ด ๋ฐ์ํ๋ค. ์ด๋ฌํ ํ์์ ์์ธ์ 100% state์ ๋ณ๊ฒฝ ๋ฑ์ผ๋ก ์ธํด ํด๋น
psychomildang.tistory.com
## ๊ธฐ์ ์ ์ธ ๋ฌธ์ ์ 3 - ์ํ๊ด๋ฆฌ
์ ์ญ๊ณผ ์ง์ญ์ผ๋ก ๊ด๋ฆฌํ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ๋์ด์์ง ์๋ค๊ณ ํ๋จํ๋ค. ๋ฐ๋ชจ๋ฐ์ด๊ฐ ๋๋ ํ ๊ฐ ์ปดํฌ๋ํธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฆฌํ ํ ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ์์ ํ์๋ค.
์์ง ๊ฐ๋ฐ์ ๋ฏธ์ํ๋ค๋ณด๋, ์ด๊ธฐ ๊ธฐํ ๋จ๊ณ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ง๋ฅผ ์์ธํ๊ฒ ๊ณํํ์ง ์๊ณ ๊ฐ๋ฐ์ ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๊ฐ ์๋ง์ด์๋ค. ์๋ฅผ๋ค์ด ๋ ์จ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ์ค๋์ ๋ ์จ์ ์๋ฅ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ TodayClothes ์ปดํฌ๋ํธ์์๋ง ์ฌ์ฉํ๊ณ ์๋๋ฐ ์ด๋ฅผ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์์๋ค. ์ด๊ธฐ ๊ณํ์ 16์ผ๊ฐ์ ๋ ์จ์ ๋ณด๋ฅผ ๋ฐ์์ TodayClothes์ Closet ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์์ ์ด์์ง๋ง, ํด๋น api๋ ๋์ด์ ๋ฌด๋ฃ๋ก ์ ๊ณตํ์ง ์์ ํ์ฌ์ ๋ ์จ๋ฅผ ๋ฐ์์ค๋ api๋ฅผ TodayClothes์์๋ง ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝํ ํ ์ถ๊ฐ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๋ฐ์ํ ๋ฌธ์ ์๋ค.
ํด๋น ๋ถ๋ถ์ ์ฝ 4์ผ๊ฐ ๋ฆฌํฉํ ๋งํ๋ค.
๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ผ nav bar ๋ฉ๋ด๊ฐ ๋ฌ๋ผ์ง๋ฏ๋ก ์๋ก๊ณ ์นจ ์ด์๊ฐ ์์๋ค. ๋ํ ์๋ก๊ณ ์นจ์ ๋งค๋ฒ ์ฌ์ฉ์์ ์์น ์ ๋ณด๋ฅผ ์๋ก ๋ฐ์์ค๋ ๋ฌธ์ ๋ ์์๋ค. ์ด ๋ถ๋ถ์ ๋ก๊ทธ์ธ ์ฌ๋ถ์ ํ์ฌ ์ฌ์ฉ์์ ์์น์ ๋ณด๋ฅผ localStorage์ ์ ์ฅํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
์ํ๊ด๋ฆฌ๋, ๊ฐ ์ปดํฌ๋ํธ ๋ณ๋ก ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ธ์ง ์ ๋ฆฌํ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ ๋ณ์๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ง ์ ๋ฆฌํ์ฌ ์ฝ๋๋ฅผ ์์ ํ๋ค.
component | Necessary Data |
Login/App | post, usePost |
TodayClothes | userPost, defaultPost, weather |
Talk | post, publicPost |
Closet | userPost, nextWeekUserPost, usePost |
Record | userPost |
Logout |
## ๊ธฐ์ ์ ์ธ ๋ฌธ์ ์ 4 - ๋ฌดํ์คํฌ๋กค
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋์ , ๋ฌดํ์คํฌ๋กค ์ฝ๋๋ฅผ ์ง์ ์์ฑํด๋ณด๊ณ ์ถ์๋ค. ํ์ง๋ง, 2๊ฐ์ง ๋ฌธ์ ๊ฐ ์์๋ค.
- ํ๋ฉด์ ๋๋น์ ๋ฐ๋ผ ๋ฌดํ์คํฌ๋กค ๋์ ์ํจ
: ํด๋น ๋ถ๋ถ์ 'if (window.innerHeight + window.scrollY >= document.body.offsetHeight && posts)' ๋ถ๋ถ์์ ์๋ฌ๊ฐ ์์๋ค. window.innerHeight + window.scrollY์ ๊ฐ์ด document.body.offsetHeight && posts ๋ณด๋ค ์์์ ์ดํ๋ก ๋ฏธ์ธํ๊ฒ ์์ ํด๋น ์กฐ๊ฑด๋ฌธ์ ํต๊ณผํ์ง ๋ชปํด ๋ฐ์ํ ๋ฌธ์ ์๋ค. ํด๋น ๋ฌธ์ ๋ Math.ceil()์ ์ฌ์ฉํด window.innerHeight + window.scrollY ์ ๊ฐ์ ๋ฐ์ฌ๋ฆผ ํด์ฃผ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
- ์ต๊ทผ์ ๋ฑ๋ก๋ ๊ฒ์๋ฌผ ์์๋๋ก ๋ถ๋ฌ์ค๊ธฐ
: ๋ฐ์ดํฐ ํธ์ถ ์, orderBy()์ ๋ด๋ฆผ์ฐจ์ ์ต์
์ ์ฌ์ฉํ์์๋ Talk ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๊ฐ ์ค๋ณตํด์ ๋ถ๋ฌ์์ง๊ณ ์ต์ ์์ผ๋ก ์ ๋ ฌ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์๋ค. ํน์ firebase์ getDocs()๋ฅผ ์ ๋ชป ์ฌ์ฉํ๊ณ ์๋๊ฑด ์๋์ง ๋ช ์ผ ๋์ ๊ตฌ๊ธ๋ง๋ ํ๊ณ ๊ณต์ ๋ฌธ์๋ ์ฝ์์ง๋ง, ๋ต์ ์ฐพ์ง ๋ชปํ๋ค. ํ์ง๋ง, ๋ฑ์๋ฐ์ด ์ด๋ก๋ค๊ณ , ์ด๊ธฐ์ ๊ฒ์๋ฌผ ๋ฐ์ดํฐ๋ createdAt์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ง๋ง, ์ดํ์ ๋ฌดํ์คํฌ๋กค์ด ๋์ํ ๋๋ ํด๋น ์ต์
์ ๋ฃ์ด์ฃผ์ง ์์ ๋ฐ์ํ ๋ฌธ์ ์๋ค. ์๋๋ค๊ณ ๋งํ๊ธฐ ์ ์ ์ข ๋ ๊ผผ๊ผผํ ๋ณด๋ ์ต๊ด์ ๊ธธ๋ฌ์ผ๊ฒ ๋ค... ํํ
## ์๋ก ๋ฐฐ์ด stack
- Tailwindcss / DaisyUI
: ์ง๋ React shop ํ๋ก์ ํธ์์ ๋ฉํ ๋์ด ์ถ์ฒํด์ฃผ์
์ ์ฒ์ ์ฌ์ฉํด๋ณด์๋ค. Tailwindcss๋ className์ ์ฌ์ฉํด ์คํ์ผ์ ์ถ๊ฐํ๋ ํํ์ธ๋ฐ, ๋ฐ๋ก css ๋ฌธ์๋ฅผ ์์ฑํ์ง ์๊ณ ์ง๊ด์ ์ธ ๋จ์ถ์ด๋ก ์คํ์ผ์ ์ถ๊ฐํ ์ ์์ด ํธ๋ฆฌํ๋ค. DaisyUI๋ UI ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ด๋ฏธ ๋ง๋ค์ด์ ธ ์๋๊ฑธ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ฉด ๋๋ ํํ๋ผ ํธ๋ฆฌํ๋ค. Bootstrap๋ง ์ฌ์ฉํด๋ณด์๋๋ฐ, Tailwindcss์ DaisyUI๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ด ํจ์ฌ ์์ํด์ ธ์ ์ ์ธ๊ณ์ด๋ค.
- Recoil
: ์ด ๋ํ ์ง๋ ํ๋ก์ ํธ์์ ๋ฉํ ๋์ด ์ถ์ฒํด์ฃผ์
์ ์ฌ์ฉํ๊ฒ ๋์๋ค. Redux์ context.api๋ ์ด์ ์ ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ด ์์ง๋ง, Recoil์ ์ฒ์์ด๋ผ ์ฌ์ฉํด๋ณด์๋ค. Recoil์ ํ์ด์ค๋ถ์์ ๋ง๋ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ๊ธฐ์ ๋ณต์กํ์ง ์๊ณ react์ ๋น์ทํด ์ดํดํ๊ธฐ ์์ํ๋ค.(๋ฌผ๋ก ์ฒ์ ์ฌ์ฉํด๋ณด๋์ง๋ผ ์ด๋ ค์๋ ์์๊ณ ์๋ฌ๋ ๋ฐ์ํ์๋คใ
)
ํ์ง๋ง Recoil์ ์ฌ์ฉํ๋ฉด์, '๋ณ์๋ค์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค๋ ์ด์ ๋ก ์ ์ญ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ด ๋ง๋๊ฐ?' ๋ผ๋ ์๋ฌธ์ด ๋ค์๋ค. ๊ทธ๋์ ํ๋ก์ ํธ ์ค๊ฐ์ ๊ฐ์ง ๋ฉํ ๋๊ณผ์ 15๋ถ๊ฐ์ ๋ฏธํ
์ค์ ํด๋น ๋ถ๋ถ์ ๋ํด ์ง๋ฌธํ๊ณ , 'ํ์
์์๋ ์ฃผ๋ก context api๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ด์ฉ ์ ์๋ ๊ฒฝ์ฐ ์ ์ญ์ผ๋ก ๊ด๋ฆฌํ๋ค'๋ผ๋ ๋๋ต์ ๋ค์๋ค. ์ญ์, Recoil์ ์ฌ์ฉํด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ ๋๊ผ๋ ์ด ์ฐ์ฐํจ์ ํ๋ฆฌ์ง ์์๋ค. ์์ง์ ๋ง์ด ๋ถ์กฑํ์ง๋ง, ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋, ์ํ๊ด๋ฆฌ์ ์ข ๋ ์ ๊ฒฝ์จ์ผ๊ฒ ๋ค.
'๊ฐ๋ฐ ๊ณต๋ถ > Projects' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Project) Olchaeneez NFT Preview(23.08.19 ์์ ) (1) | 2023.08.06 |
---|---|
Project) ์๋ฐ์ ์ด์ปค๋จธ์ค (0) | 2023.07.31 |
Practice) React Shop ํ๊ณ (0) | 2023.04.20 |
Practice) React Shop - Day 3 (0) | 2023.04.17 |
Practice) React Shop - Day 2 (0) | 2023.04.15 |