

๋์ธ ํด๋ผ์ฐ๋์ AI ๊ฐ์ ์๋ฃจ์ ๊ทธ๋ฆผ์ผ๊ธฐ ์๋น์ค ์ ๋๋ค.
ํ๋ฃจ์ ์ผ๊ณผ๋ฅผ ๊ทธ๋ฆผ ๊ณผ ๊ธ๋ก ์ ๋ฆฌํ์ฌ ๊ทธ๋ ์ ๊ฐ์ ์ด๋ชจํฐ์ฝ๊ณผ ํจ๊ป ๊ธฐ๋กํด๋ณด์ธ์.
cloud nine (ํ๋ณต์ ์ ์ )์ด๋ผ๋ ์๋ด์์ ์ฐฉ์ํ์ต๋๋ค. ํ๋ณตํ ๊ฐ์ ์ ๊ธฐ๋ก (cloud), 9๊ฐ์ง์ ๊ฐ์ ํํ ์ด๋ผ๋ ์ ์์ ์ ํฌ ์๋น์ค์ ์ด์ธ๋ฆฌ๋ ์๋ด ๊ฐ์ ๋์ธํด ๋ผ์ฐ๋๋ผ๊ณ ์ค์ ํด ๋ณด์์ต๋๋ค.
๊ตฌ๋ถ | ๋งํฌ | ๊ตฌ๋ถ | ๋งํฌ |
![]() |
Nine Cloud | ๋ธ๋ก์์ด | |
![]() |
FE Github | ํ SA | |
BE Github | Figma |
์ฃผ์ฒ ๋ฏผ | ์ก์ง์ฐ | ํ๋์ฉ |
---|---|---|
![]() |
![]() |
![]() |
cheolminJOO | nsong113 | HyperQuanx |
์ฃผ์ฒ ๋ฏผ |
- ๋ฌ๋ ฅ ๋์์ธ ์ปค์คํ
- ์ผ๊ธฐ ์์ธํ์ด์ง, ์์ ํ์ด์ง - ๋ง์ดํ์ด์ง ๊ธฐ๋ฅ ๊ตฌํ - ์ ๋ฐ์ ์ธ alert ์ฐฝ ๊ด๋ฆฌ (sweetAlert2) - ๋๊ธ, ์ข์์ ๊ธฐ๋ฅ ๊ตฌํ - ํ์ด์ง ์ ํ ์ ๋๋ฉ์ด์ (framer-motion) - ๋ฐฐํฌ ๊ด๋ฆฌ(vercel), ์ด๋ฏธ์ง ๊ด๋ฆฌ(AWS S3) |
[email protected] |
์ก์ง์ฐ |
- ๊ธ ์์ฑ ํ์ด์ง (์ฌ๋ผ์ด๋ ๋ฐ, react-quill) - ๊ทธ๋ฆผ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ (canvas) - gpt open api ์ฐ๊ฒฐ ๋ฐ prompt ์์ฑ - ์ปค๋ฎค๋ํฐ ํ์ด์ง (infinite-scroll) - ๊ฐ์ธ ๊ธ ๋ณด๊ธฐ ํผ๋ (infinite-scroll) - ๋ชจ๋ฌ (react-portal) |
[email protected] |
ํ๋์ฉ |
- Onboarding ํ์ด์ง - Sign in / Sign Up ํ์ด์ง - OAuth 2.0 Social Login (Kakao, Google, Naver) - Kakao ๊ณต์ ํ๊ธฐ - Socket.io๋ฅผ ์ฌ์ฉํ ์ค์๊ฐ ์ฑํ - Axios intercepter |
[email protected] |
์์ ๋ก๊ทธ์ธ | ๋ฌ๋ ฅ ํ์ด์ง | ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ |
![]() |
![]() |
![]() |
AI open api | ๋ฌดํ์คํฌ๋กค | ์ฑํ ๋ฐฉ |
![]() |
![]() |
![]() |

TypeScript |
ํ์
์คํฌ๋ฆฝํธ๋ ์ ์ ํ์ดํ์ ์ง์ํ๋ฉฐ, ์ฝ๋ ์์ฑ ์ ๋ณ์์ ํ์
์ ๋ช
์์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ๋ถ์ํ์ฌ ํ์ ์๋ฌ๋ฅผ ์ฌ์ ์ ์ฐพ์๋ด๊ณ ์๋ฐฉํ ์ ์๊ฒ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ์ค์ ์ฐ๊ตฌ์ ๋ฐ๋ฅด๋ฉด ๋ชจ๋ JavaScript ๋ฒ๊ทธ์ 15%๊ฐ ์ฌ์ ์ TypeScript๋ก ๊ฐ์งํ ์ ์๋ค๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ฑํํ์ต๋๋ค. |
Axios |
์ง๊ด์ ์ธ API๋ฅผ ์ ๊ณตํ์ฌ HTTP ์์ฒญ์ ์์ฝ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋ํ ์์ฒญ๊ณผ ์๋ต์ ๊ฐ๋ก์ฑ๋ ์ธํฐ์ ํฐ(interceptor)๋ฅผ ์ ๊ณตํ์ฌ ์์ฒญ ๋๋ ์๋ต์ ์์ ํ๊ฑฐ๋ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฑ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณต ๋ฐ์ ์ ์์ผ๋ฉฐ ์ฌ์ฉ์ด ๊ฐํธํ์ฌ ์ฑํํ์ต๋๋ค. |
React Router |
React Router๋ SPA(Single Page Application)์์ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ
์ ๊ด๋ฆฌํฉ๋๋ค. ํ์ด์ง ๋ฆฌ๋ก๋ ์์ด URL์ ๋ณ๊ฒฝํ๊ณ , ์ ์ ํ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ฌ ์ฌ์ฉ์์๊ฒ ๋งค๋๋ฌ์ด ํ์ด์ง ์ ํ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ์ ์ฑํํ์ต๋๋ค. |
React Query |
๊ฐํธํ API ๋ฐ ์๋ํ๋ ์บ์ฑ, ์ฌ์๋, ์ํ ๊ด๋ฆฌ๋ฅผ ์ฌ๊ณตํ์ฌ ๋ฐ์ดํฐ ์์ฒญ ๋ฐ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ๋ฉฐ, UI์ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๋๊ธฐํํ ์ ์์ด ์ ํํ์ต๋๋ค. |
Recoil |
Recoil์ Redux์ ๋ค๋ฅด๊ฒ ์ค์ ์ด ๋น๊ต์ ๊ฐ๋จํ๋ฉฐ, ์ปดํฌ๋ํธ ๊ฐ์ ํ์ํ ์ํ๋ฅผ ์์ฝ๊ฒ ๊ณต์ ํ ์ ์์ต๋๋ค. Redux์ ๋ค๋ฅด๊ฒ ์ง์ ์ํ๊ด๋ฆฌ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ด ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ฐ์ ์ํ๋ฅผ ์ฐ๊ฑฐ๋ ์์ ํ ๋ ํธ๋ฆฌํ์ฌ ์ฑํํ์ต๋๋ค. |
Styled Components |
๊ฐ ์ปดํฌ๋ํธ์ ๊ณ ์ ํ ์คํ์ผ์ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ์ด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ์คํ์ผ๋ง์ด ๋์ฑ ๋ชจ๋ํ๋๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง๋๋ค. ๋ํ ๊ฐ๋ฐ ํจ์จ์ฑ์ ๋์ฌ์ฃผ๋ฉฐ ๋์ ์คํ์ผ๋ง์ ์ฉ์ดํ์ฌ ์ฑํํ์ต๋๋ค. |
Socket.io |
์น ์์ผ(WebSocket)๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํด์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค. ํนํ ์๋์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ข ๋ฅ์ ๋ง์ถฐ ํธํ๋๋ ๊ธฐ์ ์ ์๋์ผ๋ก ์ ํํ์ฌ ์ค์๊ฐ ํต์ ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด ์ฃผ๊ธฐ ๋๋ฌธ์ ์ฑํํ์ต๋๋ค. |
Intersection observer |
์ธํผ๋ํฐ ์คํฌ๋กค ๊ตฌํ์ ์ํด ์ฌ์ฉํ์ต๋๋ค. ์คํฌ๋กค ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋งค ์คํฌ๋กค๋ง๋ค ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋์ด ์ฑ๋ฅ์ ๋ถ๋ด์ด ๋ ์ ์๋๋ฐ, ์ด API๋ฅผ ์ฌ์ฉํ๋ฉด ๋น๋๊ธฐ์ ์ผ๋ก ์๋ํ๋ฉฐ, ๋ทฐํฌํธ์ ๋์ ์์ ๊ฐ์ ๊ต์ฐจ ์ฌ๋ถ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๊ฐ์งํฉ๋๋ค. ์คํฌ๋กค ์์น์ ์๊ด ์์ด ์์๊ฐ ํ๋ฉด์ ๋ํ๋๊ฑฐ๋ ์ฌ๋ผ์ง ๋ ์ด๋ฅผ ๊ฐ์งํ ์ ์์ด ์น ํ์ด์ง์ ๋ถํ๋ฅผ ๊ฐ์์ํฌ ์ ์์ต๋๋ค. |
sweetAlert2 |
๊ธฐ์กด์ ๋ฑ๋ฑํ alert์ฐฝ ๋์ ์, ์ ๋๋ฉ์ด์
์ด ๋ค์ด๊ฐ๊ณ ๋ถ๋๋ฌ์ด ๋์์ธ์ alert ์ฐฝ์ ๋์ฐ๊ธฐ ์ํด ์ฌ์ฉํ์ต๋๋ค ๊ฐ๋จํ๊ฒ ๋ค์ํ ์ปค์คํ ์ alert์ฐฝ์ ์ ์ฉํ ์ ์์ด์ ๋ณธ ํ๋ก์ ํธ์ ์ ์ฉํ์ต๋๋ค. |
browser-image-compression |
์ด๋ฏธ์ง๋ฅผ ์์ถํ์ฌ ์น ํ์ด์ง์ ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ์ต์ ํํ๊ธฐ ์ํด ์ ์ฉํ์ต๋๋ค. ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ถ์ ์งํํ๋ฉฐ ์๋นํ ํ์ง์ ์ ์งํ๊ณ ์์ถ๋ฅ ์ ์กฐ์ ํ ์ ์์ต๋๋ค. |
๋ฌ๋ ฅ ์ ๋ณ๊ฒฝ ์, ๋ฌ๋ ฅ ๋ฐ์ดํฐ ํ๊ธฐ ์ค๋ฅ ์๋ฌ [์ฒ ๋ฏผ]
- ๋ฌธ์ ์ ๋ํ ์ผ์ค๋์ด 2024๋ 1์ 4์ผ์ด๋ผ๋ฉด 2023๋ ์ ๋ชจ๋ ๋ฌ๋ ฅ์ ๋ฐ์ดํฐ๊ฐ ๋ค ๋ํ๋์ง ์๊ณ , ๋ชจ๋ ๋ฌ๋ ฅ์ด 4์ผ, ์ฆ ์ค๋ ๋ ์ง๊น์ง๋ง ๋ฐ์ดํฐ๊ฐ ๋ฑ์ฅํฉ๋๋ค.
- ํด๊ฒฐ์ ์ํ ๋ ธ๋ ฅ
์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์ด๋ป๊ฒ ์ค์ผ ์ ๊ฐ ์ํ๋ ๋๋ก ๊ตฌํ์ด ๋ ๊น ์์ฝ๋ฉ์ผ๋ก ๋ฉ๋ชจ์ฅ์ ์ฌ๋ฌ๊ฐ์ง ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ด๋๊ณ ์ ๋ฆฌํ ๋ค์, ํ๋ํ๋ ์ ์ฉํ์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ๋ฒ
์ค๋ ์ผ,์,๋ ๋์ ๋ฐ์ดํฐ์, ๋ฌ๋ ฅ์ด ๋ฐ๋ ๋ ์ผ,์,๋ ๋์ ๋ฐ์ดํฐ๋ฅผ ๋ณ์๋ก ์ ๋ฆฌํ๊ณ ์ด ๋ณ์๋ค์ ์ด์ ๋ฌ, ์ด๋ฒ ๋ฌ,์ดํ ๋ฌ๋ค์ ๋ํด ๊ตฌ๋ถ์ ํ ์ ์๋ const์ ๋์ ์์ผ ๋ง๋ค๊ณ , ์ด๋ค์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์ ์ฉํด ํด๊ฒฐํ์ต๋๋ค.
ReactQuill ๋ณด์ ์๋ฌ [์ฒ ๋ฏผ]
- ๋ฌธ์ ์ ๋ํ ์ผReactQuill์ ๊ธ์๋ฅผ ์ ๋ ฅํ๊ณ ์ถ๋ ฅํ๋ฉด ํ๊ทธ๊ฐ ๊ฐ์ด ๋ถ์ด์ ์ถ๋ ฅ๋๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋์ ์ด๋ฅผ ๋ง๊ธฐ ์ํด์ dangerouslySetInnerHTML์ผ ์ธํ ์ ํด์ผ ํ๊ทธ๋ ๋น ์ง๊ณ ๊ธ์๋ค๋ง ์ถ๋ ฅ๋ฉ๋๋ค. ๊ทผ๋ฐ ์ด๋ ๊ฒ ๋๋ฉด ๋ฌธ์ ๊ฐ DOM์ HTML์ ์ถ๊ฐํ ๋ ์ฌ์ดํธ๊ฐ ์คํฌ๋ฆฝํ ๊ณต๊ฒฉ(XSS)์ ์ทจ์ฝํด์ง๋๋ค. ๊ทธ๋์ ๊ด๋ฆฌ์๊ฐ ์๋ ์ ์ฑ ์ ์ ๊ฐ ํ์ด์ง์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์ ํ๋ ๋ฑ ๋น์ ์์ ์ธ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ ๋ณด์ ๊ตฌ๋ฉ์ด ์๊น๋๋ค.
- ํด๊ฒฐ์ ์ํ ๋ ธ๋ ฅ
dangerouslySetInnerHTML์ ์ฐ์ง ์๊ณ , ํ๊ทธ ์์ด ๊ธ์๋ฅผ ์ถ๋ ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น? ๋ผ๊ณ ๊ตฌ์์ ํด๋ดค๋๋ฐ ๋ฑํ ๋ณด์ด์ง ์์, dangerouslySetInnerHTML์ ์ฐ๋๋ฐ ๋ณด์์ ๊ฐํํ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ๋ฒ
DOMPurify๋ผ๋ HTML์ sanitize ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ต๋๋ค. ๊ทธ๋์ DOMPurifiy์ ๋ด๋ถํจ์์ธ sanitize ์์ ์ธ์๋ก ์ถ๋ ฅํ ๊ธ์๋ฅผ ๋ฃ์ผ๋ฉด XSS ๊ณต๊ฒฉ์ ๋ง๊ฒ๋ ํ ์ ์์์ต๋๋ค.
์ด๋ฏธ์ง ์์ถ ํ ์๋ฒ์ ์ ๋ฌ ํ ๋ '๋ค์'์ ๋๋ฒ ํด๋ฆญํด์ผ ํ๋ ์ด์ [์ง์ฐ]
- ๋ฌธ์ ์ ๋ํ ์ผ์ด๋ฏธ์ง๋ฅผ ์์ถ ํ ์๋ฒ์ ์ ๋ฌํ๋ ๋ฒํผ์ ๋๋ฒ ๋๋ฌ์ผ ์ ๋ฌ์ด ๋์์ต๋๋ค. ์ฒซ๋ฒ์งธ ํด๋ฆญ์์๋ ์์ถ์ด ๋๊ณ ๋๋ฒ์งธ ํด๋ฆญ์์ ์ ์ก์ด ๋๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
- ํด๊ฒฐ์ ์ํ ๋ ธ๋ ฅ
๋ฒํผ์ ๋๊ฐ๋ฅผ ๋ง๋ค๊ฑฐ๋ ์ ์ ํํ ๋๋ธํด๋ฆญ ํด๋ฌ๋ผ๊ณ ๋ฉ์์ง๋ฅผ ์ ๋ฌํด์ผ ํ๋ ๊ณ ๋ฏผ์ ํ์ต๋๋ค. ์ฃผ๋ก ์ ์ ์๊ฒ ์ด๋ป๊ฒ ์ด ๊ฒ์ ๋ ๋ถํธ๊ฐ์ผ๋ก ๋ค๊ฐ์ค๊ฒ ์ ๋ฌํ ๊น ๊ณ ๋ฏผ์ ํ์ต๋๋ค. ํ์ง๋ง ์ง์ ์ ์ผ๋ก ์ ์ ์๊ฒ ์์ฒญ์ ํ๋ ๊ฒ์ ํฐ ๋ถํธ๊ฐ์ผ๋ก ์ด๋ํ๋ค๋ ์๊ฐ์ด ๋ค์ด ์ด๋ป๊ฒ ํ๋ฉด ์๋ํ ํ ๊น ๊ณ ๋ฏผ์ ์์ํ์์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ๋ฒ
๊ทธ๋ฆผ์ ๊ทธ๋ฆด ๋ ๋ง์ฐ์ค๋ฅผ ๋๊ณ 1000ms ์๋ค๊ฐ ์๋์ผ๋ก ์ด๋ฏธ์ง ์์ถ ํจ์๊ฐ ์คํ๋๋ debounce๋ฅผ ํ๋ ํจ์๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ๊ทธ๋ฆผ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋ฅ์ ํด๋ฆญํ๊ธฐ ์ํด์ ์์ง์ด๋ ์๋๊ฐ ํ๊ท 1์ด ๋ฏธ๋ง์ด๊ณ ๊ทธ๋ฆผ ๊ทธ๋ฆฐ ํ '๋ค์'๋ฒํผ์ ๋๋ฅด๊ธฐ๊น์ง 1์ด ์ด์์ด ๊ฑธ๋ฆฐ ๋ค๋ ๋ฐ์์ ์ฐฉ์ํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ก, '๋ค์'๋ฒํผ์ ํ๋ฒ๋ง ๋๋ฌ๋ ์์ถ์ด ์งํ๋ ํ์ผ๊ณผ ํจ๊ป post์์ฒญ์ ๋ณด๋ผ ์ ์์์ต๋๋ค.
๋ฌดํ์ผ๋ก api ์์ฒญ์ด ๊ฐ๋ ๋ฌดํ์คํฌ๋ก [์ง์ฐ]
- ๋ฌธ์ ์ ๋ํ ์ผ'๋ฌดํ์ '์คํฌ๋กค์ด ๋์ด ๊ณ์ ํต์ ์์ฒญ์ ํ๊ณ , ์ฒ์ ์์ฒญ์ ํ๊ณ ๋ ์์ฒญ์ ์ํ๊ธฐ๋ ํ๊ณ , ํน์ Null๋ก ์์ฒญ์ ํ๋ ์ฌํ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- ํด๊ฒฐ์ ์ํ ๋ ธ๋ ฅ
1. InfiniteScroll ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ฐ๊ณ useInfiniteQuey๋ฅผ ๊ฐ์ด ์ฌ์ฉํด ๋ณด์์ต๋๋ค. ๊ฒฐ๊ณผ๋ก๋ ๋ฌดํ get ์์ฒญ์ด ๋ณด๋ด์ก์ต๋๋ค.
2. InfiniteScoll์ ์ฌ์ฉํ์ง ์๊ณ useInfiniateQuery์ getNextPageParam๋ถ๋ถ์ ์์ ํด ๋ณด์์ต๋๋ค. ๊ฒฐ๊ณผ๋ก๋ ๋ฐ๋ฅ์ ์ธ์ํ์ง ๋ชปํ๋์ง ์ฒซ๋ฒ์งธ ๋ก๋ฉ๋ง ํ๊ณ ๋๋ฒ์งธ ํ์ด์ง๋ ๋ก๋ฉ์ ํ์ง ์์์ต๋๋ค.
3. api์ return ๋ถ๋ถ์ ์์ ํ์ต๋๋ค. return์์ data์ด์ธ์๋ nextPage์ isLast๋ฅผ ๋ฆฌํดํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ getNextPageParam์ ์ ์ฉํ์ต๋๋ค.
- ํด๊ฒฐ ๋ฐฉ๋ฒ
api๋ถ๋ถ์์ data์ด์ธ์๋ nextPage์ isLast๋ฅผ ๋ฆฌํดํ์ฌ useInfiniteQuery์ getNextPageParam๋ถ๋ถ์ ์ ์ฉํ์ต๋๋ค. react-intersection-observer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ์์ต๋๋ค. ๊ด์ฐฐํ๋ ๊ฐ์ฒด ํ๋๋ฅผ ref๋ก ์ค์ ํ ํ ํด๋นํ๋ ๊ฐ์ฒด๊ฐ ํ๋ฉด์ ๋ณด์ด๋ฉด inView๋ฅผ true๋ก ๊ฐ์ ๋ฐ๊ฟ์ค๋๋ค. ์ ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋ง์ง๋ง ๋ถ๋ถ์ div๋ฅผ ๋ง๋ค๊ณ color๋ฅผ ํฌ๋ช ํ๊ฒ ์ฃผ์์ต๋๋ค. useInfiniteQuery๋ฅผ ์ฌ์ฉํ์์ต๋๋ค. ํนํ fetchNextPage๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ inView๊ฐ true์ด๊ณ hasNextPage๊ฐ true์ด๋ฉด fetchNextPage๋ฅผ ํ๋๋ก useEffect์ ์์กด์ฑ์ ์ถ๊ฐํ์ฌ ์ฃผ์์ต๋๋ค.
ํ ํฐ ์ฌ๋ฐ๊ธ ๊ด๋ จ [๋์ฉ]
- ๋ฌธ์ -1. ์๋ฒ์์ ์ง์ ํ ๋ง๋ฃ์๊ฐ๊ณผ ํด๋ผ์ด์ธํธ์์ ๊ณ์ฐํ ๋ง๋ฃ์๊ฐ์ด ๋ค๋ฆ
2. ํ ํฐ ์ฌ๋ฐ๊ธ ๋ก์ง ์์ฑ ์ค์ ๋ชจ๋ ์๋ฌ ์ฌํญ์์ Token ์ฌ๋ฐ๊ธ์ผ๋ก ๋ค์ด๊ฐ๋ฒ๋ฆฌ๋ ์ค๋ฅ์ ์๋ฌ์ฝ๋๊ฐ Server์ ์ ๋ง๋ ์ค๋ฅ.
- ํด๊ฒฐ์ ์ํ ๋ ธ๋ ฅ -
1. ์ฒ์์๋ Server์์ empireTime(๋ง๋ฃ์๊ฐ)์ด๋ผ๋ ๊ฐ์ ๋ณด๋ด์ฃผ๋๋ก ์์ฒญํ์์ต๋๋ค. Server์์๋ ๋ง๋ฃ์๊ฐ์ด Unix time์ผ๋ก ์ค์ ๋์ด ์๋ค๊ณ ํด์ Front์์ ํ์ฌ์๊ฐ์ Unix time์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ ๋ก์ง์ ๋ง๋ค๊ณ (๋ง๋ฃ์๊ฐ - ํ์ฌ์๊ฐ)์ผ๋ก ์ ํจ๊ธฐ๊ฐ์ ๊ณ์ฐํ๊ณ setTimeout()์ ์ฌ์ฉํด์ Front์์ ์๊ฐ์ ์ฌ์ ์๊ฐ์ด ๋๋๋ฉด ์๋์ ์ผ๋ก ์ฌ๋ฐ๊ธ ์์ฒญ์ ํ๋๋ก ๋ก์ง์ ์๊ฐํด ๋ณด์์ต๋๋ค. ํ์ง๋ง ์๋ฒ์์ ์ง์ ํ ๋ง๋ฃ์๊ฐ๊ณผ ํด๋ผ์ด์ธํธ์์ ๊ณ์ฐํ ๋ง๋ฃ์๊ฐ์ด ๋ค๋ฅธ ์ค๋ฅ๊ฐ ์๊ฒผ๊ณ ์ด ๋ฟ๋ง ์๋๋ผ ํ ํฐ ๊ด๋ฆฌ๊ฐ ๋ณต์กํด์ง๊ณ , ๋ถํ์ํ ์๋ฒ์์ฒญ์ด ๊ณ์ ์๊ธฐ๋ฉฐ ๋ง๋ฃ์๊ฐ์ ํ๋ก ํธ์์ ์ ์ฅํ๋ฉด ๋ณด์์๋ ์ทจ์ฝํ ๊ฒ ๊ฐ์์ ์ด ๋ฐฉ๋ฒ์ ๋ฒ๋ฆฌ๊ณ ๋ง๋ฃ๊ฐ ๋ ์ดํ์ ์๋ฒ ์์ฒญ์ ํ๋ค๋ฉด ์๋์ ์ผ๋ก ํ ํฐ ์ฌ๋ฐ๊ธ URL๋ก ์ ๊ทผํ ์ ์๋๋ก ํ๊ธฐ ์ํด Axios intercepter๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
2. ์ผ๋จ ์คํ์ ์ํด Token ๋ง๋ฃ์๊ฐ์ ๊ทน๋จ์ ์ผ๋ก ์งง๊ฒ ์ค์ ํด๋์์ต๋๋ค. Token์ด ๋ง๋ฃ๋๋ค๋ฉด ๋์ฒด์ ์ผ๋ก ์๋ฒ์์ 401๋ฒ์ด๋ 419๋ฒ ์๋ฌ์ฝ๋๋ฅผ ๋ณด๋ด์ค๋ค๋ ์ฌ๋ฌ ๋ ํผ๋ฐ์ค๋ค์ ์ฐธ๊ณ ํด์ Server์ ์๋ฌ์ฝ๋๋ฅผ ๋ง์ถฐ๋ณด์์ต๋๋ค. 401๋ฒ์ ๋ค๋ฅธ๊ณณ์์๋ ์ฌ์ฉํ๋ค๋ ์๊ธฐ๋ฅผ ๋ฃ๊ณ Token ๋ง๋ฃ ์๋ฌ ์ฝ๋๋ฅผ 419๋ฒ์ผ๋ก ํต์ผํ์์ต๋๋ค. ์ธํฐ์ ํฐ ๋ก์ง์๋ 419๋ฒ ์๋ฌ์ฝ๋๊ฐ ๋ฌ๋ค๋ฉด /token์ผ๋ก ์ด๋๋๋๋ก ์ค์ ํด์ฃผ๊ณ ํค๋์ RefreshToken์ ๋ด์์ Server์ ํ ํฐ ์ฌ๋ฐ๊ธ์ ์์ฒญํ์์ต๋๋ค.
- ๊ฒฐ๊ณผ -
ํ ํฐ์ด ๋ง๋ฃ๋๋ฉด 419๋ฒ ์๋ฌ์ฝ๋๊ฐ ๋จ๊ณ ์๋์ผ๋ก /token์ผ๋ก ๋์ด๊ฐ์ RefreshToken์ ๋์กฐํ ํ ์๋ก์ด AccessToken์ ๋ฐ๊ธํด์ค.
Socket.io [๋์ฉ]
- ๋ฌธ์ -์๋ฒ์์ ์ง์ ํด์ค URL๋ก ์ ๊ทผํ์ง ๋ชปํ๋ ํ์.

์๋ฒ์์ ์ค์ ํด์ค URL๋ก ์ ๊ทผํ๋ ๊ณผ์ ์ด ์ฝ์ง ์์์ต๋๋ค.


๋ถ๋ช ์๋ํฌ์ธํธ๋ฅผ /community/chat/socket.io๋ก ์ค์ ํด๋์๋๋ฐ ๋ง์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ๋ณด๋ฉด ์ค์ ํ ์๋ํฌ์ธํธ๋ก ์ ๊ทผํ์ง ๋ชปํ์ต๋๋ค.
- ํด๊ฒฐ์ ์ํ ๋ ธ๋ ฅ -

ํน์ path ์ค์ ์ ๋ฐ๋ก ํด์ค๋ค๋ฉด ์ ๊ทผํ ์ ์์๊น ํด์ ๊ธฐ์กด์ ํ๋ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ path ์ค์ ์ ์ง์ด๋ฃ์์ต๋๋ค.
- ๊ฒฐ๊ณผ -

๊ฒฐ๊ตญ Server์ ์ฐ๊ฒฐ์ ์ฑ๊ณตํ์๊ณ ์ฑํ ๊ธฐ๋ฅ๊น์ง๋ ์ฑ๊ณตํ์ต๋๋ค.

1. ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ

react-icons๋ ์ข ๋ฅ๋ณ๋ก jsํ์ผ์ ํ๋์ฉ ๊ฐ์ง๊ณ ์์ด์, ํ๋์ ์์ด์ฝ์ ์คํํ๋ฉด ๊ทธ ์์ด์ฝ์ด ์ํ js ํ์ผ์ด ์คํ๋ผ์ ๊ด๋ จ ์๋ ๋ถํ์ํ ํ์ผ๋ค๋ ํจ๊ป ๋น๋ฉ ๋ผ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ปค์ง๋๋ค. ๊ทธ๋์ @react-icons/all-files๋ฅผ ์ค์นํ๊ณ , ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์์ด์ฝ๋ง๋ค js ํ์ผ์ ๊ฐ์ง๊ณ ์์ด์ ๋น๋ฉ ์ ํ์ํ ํ์ผ๋ง ์คํ ๋ผ ๋ฒ๋ค ํฌ๊ธฐ ์ต์ ํ๋ฅผ ์ํฌ ์ ์์์ต๋๋ค.
2. React.lazy๋ฅผ ์ด์ฉํ์ฌ ๋ผ์ฐํ code splitting / webPํ์ฅ์๋ก ๋ณ๊ฒฝ

- React.lazy๋ React์์ ์ฝ๋ ์คํ๋ฆฌํ ์ ๊ตฌํํ๊ธฐ ์ํ ๊ธฐ๋ฅ ์ค ํ๋์ ๋๋ค. ์ฝ๋ ์คํ๋ฆฌํ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์์ ์ฒญํฌ(chunk)๋ก ๋๋์ด ๊ฐ ์ฒญํฌ๊ฐ ํ์ํ ๋๋ง ๋ก๋๋๋๋ก ํ๋ ๊ธฐ์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค. ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ํ๋ ๋์ ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ ํ์ด์ง์ ํ์ํ ์ฝ๋๋ง ๋ก๋ํ๋ ๊ฒ์ ์๋ฏธํ์ฌ ๋ ๋น ๋ฅธ ๋ก๋ฉ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- WebP ์ด๋ฏธ์ง๋ ์ผ๋ฐ์ ์ผ๋ก JPEG ๋ฐ PNG๋ณด๋ค ๋ ํจ์จ์ ์ธ ์์ถ์ ์ ๊ณตํ๋ฉด์๋ ๋์ ํ์ง์ ์ ์งํฉ๋๋ค. ์์ฃผ ์ฌ์ฉ๋๋ ์ด๋ฏธ์ง๋ฅผ ํจ์จ์ ์ผ๋ก ์์ถํ๊ธฐ ์ํด webP๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.
3. Profiler๋ฅผ ํ์ฉํด์ ๋ถํ์ํ ๋ ๋๋ง ์ต์ ํ / compressor.js๋ก ์ด๋ฏธ์ง ์์ถ

- ํ๋กํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋ ๋๋ง ์ต์ ํ๋ฅผ ์งํํ์ต๋๋ค. ํนํ ๊ธ์ฐ๋ ๊ณณ์ด๋ ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ ๋ถ๋ถ์ ๋ง์ฐ์ค๋ฅผ ์์ง์ด๊ฑฐ๋ ๊ธ์๋ฅผ ์ ๋ ฅํ ๋ ๋ง๋ค ํค๋๋ ๋ชจ๋ ๋ ์ด์์์ด ๋ฆฌ๋ ๋๋ง์ด ๋๋ ๊ฒ์ ์ ์ ์์์ต๋๋ค. ๋ฐ๋ผ์ React.memo๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์บ์ฑํ์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก compressor.js๋ฅผ ์ฌ์ฉํ์ฌ 0.02mB๋ก ์์ถ ํ ์๋ฒ์ ๋ณด๋ด๋ ํ๋์ ์ด๋ฏธ์ง ๋ก๋ฉ์๊ฐ์ด ์ต๋ 50% (6ms->3ms)๋จ์ถ๋์์ต๋๋ค.
ํ์ด์ง ์ด๋ ๊ฐ์ [์ฒ ๋ฏผ]
- ๋ฌธ์ -๋ฉ์ธํ์ด์ง์ ์ปค๋ฎค๋ํฐ ํ์ด์ง์์ ์์ธํ์ด์ง๋ก ์ด๋์ด ๋๋๋ฐ, ์์ธํ์ด์ง์์ ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๋๋ ์ ๋ ๋ฌด์กฐ๊ฑด ๋ฉ์ธ์ผ๋ก ๊ฐ์ ์ปค๋ฎค๋ํฐ ํ์ด์ง์์ ์ด๋ํ ์ฌ์ฉ์๋
๋ค์ ์ปค๋ฎค๋ํฐ ํ์ด์ง๋ฅผ ํด๋ฆญํด์ผ ํ๋ ๋ถํธํจ์ด ๋ฐ์ํ์ต๋๋ค.
- ํด๊ฒฐ -
boolean ๊ฐ์ ๊ฐ์ง๋ ์ ์ญ state๋ฅผ ๋ง๋ค์ด, ๋ฉ์ธํ์ด์ง์์ ์์ธํ์ด์ง๋ก ์ด๋๋๋ฉด ๊ฐ์ false๋ก ๋ฐ๊พธ๊ณ ์ปค๋ฎค๋ํฐ ํ์ด์ง์์ ์ด๋๋๋ฉด ๊ฐ์ true๋ก ๋ฐ๊พธ๋ ๋ก์ง์ ๊ตฌ์ฑํ์ต๋๋ค
์์ธํ์ด์ง์์ ๋ง์ฝ ์ด ๊ฐ์ด true๋ฉด ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๋๋ ์ ๋ ์ปค๋ฎค๋ํฐ ํ์ด์ง๋ก ๊ฐ๊ฒ๋ ํ๊ณ , false๋ฉด ๋ฉ์ธํ์ด์ง๋ก ๊ฐ๊ฒ๋ ๋ก์ง์ ์ฌ๊ตฌ์ฑ ํ์ต๋๋ค.
input range ์ฌ์ฉ์ ๊ฒฝํ ๊ฐ์ [์ง์ฐ]
- ๋ฌธ์ -input range๋ฅผ ํตํด ์์ ์ ๊ฐ์ ์ ์ ํํ๊ณ ๋ค์ ํ์ด์ง๋ก ์ด๋ํ๋ค๊ฐ ๋ค์ ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ๋๋ฅด๋ฉด input range์ ๊ฐ์ด ์ด๊ธฐํ๋์ด์ด์ ์ฌ์ฉ์์๊ฒ ๋ถํธ๊ฐ์ ์ด๋
- ํด๊ฒฐ -
input range์ value๊ฐ์ ์ ์ญ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ recoil์ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ์ ์ฅํ๋ ํ์ด์ง ์ด๋ ํ ๋ค์ ๋์์๋ value๊ฐ์ด ๋ณํ์ง ์์์ต๋๋ค.
์นด์นด์ค ๊ณต์ ํ๊ธฐ ๊ธฐ๋ฅ ์ถ๊ฐ [๋์ฉ]
- ํผ๋๋ฐฑ -"๋์ ๊ฐ์ ์ผ๊ธฐ๋ฅผ ์ธ์คํ๋ ์นด์นด์ค๋ก ๊ณต์ ํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค"
- ํด๊ฒฐ -

Kakao develop์์ ๊ณต์ ํ๊ธฐ๋ฅผ ์ํ ์ธํ ์ ํด์ฃผ์๊ณ ๊ณต์๋ฌธ์์ ๋ฐ๋ผ ๊ณต์ ํ๊ธฐ ๊ธฐ๋ฅ์ ๋ง๋ค์๋ค.