๊ฐœ๋ฐœ ๊ณต๋ถ€/Projects

Practice) ๊ฐœ์ธํ”„๋กœ์ ํŠธ - Today's Clothing

Ryomi 2023. 5. 28. 21:35
728x90
๋ฐ˜์‘ํ˜•

  ๐Ÿ”—๋ฐฐํฌ๋งํฌ      ๐Ÿ”—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์— ์ €์žฅํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. 
์ƒํƒœ๊ด€๋ฆฌ๋Š”, ๊ฐ ์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ–ˆ๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ์ง€ ์ •๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ๋‹ค. 

componentNecessary Data
Login/Apppost, usePost
TodayClothesuserPost, defaultPost, weather
Talkpost, publicPost
ClosetuserPost, nextWeekUserPost, usePost
RecorduserPost
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์„ ์‚ฌ์šฉํ•ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋А๊ผˆ๋˜ ์ด ์ฐ์ฐํ•จ์€ ํ‹€๋ฆฌ์ง€ ์•Š์•˜๋‹ค. ์•„์ง์€ ๋งŽ์ด ๋ถ€์กฑํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ์ƒํƒœ๊ด€๋ฆฌ์— ์ข€ ๋” ์‹ ๊ฒฝ์จ์•ผ๊ฒ ๋‹ค. 

728x90
๋ฐ˜์‘ํ˜•