
- ๊ธฐ๊ฐ : 2023. 08. 04 ~ 2023. 09. 13
- ์ฌ์ฉ์ ๋ง์ถคํ ๊ฒ์๊ธ ์ถ์ฒ ํจ์ SNS
- ๋ฐฐํฌ ๋งํฌ: ์ฐฐ์นต
- ๊นํ๋ธ ๋งํฌ: ๊นํ๋ธ ์ฐฐ์นต
์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์ท์ผ๋ก ๋๊ตฌ๋ ๋ง์ดํ๋ ์จ๊ฐ ๊ฒฝํ๋ค์์ ์์ํ์ฌ, ๊ณ ๋ฏผ์ ํด๊ฒฐํ๊ธฐ ์ํด ๊ธฐํํ๊ฒ ๋์๋ค.
๐ก ํ์ฌ ์์น์ ๋ ์จ, ๋์ ์ฒดํ, ๊ด์ฌ์๋ ์คํ์ผ์ ํ๊ทธํ ํ์ฌ, ํ์ฑํ ๋ ํ๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณผ๊ฑฐ์ ๋ ํน์ ๋จ์ด ์์ฑํ ๊ฒ์๊ธ์ ์ถ์ฒ
์ด์ธ์๋ ๋ด๊ฐ ๊ด์ฌ ์๋ ์ฌ๋๋ค์ ํ๋ก์ฐํ์ฌ ๋ชจ์ ๋ณผ ์ ์๊ณ , ์ข์ํ๋ ์ฌ์ง์ ์ข์์๋ฅผ ๋๋ฅด๊ณ ๋๊ธ์ ๋ค๋ ๋ฑ์ SNS ๊ธฐ๋ฅ์ ์ด์ฉ
ํจ๊ป ํ๋ก์ ํธ๋ฅผ ์งํํ ํ ์ด๋ฆ์ ์ต๊ณ ๊ฐ ๋ ์กฐ โ๏ธ
ํ ์ธ์์ ์ด 6๋ช
์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ ํฌ์ง์
์ ๋ฐฑ์๋ 3๋ช
๊ณผ ๋๋ฅผ ํฌํจํ์ฌ ํ๋ก ํธ์๋ 3๋ช
์ด๋ค.

๋งค์ผ ํจ๊ป ํ๋ ๊ณต๊ฐ Gather Town ๐ก ๐จโ๐จโ๐งโ๐ฆ๐ฃ๏ธ
๋งค์ฃผ ํ์์ผ, ๊ธ์์ผ ๋ฐฑ์๋์ ํ๋ก ํธ์๋๋ ์ ์ฒด ํ์๋ฅผ ํตํด ์งํ ์ํฉ, ์ฐจ์ฃผ ๊ณํ, ์ฃผ์ ์๊ฑด ๋ฑ ํ์๋ฅผ ์งํํ๊ณ
ํ๋ก ํธ์๋๋ ๋งค์ผ ๋ฐ์ผ๋ฆฌ์คํฌ๋ผ์ ์งํํ๋ค. ์์
ํ ๋ ๋ง๋ค ๊ฒ๋์ ์ ์ํด์ ๊ทธ๋ฅ ์ฌ์ฌํ๊ฑฐ๋ ๋งํ๋ ๋ถ๋ถ์ด๋ ์์ค๋ผ ์์ด ํ์๋ค๊ณผ ์ํตํ์๋ค.
์ฐ๋ฆฌ ์กฐ๊ฐ ํ์ํฌ๊ฐ ์ ์ผ ์ข๋ค๊ณ ์๋ถํ ์ ์์!!
์ง๊ธ ํ๋ก์ ํธ์ ์ด์ด์ ๋ฆฌํฉํ ๋ง๋ ๊ฐ์ด ํ๊ธฐ๋ก ์ฝ์ํ๋ค. ๐


1. ์ธ์ธํ ๊ตฌ์ฑ๊ณผ ๊ณํ
๋์์ด๋๋ PM์ด ๋ฐ๋ก ์๋ค๋ณด๋ ๋ก์ง์ด๋ ๊ธฐํ์ ์ธ ๋ถ๋ถ์ด ์ฌ์ค ์ด๋ ค์ ๋ค.
๋ฐฑ์๋์ ํ์
ํ๋ ์์
์ด ์ฒ์์ด๋ค๋ณด๋ ๋ฐฑ์๋์์ ์ด๋์๋ถํฐ ์ด๋๊น์ง ์์
์ ํด์ฃผ๋๊ฑด์ง ๋ฉ์ธํ์ด์ง ์์
ํ๋ฉด์ ๊ต์ฅํ ํค๋งธ์๋ค.
๊ทธ๋ฌ๋ค๋ณด๋ ๋์น ๋ถ๋ถ๋ ๋ง์๊ณ ๋ฐฑ์๋์์๋ ์์ ๋ ๋ก์ง์ด ๋ง์๋ค.
2. ํธ๋ฌ๋ธ ์ํ
๋ฐฑ์๋์ ํ์
ํ๋ฉด์ api ๊ด๋ จ ๊ณต๋ถ๋ฅผ ๋ ํด์ผ๊ฒ ๋ค๊ณ ๋ผ์ ๋ฆฌ๊ฒ ๋๊ผ๋ค.
์ ์ญ์ํ ๊ด๋ฆฌ ๋ํ recoil๋ก ์ฒ์ ์ ํด๋ณด์๋๋ฐ ์๋ก๊ณ ์นจ ์ ๋ฐ์ดํฐ๊ฐ ๋ค ๋ ๋ผ๊ฐ์ ์ข์์ ๊ธฐ๋ฅ์ด๋, ํ์ ์ ๋ณด์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ฉด์ ๋ฉ์ธ ํ์ด์ง ์ถ์ฒ ์์ญ๋ ๋ฌธ์ ๊ฐ ์์๋ค.


<๋ก๊ทธ์ธ ๊ฒฝ์ฐ>
- ํ์๊ฐ์
์ ์
๋ ฅํ ๊ด์ฌ ํค์๋๊ฐ ๋ํดํธ๋ก ์ถ์ฒ ๋จ
- ์ฒดํ ๋ฐ ํค์๋ ์ ํ ๊ฒ์(์ข์์ 60%, ์กฐํ์ 40% ๊ฐ์ค์น)
- ์ฒดํ์์ ๋ง์ด์ฌ์ด์ฆ๋ฅผ ํ ๊ธ์ ์ ์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ํ์๊ฐ์
์ ์
๋ ฅํ๋ ํค์ ๋ชธ๋ฌด๊ฒ๋ก ์ถ์ฒ
<๋น๋ก๊ทธ์ธ ๊ฒฝ์ฐ>
- '์ ์ฒด' ํค์๋๊ฐ ๋ํดํธ ๋์ด ์ต์ ์ ๊ฒ์๋ฌผ ์ถ์ฒ
- ์ฒดํ ๋ฐ ํค์๋ ์ ํ ๊ฒ์(์ข์์ 60%, ์กฐํ์ 40% ๊ฐ์ค์น)
ํ์ฌ ๋ ์จ์ ์ค๋ ๋ ์จ์ ์ด์ธ๋ฆฌ๋ ์คํ์ผ
ํ์ฌ ๋ ์จ ๊ฐ์ ๊ฒฝ์ฐ์๋ openWeatherAPI๋ฅผ ํ์ฉํ๊ณ , ์ค๋ ๋ ์จ์ ์ด์ธ๋ฆฌ๋ ์คํฐ์ผ ์ถ์ฒ ์์ญ์ ์ฌ์ฉ์์ ์์น ์ ๋ณด๋ฅผ ๋ฐ์ ํ์ ์๋์ ๊ฒฝ๋๋ก ๋ ์จ ์ ๋ณด๋ฅผ ์
๋ฐ์ดํธํ์ฌ ๊ฒ์๊ธ์ ์๋ ํค์๋์ ์ผ์น์์ผ ์ถ์ฒ ํด์ฃผ๋ ์์ญ์ด๋ค.
์ค๋ ๋ ์จ์ ์ด์ธ๋ฆฌ๋ ์คํ์ผ์ ์บ๋ฌ์
์์ญ์ธ๋ฐ,
์ฒ์์๋ ๋ฆฌ์กํธ ์ฌ๋ฆญ ์บ๋ฌ์
์ ์ฌ์ฉํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ฌ๋ผ์ด๋ ๊ธฐ๋ฅ์ ์ ์ ์๊ฒ๋ ์ฒซ ๋ฒ์งธ ์์ดํ
๋ง ์์ ํ ๋ณด์ฌ์ฃผ๊ณ ๋ ๋ฒ์งธ ์์ดํ
์ ์ผ๋ถ๋ง ๋ณด์ฌ์ฃผ๋ ๊ฒ์ด ์ ๋๋ก ๋์ํ์ง ์์ Swiper ์บ๋ฌ์
๋ก ์์ ํ๋ค.
ํค์๋ ์ถ์ฒ
ํค์๋ ์ถ์ฒ ์์ญ์์ ๊ฒ์๋ฌผ์ useInfiniteScroll๋ก ๊ตฌํํ์ ๋ ์คํฌ๋กค์ ๋ด๋ ค๋ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ ๋ฌธ์ ์ ์ ์๊ฐ์ด ๋ง์ด ์์๋์๋ค.
IntersectionObserver ๋ฅผ ์ถ๊ฐuseInfiniteQuery๋ฅผ ์ฌ์ฉํ๋ ๋์ useState๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์๋ฌผ์ ๊ด๋ฆฌํ๊ณ , ๋ง์ง๋ง element์ ๋ฟ์์ ๋ ์๋ก์ด ๊ฒ์๋ฌผ์ ์ถ๊ฐํ๋๋ก ์ฝ๋๋ฅผ ์์ api๊ฐ ์ค๋ณต ํธ์ถ๋๋ฉด์ ํ์ด์ง๊ฐ ๋ก๋๋ ๋, ํค์๋ ํํฐ๋ง ์กฐ๊ฑด์ด ๋ณ๊ฒฝ๋ ๋ ๊ฒ์๋ฌผ์ด ์ค๋ณต๋๋ ๋ฌธ์ ๊ฐ ์์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒดํ ์กฐ๊ฑด์์ ๋ก๊ทธ์ธ ์ ์ ๋ ์ง์ ํค์ ๋ชธ๋ฌด๊ฒ ์ค์ ํ๊ฑฐ๋ ๋ง์ด์ฌ์ด์ฆ๋ฅผ ๋ถ๋ฌ์ค๋ฉด body ๊ฐ์ด ์
๋ฐ์ดํธ๊ฐ ๋์ง์๊ฑฐ๋ null๋ก ์ถ๋ ฅ๋์ด ์กฐ๊ฑด ํํฐ๋ง์ด ์๋๋ ๋ฌธ์ ๋ ์์๋ค.
api ์ค๋ณต ํธ์ถ : ์ฒ์ ํธ์ถ์์ 0ํ์ด์ง๊ฐ ๋จผ์ ํธ์ถ ๋ ํ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉด ํ์ด์ง1์ด ๋์์ผํ๋๋ฐ ๋์์ ์ค๋ณต ํธ์ถ์ด ๋ฐ์ํ๊ณ , ๋ํ ์คํฌ๋กค์ ๋ด๋ฆฌ๋ฉด์ ํ์ด์ง๊ฐ ๋ก๋๋๊ฑฐ๋, ํค์๋ ํํฐ๋ง ์กฐ๊ฑด์ด ๋ณ๊ฒฝ๋ ๋ ๊ฒ์๋ฌผ์ด ํธ์ถ๋๊ณ ์๋๋ฐ ๊ฐ์ ๊ฒ์๋ฌผ์ด ์ค๋ณต๋๋ ๋ฌธ์
๋ก๊ทธ์ธ ๋ฐ ๋น๋ก๊ทธ์ธ ์ ์ ์ฒดํ ์ค์ ํํฐ๋ง : ๋น๋ก๊ทธ์ธ ์ ์ ๊ฐ ํค๋ ๋ชธ๋ฌด๊ฒ๋ฅผ ์ ๋ ฅํ๊ณ ์ ์ฉํ๊ธฐ ๋ฒํผ๊น์ง ๋๋ฅด๊ฒ ๋๋ฉด ๊ฒ์๋ฌผ์ด ๋ค์ ์ด๊ธฐํ๋๋ฉด์ body๊ฐ์ ๋ณด๋ด์ค height์ weight ๊ฐ์ ์ ๋ฐ์ดํธ๊ฐ ๋๊ณ ์์ง๋ง, ๋ก๊ทธ์ธ ์ ์ ๋ ๊ฐ์ ์ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ ํค์ ๋ชธ๋ฌด๊ฒ๊ฐ body ๊ฐ์ ๋ค์ด๊ฐ์๊ณ , ์ฒดํ ๋ชจ๋ฌ์์ ์ง์ ํค๋ ๋ชธ๋ฌด๊ฒ๋ฅผ ์ ๋ ฅํ๊ณ ์ ์ฉํ๋ฉด ์ ๋ ฅํ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด์ผํ๋๋ฐ ๋ณ๊ฒฝ๋์ง ์๋ ์ ๊ณผ ๋ง์ด์ฌ์ด์ฆ ํ ๊ธ์ ๋๋ฅด๋ฉด ๊ฐ์ ์ ์ ๋ ฅํ๋ ์๋ ์ ๋ณด๊ฐ ๋ค์ ๋ถ๋ฌ์์ ธ์ผํ๋๋ฐ null๊ฐ์ผ๋ก ๋์ค๋ ๋ฌธ์
api ์ค๋ณต ํธ์ถ๊ณผ ๊ฒ์๋ฌผ : useEffect๊ฐ ์ฌ๋ฌ๊ฐ ์์ด์ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋๋ ๋ฌธ์ ์ธ๊ฒ ๊ฐ๋ค.
fetchPosts ํจ์๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋ฉด์ pageParam์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค fetchPosts๊ฐ ํธ์ถ๋๊ณ , ๊ทธ๋ฆฌ๊ณ ํํฐ๋ง ์กฐ๊ฑด(selectedStyleTags, inputHeight, inputWeight)์ด ๋ณ๊ฒฝ๋ ๋๋ ๊ฒ์๋ฌผ ๋ชฉ๋ก์ ์ด๊ธฐํํ๊ณ ํ์ด์ง ๋ฒํธ๋ฅผ 0์ผ๋ก ์ค์ ํ๋๋ฐ, ์ด ๊ณผ์ ์์ pageParam ๊ฐ์ ๋ณํ๋ก ์ธํด ๋ค์ fetchPosts๊ฐ ํธ์ถ๋๋ฉด์ ์ค๋ณต ํธ์ถ๊ณผ ์ค๋ณต ๊ฒ์๋ฌผ์ด ๋์ค๋๊ฒ ๊ฐ๋ค.
์ฒดํ ์กฐ๊ฑด๋ฌธ : ๋ก๊ทธ์ธ ์ฌ์ฉ์์ ๊ฒฝ์ฐ, ์ฒซ ๋ฒ์งธ ์กฐ๊ฑด๋ฌธ(loggedInUser.isLoggedIn && isMySizeApplied) ์ธ ์ ์ฉ ๋ถ๋ถ์ด ์ฐธ์ด๋ฏ๋ก ์ด ๋ถ๋ถ์ ์ฝ๋๊ฐ ์คํ๋๊ณ , ๋ ๋ฒ์งธ ์กฐ๊ฑด๋ฌธ์ธ ์ฌ์ฉ์๊ฐ ์ง์ ํค์ ๋ชธ๋ฌด๊ฒ๋ฅผ ์
๋ ฅํ๋ฉด ๋ฐ์์ด ์๋จ
๋ฐ๋ผ์, useEffect ๋ด๋ถ์ ์กฐ๊ฑด๋ฌธ์์๋ ๋ก๊ทธ์ธ ์ฌ์ฉ์(loggedInUser.isLoggedIn)์ด๋ฉด์ '์ ์ฉํ๊ธฐ' ๋ฒํผ์ ํด๋ฆญํ ๊ฒฝ์ฐ(isMySizeApplied)์๋ง ์ฒซ ๋ฒ์งธ ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ผ๋ก ํ๊ฐ๋์ด ํด๋น ๋ถ๋ถ์ ์ฝ๋๊ฐ ์คํ
useEffect ์์ : api ํธ์ถ fetchPosts ํจ์ ๋ด๋ถ์์ ์กฐ๊ฑด๋ฌธ์ ํตํด
pageParam === 0 ์ด ์๋๊ฒฝ์ฐ ๊ธฐ์กด์ ๊ฒ์๋ฌผ ๋ฐ์ดํฐ ๋ค์ ์๋ก์ด ๊ฒ์๋ฌผ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋๋ก ์์
const [pageParam, setPageParam] = useState(-1); ์ด๊ธฐ๊ฐ์ -1๋ก ์ค์ ํ๊ณ useEffect ๋ด๋ถ์์ if (pageParam === -1) return; ์กฐ๊ฑด๋ฌธ์ ํตํด pageParam ๊ฐ์ด -1์ผ ๋๋ API ํธ์ถ์ ์ค๋จํ๋๋ก ์ค์
์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์คํฌ๋กคํ์ฌ ์๋ก์ด ๊ฒ์๋ฌผ์ ๋ถ๋ฌ์ค๋ ๋์์ด ์์๋๊ธฐ ์ ๊น์ง๋(pageParam์ด 0 ์ด์์ ๊ฐ์ ๊ฐ์ง ๋๊น์ง) ์ค์ ๊ฒ์๋ฌผ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ง ์๊ฒ ๋จ
์ฒดํ ์กฐ๊ฑด๋ฌธ ์์ : ๋ชจ๋ ์กฐ๊ฑด์ด ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๋ค๋ฉด, 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๋ฅผ ์ด์ฉํ๊ณ ,
โ๋๋ณด๊ธฐโ๋ฅผ ๋๋ ์ ๋ ํด๋น ํญ์ผ๋ก ์ด๋ํ์ฌ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ถ๋ ฅ๋๊ฒ ๊ตฌํํ๋ค.
ํค์ค๋งค๋
๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ฒด์ ์ธ ํค์ด๋, ํฐํธ ๋ฑ ์๊ฐํด์ ๋ง์ถ๋ค๊ณ ๋ง์ท๋๊ฒ ๊ฐ์ง๋ง ๊ฐ์ ์์
์ ํ๋ค๋ณด๋ ๋ค๋ฅธ ์ ์ด ์์ ๊ฑฐ๋ผ ์๊ฐ๋๋ค. modal ๋ถ๋ถ์ด๋ alert ๊ฐ์ ๋ถ๋ถ๋ค (?)
์ถ์ฒ ์์ญ
ํค์๋ ์ถ์ฒ ๋ถ๋ถ ๊ฐํ (๋ฒํผ ๋๋ฅผ ๋๋ง๋ค API ํธ์ถ โ ์บ์ฑ์ผ๋ก ๋์ฒด?)
์ฒดํ๋ณ ์ถ์ฒ์ด ์ ์๋จ
api ์์ ๋ ํ์!
recoil ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ
์๋ก๊ณ ์นจ์์๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋๋ก ๋ณด์
feature
์๋ฆผ ๊ธฐ๋ฅ
๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ/์์
์ฑํ
๊ธฐ๋ฅ
์ค์ ์๋น์คํ๋ ์ ๋์ ํ๋ฆฌํฐ ๊ฐ์์!! ์๊ฐ๋ฐ๊ณ ๊ฐ๋๋ค ใ