๐Ÿ“ธ ํŒ€ํ”„๋กœ์ ํŠธ '#์ฐฐ์นต' ํšŒ๊ณ ๋ก

sohyuniyaaยท2023๋…„ 9์›” 24์ผ
4

ํšŒ๊ณ ๋ก

๋ชฉ๋ก ๋ณด๊ธฐ
5/6

๐Ÿ“ธ #์ฐฐ์นต ํ”„๋กœ์ ํŠธ

๊ธฐํš ๋ฐฐ๊ฒฝ

  1. ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ํ™˜์ ˆ๊ธฐ๋‚˜ ์ผ๊ต์ฐจ๊ฐ€ ์‹ฌํ•œ ๋‚ ์”จ์— "๊ฒ‰์˜ท์„ ๊ฑธ์น ๊นŒ ๋ง๊นŒ.." ์ƒ๊ฐํ•˜๊ณ  ํ›„ํšŒํ–ˆ๋˜ ๊ฒฝํ—˜
  2. "์˜ค๋Š˜ ์˜ท ์ข€ ์ž˜ ๋ฐ›๋„ค?" ํ˜น์€ "์˜ค๋Š˜ ๋‚˜ ์ข€ ๋ฉ‹์ง„๋ฐ?" ํ•˜๋Š” ์ˆœ๊ฐ„์„ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜ ์ž๋ž‘ํ•˜๊ณ  ์‹ถ์—ˆ๋˜ ๊ฒฝํ—˜
  3. "์‚ด ์ช˜๋Š”๋ฐ ๋ญ ์ž…์ง€.." ๋ผ๋˜๊ฐ€, "๋‚ด ํ•์€ ์™œ ์ด๋Ÿฌ์ง€?" ๋ผ๊ณ  ๊ณ ๋ฏผํ•œ ๊ฒฝํ—˜

์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ๋Š” ์˜ท์œผ๋กœ ๋ˆ„๊ตฌ๋‚˜ ๋งž์ดํ–ˆ๋˜ ์˜จ๊ฐ– ๊ฒฝํ—˜๋“ค์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, ๊ณ ๋ฏผ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐํšํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿ’ก ํ˜„์žฌ ์œ„์น˜์˜ ๋‚ ์”จ, ๋‚˜์˜ ์ฒดํ˜•, ๊ด€์‹ฌ์žˆ๋Š” ์Šคํƒ€์ผ์„ ํƒœ๊ทธํ™” ํ•˜์—ฌ, ํ™œ์„ฑํ™” ๋œ ํƒœ๊ทธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณผ๊ฑฐ์˜ ๋‚˜ ํ˜น์€ ๋‚จ์ด ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์„ ์ถ”์ฒœ
์ด์™ธ์—๋„ ๋‚ด๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ํŒ”๋กœ์šฐํ•˜์—ฌ ๋ชจ์•„ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์ข‹์•„ํ•˜๋Š” ์‚ฌ์ง„์— ์ข‹์•„์š”๋ฅผ ๋ˆ„๋ฅด๊ณ  ๋Œ“๊ธ€์„ ๋‹ค๋Š” ๋“ฑ์˜ SNS ๊ธฐ๋Šฅ์„ ์ด์šฉ

๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ ํŒ€์›

ํ•จ๊ป˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ํŒ€ ์ด๋ฆ„์€ ์ตœ๊ณ ๊ฐ€ ๋œ ์กฐ โ—๏ธ
ํŒ€ ์ธ์›์€ ์ด 6๋ช…์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ  ํฌ์ง€์…˜์€ ๋ฐฑ์—”๋“œ 3๋ช…๊ณผ ๋‚˜๋ฅผ ํฌํ•จํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ 3๋ช…์ด๋‹ค.


๋งค์ผ ํ•จ๊ป˜ ํ•˜๋Š” ๊ณต๊ฐ„ Gather Town ๐Ÿก ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ๐Ÿ—ฃ๏ธ
๋งค์ฃผ ํ™”์š”์ผ, ๊ธˆ์š”์ผ ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์ „์ฒด ํšŒ์˜๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ ์ƒํ™ฉ, ์ฐจ์ฃผ ๊ณ„ํš, ์ฃผ์š” ์•ˆ๊ฑด ๋“ฑ ํšŒ์˜๋ฅผ ์ง„ํ–‰ํ–ˆ๊ณ 
ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋งค์ผ ๋ฐ์ผ๋ฆฌ์Šคํฌ๋Ÿผ์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ž‘์—…ํ•  ๋•Œ ๋งˆ๋‹ค ๊ฒŒ๋”์— ์ ‘์†ํ•ด์„œ ๊ทธ๋ƒฅ ์‹ฌ์‹ฌํ•˜๊ฑฐ๋‚˜ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด๋‚˜ ์„œ์Šค๋Ÿผ ์—†์ด ํŒ€์›๋“ค๊ณผ ์†Œํ†ตํ–ˆ์—ˆ๋‹ค.
์šฐ๋ฆฌ ์กฐ๊ฐ€ ํŒ€์›Œํฌ๊ฐ€ ์ œ์ผ ์ข‹๋‹ค๊ณ  ์ž๋ถ€ํ•  ์ˆ˜ ์žˆ์Œ!!
์ง€๊ธˆ ํ”„๋กœ์ ํŠธ์— ์ด์–ด์„œ ๋ฆฌํŒฉํ† ๋ง๋„ ๊ฐ™์ด ํ•˜๊ธฐ๋กœ ์•ฝ์†ํ–ˆ๋‹ค. ๐Ÿ˜

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

FrontEnd

BackEnd


๐Ÿ’ป ๋‚ด๊ฐ€ ์ง„ํ–‰ํ•œ ์ž‘์—… ๋ชฉํ‘œ๋ฌผ

  • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€
  • ๋ฉ”์ธ ํŽ˜์ด์ง€
  • ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€

๐Ÿ’ญ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉฐ ๋А๋‚€์ 

1. ์„ธ์„ธํ•œ ๊ตฌ์„ฑ๊ณผ ๊ณ„ํš
๋””์ž์ด๋„ˆ๋‚˜ PM์ด ๋”ฐ๋กœ ์—†๋‹ค๋ณด๋‹ˆ ๋กœ์ง์ด๋‚˜ ๊ธฐํš์ ์ธ ๋ถ€๋ถ„์ด ์‚ฌ์‹ค ์–ด๋ ค์› ๋‹ค.
๋ฐฑ์—”๋“œ์™€ ํ˜‘์—…ํ•˜๋Š” ์ž‘์—…์ด ์ฒ˜์Œ์ด๋‹ค๋ณด๋‹ˆ ๋ฐฑ์—”๋“œ์—์„œ ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋””๊นŒ์ง€ ์ž‘์—…์„ ํ•ด์ฃผ๋Š”๊ฑด์ง€ ๋ฉ”์ธํŽ˜์ด์ง€ ์ž‘์—…ํ•˜๋ฉด์„œ ๊ต‰์žฅํžˆ ํ—ค๋งธ์—ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ๋†“์นœ ๋ถ€๋ถ„๋„ ๋งŽ์•˜๊ณ  ๋ฐฑ์—”๋“œ์—์„œ๋„ ์ˆ˜์ •๋œ ๋กœ์ง์ด ๋งŽ์•˜๋‹ค.

2. ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…
๋ฐฑ์—”๋“œ์™€ ํ˜‘์—…ํ•˜๋ฉด์„œ api ๊ด€๋ จ ๊ณต๋ถ€๋ฅผ ๋” ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋А๊ผˆ๋‹ค.
์ „์—ญ์ƒํƒœ ๊ด€๋ฆฌ ๋˜ํ•œ recoil๋กœ ์ฒ˜์Œ ์ ‘ํ•ด๋ณด์•˜๋Š”๋ฐ ์ƒˆ๋กœ๊ณ ์นจ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค ๋‚ ๋ผ๊ฐ€์„œ ์ข‹์•„์š” ๊ธฐ๋Šฅ์ด๋‚˜, ํšŒ์› ์ •๋ณด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด์„œ ๋ฉ”์ธ ํŽ˜์ด์ง€ ์ถ”์ฒœ ์˜์—ญ๋„ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ๋ฉ”์ธ ํŽ˜์ด์ง€

<๋กœ๊ทธ์ธ ๊ฒฝ์šฐ>
- ํšŒ์›๊ฐ€์ž… ์‹œ ์ž…๋ ฅํ•œ ๊ด€์‹ฌ ํ‚ค์›Œ๋“œ๊ฐ€ ๋””ํดํŠธ๋กœ ์ถ”์ฒœ ๋จ
- ์ฒดํ˜• ๋ฐ ํ‚ค์›Œ๋“œ ์„ ํƒ ๊ฒ€์ƒ‰(์ข‹์•„์š” 60%, ์กฐํšŒ์ˆ˜ 40% ๊ฐ€์ค‘์น˜)
- ์ฒดํ˜•์—์„œ ๋งˆ์ด์‚ฌ์ด์ฆˆ๋ฅผ ํ† ๊ธ€์„ ์ ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํšŒ์›๊ฐ€์ž… ์‹œ ์ž…๋ ฅํ–ˆ๋˜ ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ๋กœ ์ถ”์ฒœ

<๋น„๋กœ๊ทธ์ธ ๊ฒฝ์šฐ>
- '์ „์ฒด' ํ‚ค์›Œ๋“œ๊ฐ€ ๋””ํดํŠธ ๋˜์–ด ์ตœ์‹ ์ˆœ ๊ฒŒ์‹œ๋ฌผ ์ถ”์ฒœ
- ์ฒดํ˜• ๋ฐ ํ‚ค์›Œ๋“œ ์„ ํƒ ๊ฒ€์ƒ‰(์ข‹์•„์š” 60%, ์กฐํšŒ์ˆ˜ 40% ๊ฐ€์ค‘์น˜)

ํ˜„์žฌ ๋‚ ์”จ์™€ ์˜ค๋Š˜ ๋‚ ์”จ์™€ ์–ด์šธ๋ฆฌ๋Š” ์Šคํƒ€์ผ
ํ˜„์žฌ ๋‚ ์”จ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” openWeatherAPI๋ฅผ ํ™œ์šฉํ–ˆ๊ณ , ์˜ค๋Š˜ ๋‚ ์”จ์™€ ์–ด์šธ๋ฆฌ๋Š” ์Šคํ‹ฐ์ผ ์ถ”์ฒœ ์˜์—ญ์€ ์‚ฌ์šฉ์ž์˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ๋ฐ›์€ ํ›„์— ์œ„๋„์™€ ๊ฒฝ๋„๋กœ ๋‚ ์”จ ์ •๋ณด๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๊ฒŒ์‹œ๊ธ€์— ์žˆ๋Š” ํ‚ค์›Œ๋“œ์™€ ์ผ์น˜์‹œ์ผœ ์ถ”์ฒœ ํ•ด์ฃผ๋Š” ์˜์—ญ์ด๋‹ค.

์˜ค๋Š˜ ๋‚ ์”จ์™€ ์–ด์šธ๋ฆฌ๋Š” ์Šคํƒ€์ผ์€ ์บ๋Ÿฌ์…€ ์˜์—ญ์ธ๋ฐ,
์ฒ˜์Œ์—๋Š” ๋ฆฌ์•กํŠธ ์Šฌ๋ฆญ ์บ๋Ÿฌ์…€์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์Šฌ๋ผ์ด๋“œ ๊ธฐ๋Šฅ์„ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ๋” ์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ๋งŒ ์™„์ „ํžˆ ๋ณด์—ฌ์ฃผ๊ณ  ๋‘ ๋ฒˆ์งธ ์•„์ดํ…œ์€ ์ผ๋ถ€๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์•„ Swiper ์บ๋Ÿฌ์…€๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.

ํ‚ค์›Œ๋“œ ์ถ”์ฒœ
ํ‚ค์›Œ๋“œ ์ถ”์ฒœ ์˜์—ญ์—์„œ ๊ฒŒ์‹œ๋ฌผ์„ useInfiniteScroll๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ์Šคํฌ๋กค์„ ๋‚ด๋ ค๋„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ์ ์— ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜์—ˆ๋‹ค.

  • problem : ํ‚ค์›Œ๋“œ ์ถ”์ฒœ api ํ˜ธ์ถœ ์‹œ, ์ฒ˜์Œ ๊ฒŒ์‹œ๋ฌผ 4๊ฐœ๋งŒ ๋ณด์—ฌ์ง€๊ณ , ์Šคํฌ๋กค์„ ๋‚ด๋ ค๋„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋กœ๋“œ๊ฐ€ ์•ˆ๋จ
  • reason: scrollEvent ์—์„œ ๋‹ฟ๋Š” ๋ถ€๋ถ„์ด ์ œ๋Œ€๋กœ ๊ณ„์‚ฐ์ด ์•ˆ๋  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•ด๋ด„
  • Try to solve : ์ง์ ‘ ๋‚ด๋ถ€ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ๊ตฌํ˜„์ด๋ผ๋˜์ง€, ๊ฐ’์ด ์ œ๋Œ€๋กœ ๊ณ„์‚ฐ์ด ์•ˆ๋  ์ˆ˜ ๋„ ์žˆ๋‹ค๋Š” ํŒ๋‹จํ•˜์— useInfiniteQueryํ›… ๋ฐ window.scrollEvent๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  IntersectionObserver ๋ฅผ ์ถ”๊ฐ€
    useInfiniteQuery๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ๋ฌผ์„ ๊ด€๋ฆฌํ•˜๊ณ , ๋งˆ์ง€๋ง‰ element์— ๋‹ฟ์•˜์„ ๋•Œ ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๋ฌผ์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •

api๊ฐ€ ์ค‘๋ณต ํ˜ธ์ถœ๋˜๋ฉด์„œ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋  ๋•Œ, ํ‚ค์›Œ๋“œ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๊ฒŒ์‹œ๋ฌผ์ด ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์ฒดํ˜• ์กฐ๊ฑด์—์„œ ๋กœ๊ทธ์ธ ์œ ์ €๋Š” ์ง์ ‘ ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋งˆ์ด์‚ฌ์ด์ฆˆ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋ฉด body ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜์ง€์•Š๊ฑฐ๋‚˜ null๋กœ ์ถœ๋ ฅ๋˜์–ด ์กฐ๊ฑด ํ•„ํ„ฐ๋ง์ด ์•ˆ๋˜๋Š” ๋ฌธ์ œ๋„ ์žˆ์—ˆ๋‹ค.

  • Problem :
  1. api ์ค‘๋ณต ํ˜ธ์ถœ : ์ฒ˜์Œ ํ˜ธ์ถœ์—์„œ 0ํŽ˜์ด์ง€๊ฐ€ ๋จผ์ € ํ˜ธ์ถœ ๋œ ํ›„ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด ํŽ˜์ด์ง€1์ด ๋‚˜์™€์•ผํ•˜๋Š”๋ฐ ๋™์‹œ์— ์ค‘๋ณต ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜๊ณ , ๋˜ํ•œ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด์„œ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๊ฑฐ๋‚˜, ํ‚ค์›Œ๋“œ ํ•„ํ„ฐ๋ง ์กฐ๊ฑด์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๊ฒŒ์‹œ๋ฌผ์ด ํ˜ธ์ถœ๋˜๊ณ  ์žˆ๋Š”๋ฐ ๊ฐ™์€ ๊ฒŒ์‹œ๋ฌผ์ด ์ค‘๋ณต๋˜๋Š” ๋ฌธ์ œ

  2. ๋กœ๊ทธ์ธ ๋ฐ ๋น„๋กœ๊ทธ์ธ ์œ ์ € ์ฒดํ˜• ์„ค์ • ํ•„ํ„ฐ๋ง : ๋น„๋กœ๊ทธ์ธ ์œ ์ €๊ฐ€ ํ‚ค๋ž‘ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ ์šฉํ•˜๊ธฐ ๋ฒ„ํŠผ๊นŒ์ง€ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด ๊ฒŒ์‹œ๋ฌผ์ด ๋‹ค์‹œ ์ดˆ๊ธฐํ™”๋˜๋ฉด์„œ body๊ฐ’์— ๋ณด๋‚ด์ค„ height์™€ weight ๊ฐ’์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๊ณ  ์žˆ์ง€๋งŒ, ๋กœ๊ทธ์ธ ์œ ์ €๋Š” ๊ฐ€์ž… ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ–ˆ๋˜ ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ๊ฐ€ body ๊ฐ’์— ๋“ค์–ด๊ฐ€์žˆ๊ณ , ์ฒดํ˜• ๋ชจ๋‹ฌ์—์„œ ์ง์ ‘ ํ‚ค๋ž‘ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์ ์šฉํ•˜๋ฉด ์ž…๋ ฅํ•œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผํ•˜๋Š”๋ฐ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ ๊ณผ ๋งˆ์ด์‚ฌ์ด์ฆˆ ํ† ๊ธ€์„ ๋ˆ„๋ฅด๋ฉด ๊ฐ€์ž…์‹œ ์ž…๋ ฅํ–ˆ๋˜ ์›๋ž˜ ์ •๋ณด๊ฐ€ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์™€์ ธ์•ผํ•˜๋Š”๋ฐ null๊ฐ’์œผ๋กœ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ

  • Reason:
  1. api ์ค‘๋ณต ํ˜ธ์ถœ๊ณผ ๊ฒŒ์‹œ๋ฌผ : useEffect๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์–ด์„œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๊ฐ€ ๋‚˜๋Š” ๋ฌธ์ œ์ธ๊ฒƒ ๊ฐ™๋‹ค.
    fetchPosts ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉด์„œ pageParam์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค fetchPosts๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ๊ทธ๋ฆฌ๊ณ  ํ•„ํ„ฐ๋ง ์กฐ๊ฑด(selectedStyleTags, inputHeight, inputWeight)์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋„ ๊ฒŒ์‹œ๋ฌผ ๋ชฉ๋ก์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ pageParam ๊ฐ’์˜ ๋ณ€ํ™”๋กœ ์ธํ•ด ๋‹ค์‹œ fetchPosts๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ ์ค‘๋ณต ํ˜ธ์ถœ๊ณผ ์ค‘๋ณต ๊ฒŒ์‹œ๋ฌผ์ด ๋‚˜์˜ค๋Š”๊ฒƒ ๊ฐ™๋‹ค.

  2. ์ฒดํ˜• ์กฐ๊ฑด๋ฌธ : ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ, ์ฒซ ๋ฒˆ์งธ ์กฐ๊ฑด๋ฌธ(loggedInUser.isLoggedIn && isMySizeApplied) ์ธ ์ ์šฉ ๋ถ€๋ถ„์ด ์ฐธ์ด๋ฏ€๋กœ ์ด ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ , ๋‘ ๋ฒˆ์งธ ์กฐ๊ฑด๋ฌธ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฐ˜์˜์ด ์•ˆ๋จ
    ๋”ฐ๋ผ์„œ, useEffect ๋‚ด๋ถ€์˜ ์กฐ๊ฑด๋ฌธ์—์„œ๋Š” ๋กœ๊ทธ์ธ ์‚ฌ์šฉ์ž(loggedInUser.isLoggedIn)์ด๋ฉด์„œ '์ ์šฉํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ ๊ฒฝ์šฐ(isMySizeApplied)์—๋งŒ ์ฒซ ๋ฒˆ์งธ ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์œผ๋กœ ํ‰๊ฐ€๋˜์–ด ํ•ด๋‹น ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰

  • Try to solve :
  1. useEffect ์ˆ˜์ • : api ํ˜ธ์ถœ fetchPosts ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด
    pageParam === 0 ์ด ์•„๋‹Œ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ๊ฒŒ์‹œ๋ฌผ ๋ฐ์ดํ„ฐ ๋’ค์— ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๋ฌผ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ˆ˜์ •
    const [pageParam, setPageParam] = useState(-1); ์ดˆ๊ธฐ๊ฐ’์„ -1๋กœ ์„ค์ •ํ•˜๊ณ  useEffect ๋‚ด๋ถ€์—์„œ if (pageParam === -1) return; ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด pageParam ๊ฐ’์ด -1์ผ ๋•Œ๋Š” API ํ˜ธ์ถœ์„ ์ค‘๋‹จํ•˜๋„๋ก ์„ค์ •
    ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์Šคํฌ๋กคํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฒŒ์‹œ๋ฌผ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋™์ž‘์ด ์‹œ์ž‘๋˜๊ธฐ ์ „๊นŒ์ง€๋Š”(pageParam์ด 0 ์ด์ƒ์˜ ๊ฐ’์„ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€) ์‹ค์ œ ๊ฒŒ์‹œ๋ฌผ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š๊ฒŒ ๋จ

  2. ์ฒดํ˜• ์กฐ๊ฑด๋ฌธ ์ˆ˜์ • : ๋ชจ๋“  ์กฐ๊ฑด์ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด, else if๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์—ฌ๋Ÿฌ ๊ฐœ์˜ if ๋ฌธ์„ ์‚ฌ์šฉ
    ๋กœ๊ทธ์ธ ์ƒํƒœ์™€ ๊ด€๊ณ„์—†์ด ์ง์ ‘ ํ‚ค์™€ ๋ชธ๋ฌด๊ฒŒ ๊ฐ’์„ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ํ•ญ์ƒ ํ•ด๋‹น ๊ฐ’๋“ค์ด ๋ฐ˜์˜

๐Ÿ”Ž ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€

๊ฒ€์ƒ‰ ํŽ˜์ด์ง€์—๋Š” ์ „์ฒด/๊ณ„์ •/ํ”ผ๋“œ/ํƒœ๊ทธ ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด์„œ ํƒญ์œผ๋กœ ๊ตฌ๋ถ„์„ ํ•˜์˜€๋‹ค. ํŽ˜์ด์ง€ ์ด๋™์„ ์•ˆํ•˜๊ณ , ํƒญ์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ๊ฐœ์ธ์ ์œผ๋กœ ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€๋Š” ๋„ˆ๋ฌด ๋ง˜์—๋“ ๋‹ค ๐Ÿ˜Ž

const [tab, setTab] = useState("์ „์ฒด");

{/*Tab navigation*/}
        <nav className="mt-6 w-full h-[44px] flex justify-around items-center">
          {["์ „์ฒด", "๊ณ„์ •", "ํ”ผ๋“œ", "ํƒœ๊ทธ"].map((name) => (
            <div
              key={name}
              className={`pb-2 text-center w-full ${
                tab === name ? "border-b-2 border-black text-gray-900" : "border-b border-gray-200 text-gray-400"
              }`}
            >
              <button onClick={() => setTab(name)} className="text-[16px] font-bold">
                {name}
              </button>
            </div>
          ))}
        </nav>

๊ณ„์ • / ํ”ผ๋“œ / ํƒœ๊ทธ (styleTags, hashTags) ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ api๋ฅผ ํ•œ๋ฒˆ์— ๋ถˆ๋Ÿฌ์™€์„œ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— 4๊ฐœ์˜ api๊ฐ€ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๊ณ  ๋ชจ๋“  ์š”์ฒญ์ด ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ Promise.all๋กœ ๋ฌถ์–ด์ฃผ์—ˆ๋‹ค.

ํ‚ค๋ณด๋“œ๋ฅผ ์ž…๋ ฅํ•  ๋•Œ๋งˆ๋‹ค api๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์–ด debounce: lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํ•จ์ˆ˜๋กœ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋ฅผ ์ง€์—ฐ์‹œํ‚ค๊ณ  ์—ฐ์† ํ˜ธ์ถœ์„ ์ œํ•œํ–ˆ๋‹ค.

์ „์ฒด ํƒญ์—์„œ๋Š” ๊ณ„์ •/ํ”ผ๋“œ/ํƒœ๊ทธ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์ผ๋ถ€ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•จ์œผ๋กœ์จ slice๋ฅผ ์ด์šฉํ•˜๊ณ ,
โ€˜๋”๋ณด๊ธฐโ€™๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ํ•ด๋‹น ํƒญ์œผ๋กœ ์ด๋™ํ•˜์—ฌ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๐Ÿ“ฑ๋ฆฌํŒฉํ† ๋ง ์˜ˆ์ •์ด๋ผ๋ฉด

  1. ํ†ค์•ค๋งค๋„ˆ
    ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด์ ์ธ ํ†ค์ด๋‚˜, ํฐํŠธ ๋“ฑ ์ƒ๊ฐํ•ด์„œ ๋งž์ถ˜๋‹ค๊ณ  ๋งž์ท„๋˜๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ฐ์ž ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๋‹ค๋ฅธ ์ ์ด ์žˆ์„ ๊ฑฐ๋ผ ์ƒ๊ฐ๋œ๋‹ค. modal ๋ถ€๋ถ„์ด๋‚˜ alert ๊ฐ™์€ ๋ถ€๋ถ„๋“ค (?)

  2. ์ถ”์ฒœ ์˜์—ญ
    ํ‚ค์›Œ๋“œ ์ถ”์ฒœ ๋ถ€๋ถ„ ๊ฐ•ํ™” (๋ฒ„ํŠผ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค API ํ˜ธ์ถœ โ†’ ์บ์‹ฑ์œผ๋กœ ๋Œ€์ฒด?)
    ์ฒดํ˜•๋ณ„ ์ถ”์ฒœ์ด ์ž˜ ์•ˆ๋จ
    api ์ˆ˜์ •๋„ ํ•„์š”!

  3. recoil ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€
    ์ƒˆ๋กœ๊ณ ์นจ์‹œ์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜๋„๋ก ๋ณด์™„

  4. feature
    ์•Œ๋ฆผ ๊ธฐ๋Šฅ
    ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ/์ˆ˜์ •
    ์ฑ„ํŒ… ๊ธฐ๋Šฅ


๐Ÿ˜‰ ์‚ฌ์ดํŠธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://chal-kak.vercel.app/main

profile
์šฐ๋‹นํƒ•ํƒ• ํ”„๋ก ํŠธ์—”๋“œ ์ฝ”๋ฆฐ์ด ๊ณต๊ฐ„ ๐Ÿ™†๐Ÿปโ€โ™€๏ธ

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2023๋…„ 10์›” 2์ผ

์‹ค์ œ ์„œ๋น„์Šคํ•˜๋Š” ์ •๋„์˜ ํ€„๋ฆฌํ‹ฐ ๊ฐ™์•„์š”!! ์˜๊ฐ๋ฐ›๊ณ  ๊ฐ‘๋‹ˆ๋‹ค ใ…Ž

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ