IT/SSAFY
[SSAFY 7๊ธฐ]๊ณตํตํ๋ก์ ํธ "๋๋ฏผํธ" ํ๊ธฐ
๋ฌด๋
2022. 8. 21. 20:58
๐ง๐ป๐ป ๋ด๋น ์ญํ
- '๋๋ฏผํธ' ์๋น์ค ๊ธฐํ
- ๊ฒฝ๋งค ์ค๋น ๋ฐ ๊ฒฝ๋งค ์คํธ๋ฆฌ๋ฐ ์๋น์ค ๊ฐ๋ฐ
- OpenVidu์ WebSocket์ ํ์ฉํ webRTC ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ฐ
- ์น ์๋ฆผ ์๋น์ค ๊ฐ๋ฐ
- Notification API ํ์ฉํ ๋ธ๋ผ์ฐ์ ์๋ฆผ ์๋น์ค
- ์ฑํ
์๋น์ค ๊ฐ๋ฐ
- sockjs์ stompjs ํ์ฉ
- ํ์๊ฐ์
, ๋ก๊ทธ์ธ, ์ ๋ณด๊ด๋ฆฌ ์๋น์ค ๊ฐ๋ฐ
- React-hook-form์ ์ด์ฉํ ํ์๊ฐ์ form ๊ด๋ฆฌ
- Recoil, React-Query๋ฅผ ์ฌ์ฉํ ํ์ ์ ๋ณด ์ํ ๊ด๋ฆฌ
- ํด๋ํฐ ์ธ์ฆ์ ํตํ ํ์๊ฐ์
- ์๋น์ค ๋ฉ์ธ ํ ํ์ด์ง ๊ฐ๋ฐ
- ๊ฒฝ๋งค, ์ํ, ํ๋กํ ๊ฒ์ ์๋น์ค ๊ฐ๋ฐ
- ๊ฒฝ๋งค ํ๋ชฉ ํ์ด์ง ๊ฐ๋ฐ
- 404 Not Found ํ์ด์ง ๊ฐ๋ฐ
- Recoil๊ณผ React-Query๋ฅผ ์ด์ฉํ ์ํ ๊ด๋ฆฌ
- ์ฌ์ฌ์ฉ ํฅ์์ ์ํ ๋ฌดํ ์คํฌ๋กค ์ปดํฌ๋ํธ ๋ฐ Skeleton UI ๊ตฌํ
- React-Query์ useInifiniteQuery์ IntersectionObserver Api ํ์ฉ
- styled-components๋ฅผ ์ด์ฉํ CSS-in-JS ๋ฐฉ์ ์คํ์ผ๋ง ๊ตฌํ
โ๏ธ ํ๋ก์ ํธ๋ฅผ ํตํด ๋ฐฐ์ด ์
- OpenVidu๋ฅผ ํ์ฉํ WebRTC: ์์ํ๊ฒ ์ฌ๊ฒจ์ก๋ webRTC๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ์ฝ๊ฒ ํ๋ก์ ํธ์ ๋์ ํ๊ณ ์ openvidu ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ์๋ค. ๋์ ํจ์ ๋ถ๊ตฌํ๊ณ ๊ณต์ ๋ฌธ์์ ๋ด์ฉ์ด ๋ณ๋ก ์์๊ธฐ ๋๋ฌธ์ ์ฐธ๊ณ ์ฉ์ผ๋ก ์ ๊ณตํ๋ ์ฝ๋๋ค์ ํ ์ค์ฉ ์ผ์ด๊ฐ๋ฉฐ ํด๋น ๋ฉ์๋๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ํ์ ํด์ผ ํ์๋ค. ํผ์ ์์ํ์ง๋ง ๊ทธ ๋ด์ฉ์ด ๋๋ฌด๋ ๋ฒ ์ฐผ๊ธฐ ๋๋ฌธ์ ํ์๊ณผ ํจ๊ป ์คํฐ๋๋ฅผ ํ๋ฉฐ ์ฝ๋๋ฅผ ํ ์ค์ฉ ํ์ ํ์๊ณ , ๊ฐ๊ฐ์ ๋ฉ์๋๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ ์ ์๊ฒ ๋์๋ค. ์ถํ ๊ฐ์ธ์ devices์ ์ ๊ทผํ์ฌ ์นด๋ฉ๋ผ๋ฅผ on/off ํ๊ณ ๋ง์ดํฌ๋ ์ ํ์ ์ผ๋ก ์ปจํธ๋กคํ ์ ์๊ฒ ๋ง๋ค์๊ธฐ ๋๋ฌธ์, webRTC๋ฅผ ํ์ฉํ ํ๋ก์ ํธ๋ฅผ ์ดํ์ ๋ ํ๊ฒ ๋๋ค๋ฉด ๋์ฑ๋ ์ ์ด์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.
- SockJS์ stompjs๋ฅผ ํ์ฉํ websocket ์ฑํ ๋ฐ ๊ฒฝ๋งค ์คํธ๋ฆฌ๋ฐ ์ค์๊ฐ ๊ฒฝ๋งค: websocket์ ์๋๋ฐฉ๊ณผ ์ค์๊ฐ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์๋ฒ๊ฐ ์ด๋ค ์ญํ ์ ์ํํดํ๋ฉฐ, subscribe๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ๊ฐ์ ํต๋ก๋ฅผ ์ด์ด์ฃผ๋ฉฐ ์ฑํ ์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค๋ ์๋ฆฌ๋ฅผ ์ ์ ์๊ฒ ๋์๋ค. ๊ฒฝ๋งค ์คํธ๋ฆฌ๋ฐ ํ์ด์ง์ ๋์ ํ๊ธฐ๊น์ง ์ค๋ ๊ฑธ๋ ธ์ง๋ง, ์ดํ 1๋ 1 ์ฑํ ๊ตฌํ์์๋ ์ ๋ง ๊ฐ๋จํ๊ฒ ์ ์ฉํ ์ ์๊ฒ ๋์๋ค. ์ง๊ธ์ ๊ฐ๋จํ ๋ฉ์์ง ์ ๋๋ฐ์ ์ฃผ๊ณ ๋ฐ์ง ๋ชปํ์ง๋ง, ์ถํ ์ด๋ฏธ์ง ์ ๋ฌ ๋ฑ ๋ฌด๊ถ๋ฌด์งํ๊ฒ ํ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค.
- Recoil๊ณผ React-Query: ํ๋ก์ ํธ๊ฐ ํฐ ๊ท๋ชจ๋ ์๋์ง๋ง ์ด๋ ์ ๋์ ์ํ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค ์ฌ๊ฒผ๊ณ , ๊ทธ๋์ ํ์ตํด๋ณด๊ณ ์ถ์๋ ๋ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ ์ ์์๋ค. ์ฐ์ ๊ธฐ์กด์ redux์ ๋ฌ๋ ์ปค๋ธ๋ก ์ธํด react๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ๋ ํ์์ด ๋จ ์๊ฐ์ ์ ์ฉํ๊ธฐ ์ด๋ ต๋ค ํ๋จํ์๊ณ , ์๋ฒ ๋ฐ์ดํฐ์ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ์ฌ ํ๋์ ์คํ ์ด์ ์ง์ค๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด recoil๊ณผ react-query๋ฅผ ๊ฐ๊ฐ ๋์ ํ๊ฒ ๋์๋ค. recoil์ redux์ ๋นํด devtools๋ฅผ ์ ๊ณตํ์ง ์๊ณ ์์ง ์์ ํ ๊ธฐ๋ฅ์ ๊ฐ์ถ์๋ค๊ณ ๋ณด๊ธฐ ์ด๋ ค์ ์ง๋ง ํด๋น ์๋น์ค๋ฅผ ์ฌ์ฉํจ์ ์์ด ์ ๋นํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋ฆฌ๊ณ react-query๋ฅผ ๋์ ํ์ฌ ์๋ฒ ๋ฐ์ดํฐ์ ์ํ ๊ด๋ฆฌ๋ฅผ ์ํํ์๊ณ , ๋ฌดํ ์คํฌ๋กค ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํจ์ ์์ด ํด๋น ๊ธฐ์ ์ ํตํด ์ฌ์ฉ์ ๊ฒฝํ์ฑ ๋ํ ์ข์์ก๋ค๊ณ ์๊ฐํ๋ค.
- React-Hook-Form: ๋ก๊ทธ์ธ ๋ฐ ํ์๊ฐ์ ๋ฑ ๋ค์ํ form์ ์์ฑํ๋ ๋ฐ ์์ด ๋ฐธ๋ฆฌ๋ฐ์ด์ ๋ฑ ์ ์ฉํ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋จํ์ฌ ๋์ ํ์๋ค. ์์ฒด ํ์๊ฐ์ ๊ธฐ๋ฅ์ ์์ด ์ ๊ทํํ์, required ๋ฑ ์ ๋ง๋ก ๋ง์ ๊ณณ์์ ๋ฐธ๋ฆฌ๋ฐ์ด์ ํญ๋ชฉ์ด ํ์ํ์๊ณ , ๊ฐ๊ฐ์ ๋ฉ์๋ค์ ๋ณ๋๋ก ๊ตฌํํ๋ ๊ฒ์ด ์๋๋ผ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์์ ๋ฐ์ ์์ํ๊ฒ ๊ฒ์ฆ์์ ์ ์ํํ ์ ์์๋ค.
- React.Memo๋ฅผ ํ์ฉํ ๋ฆฌ ๋ ๋๋ง ์ค์ด๊ธฐ: map์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๋ฉฐ ์ฝ๋ ์๋ฅผ ์ค์ผ ์ ์์์ง๋ง, ํ๋์ ์ปดํฌ๋ํธ์ ๋ํ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ๋ชจ๋ ์ฌ ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์๋ค. ํนํ 1:1 ์ฑํ ์ ๊ฒฝ์ฐ ์ฑํ ์ฐฝ ํ๋๋ฅผ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ์๊ณ , socket์ ์ํด ์ฑํ ์ ์ฃผ๊ณ ๋ฐ์ ๋๋ง๋ค ์ฑํ ์ state์ ์ ์ฅํ๊ณ ์ถ๊ฐ์ ์ผ๋ก ๋ ๋๋ง์ ์ํค๋ ค๊ณ ํ์๋ค. memo๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฉ์์ง๊ฐ ์ถ๊ฐ๋ ๋๋ง๋ค ๊ธฐ์กด์ ์ ์ฅ๋ ๋ฉ์์ง๊น์ง ๋ชจ๋ ์ฌ ๋ ๋๋ง์ด ๋ฐ์ํ์ฌ 100๊ฐ์ ๋ฉ์์ง๊ฐ ์์์ ๋ 100๋ฒ์ ๋ ๋๋ง์ด ์ถ๊ฐ์ ์ผ๋ก ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ด์๋ค. ํ์ง๋ง memo๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌ ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ด๋ฃฐ ์ ์์๋ค.
โ ํ๋ก์ ํธ์์ ์์ฌ์ด ์
- ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง์ ํตํ ์ต์ ํ ๋ถ์ฌ
- ์ฑ๋ฅ ์ต์ ํ ์์ ์ ์ํํ๊ธฐ CLS๋ฅผ 0.2๋ก ๋ฎ์ถ๊ณ select ์ต์ ์ ํตํด ๊ธฐ๋ณธ ๋ก๊ณ ์ png, webp๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ฅธ ์ด๋ฏธ์ง ํ์ฅ์๋ฅผ ์ ํํ๋๋ก ํ์์ผ๋ฉฐ, banner์ logo ๋ฑ์ ์ด๋ฏธ์ง ๋น์จ์ ์ผ์น์์ผ ํผํฌ๋จผ์ค ์ฑ๋ฅ์ ์ฌ๋ฆด ์ ์์๋ค.
- ํ์ง๋ง ์ฌ์ฉ์๊ฐ ์ง์ ์ด๋ฏธ์ง๋ฅผ ๋ฑ๋กํ์ฌ ํด๋น ์ด๋ฏธ์ง๊ฐ ์ปดํฌ๋ํธ์ ๋ฉ์ธ์ ๋ํ๋๋ฉด์ S3์ ์ฌ๋ผ๊ฐ ํ์ผ์ ๋ํ ํ์ฅ์๋ฅผ ๋ณ๊ฒฝํ์ง ๋ชปํ์๊ณ , ์นด๋์ ์ด๋ฏธ์ง ๋น์จ์ 4:3์ผ๋ก ๊ณ ์ ํด๋์๊ธฐ ๋๋ฌธ์ img ํ๊ทธ์ object-fit์ผ๋ก cover๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์ ๋น์จ์ ๋ค๋ฅด๊ฒ ํ๊ธฐ ๋๋ฌธ์ ํผํฌ๋จผ์ค๊ฐ ๋จ์ด์ก๋ค. ์ด๋ฏธ์ง ๋ฆฌ์ฌ์ด์ง์ ๋์ ํด ํด๋น ํผํฌ๋จผ์ค์ ์ฑ๋ฅ์ ์ฌ๋ฆฌ์ง ๋ชปํด ์์ฝ๋ค.
- typescript ๋ฏธ๋์
- react์ ๋ํ ํ๋ก์ ํธ ๊ฒฝํ์ด ์์๊ธฐ ๋๋ฌธ์ ํด๋น ํ๋ก์ ํธ์ typescript๋ฅผ ๋์ ํด๋ณด๊ณ ์ถ์ ์์ฌ์ด ์์์ง๋ง, react๋ฅผ ์๋กญ๊ฒ ๋ฐฐ์ฐ๋ ํ์๋ค๋ก ์ธํด ts๊น์ง ๋์ ์ ๋ฌด๋ฆฌ๋ผ ํ๋จ์ด ๋์ด ๋์ ํ์ง ๋ชปํ์๋ค. ์ถ๊ฐ์ ์ผ๋ก ๋ด๊ฐ ํ ๋ถ๋ถ์ ๋ํด์ ts๋ฅผ ๋์ ํ๊ฑฐ๋ ๋ค์ ํ๋ก์ ํธ์์ ts๋ฅผ ๋์ ํ๊ธฐ ์ํ ํ์ต์ ํ ๊ณํ์ด๋ค.
๐ ํฅํ ๊ณํ
- typescript ๋์
- ๋์ ์ธ์ด์ธ js์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์ ์ ์ธ์ด์ธ typescript์ผ๋ก ์ ํํ์ฌ ์บํ์ผ ๋จ๊ณ์์ ๋ฏธ๋ฆฌ ์ค๋ฅ๋ฅผ ๋ฐ๊ฒฌํ ์ ์๋ ๋ฑ ์ฅ์ ์ ๊ฐ์ก๊ธฐ ๋๋ฌธ์ ์ถํ ts๋ฅผ ๋์ ํด์ ํ๋ก์ ํธ์ ์์ฑ๋๋ฅผ ๋์ผ ๊ฒ์ด๋ค.
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์
- ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋จ์ํ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ฌ๋ถ๋ฅผ ๋ ๋์ ๋ ผ๋ฆฌ์ ์ผ๋ก ํ๋จํ์ฌ ํ๋ก์ ํธ์ ์๋ง์ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ ๊ณํ์ด๋ค.
- ๋ฆฌ์กํธ ์ฑ๋ฅ ์ต์ ํ
๐ ํ๋ก์ ํธ ํ๊ธฐ
- ํ๋ก์ ํธ์ ๋ํ ๋ฐฉํฅ์ฑ์ ๋จผ์ ์ ์ํ๊ณ ๋ง์ ๋ถ๋ถ์ ๋ฆฌ๋ํ์๊ธฐ ๋๋ฌธ์ ์ด๋ฒ ํ๋ก์ ํธ์ ๋ํ ์ฑ ์๊ฐ๊ณผ ๋ถ๋ด๊ฐ์ด ๋ง์ด ์์๋ค. ์ฒซ ํ์ ํ๋ก์ ํธ๋ฅผ ๊ฒฝํํ๋ ๊ต์ก์๋ค์ด ๋ง์๊ธฐ ๋๋ฌธ์ ์๋ ค์ค ์ง์๋ค์ ์ ์ต๋ํด๋๊ฐ์ง๋ง, ๋ชจ๋๊ฐ ๋์ผํ ์ ์์๋ค. ํ๋ก์ ํธ ์งํ์ ๋ง์ ์ด๋ ค์์ ๊ฒช๋ ์ฌ๋๋ ์์๋ค. ์ด ๋ถ๋ถ์ ๊ณ ๋ คํ์ง ๋ชปํ๊ณ ํ๋ก์ ํธ ๋ฐฉํฅ์ ๊ณํํ๊ธฐ ๋๋ฌธ์ ๊ณํ์ด ์์๋๋ก ์งํ๋์ง ๋ชปํ์ ๋ง์ ์ผ์ ์ ๋ง์ ์ํฅ์ ๋ฐ๊ฒ๋์๋ค. ํ๋ก์ ํธ ๊ณํ ์ ๋ค์ํ ๋ฐฉํฅ์ฑ์ ๊ณ ๋ คํ๊ณ , ์กฐ๊ธ ๋ ํจ๊ป ์ฑ์ฅํ ์ ์๋ ๋ฐฉํฅ์ ๊ณ ๋ฏผํด๋ด์ผ๊ฒ ๋ค.
- ํ๋ก์ ํธ์ ๋์ ํ ๋ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด ์ด๋ฃจ๊ณ ์ ํ ๋ชฉํ๋ฅผ ๋ฐ๋์ ์ค๊ณ๋ฅผ ํ๊ณ ๋ค์ด๊ฐ์ผํ๋ค๋ ๊ฒ์ ๊นจ๋ซ๊ฒ ๋์๋ค. ์๋ก์ด ๊ฒ์ ์๋ํด๋ณด๋ ๊ฒ๋ ์ข์ง๋ง, ํด๋น ํ๋ก์ ํธ๋ฅผ ํตํด์ ๋ด๊ฐ ์ด๋ฃจ๊ณ ์ํ๋ ๋ชฉํ๊ฐ ์๋ค๋ฉด ์กฐ๊ธ ๋ ๊น๊ฒ ํ์ตํ๊ณ ์ ์ฉํด ๋ณผ ์ ์์ผ๋ฉฐ, ์กฐ๊ธ ๋ ํด๋น ํ๋ก์ ํธ๊ฐ ์๋ฏธ๊ฐ ์์ ๊ฒ์ด๋ค. ์ด๋ฒ ํ๋ก์ ํธ์์ ๋ชฉํํ๋ ํฌํผ๋จผ์ค ํฅ์์๋ ์กฐ๊ธ ๋ฏธํกํ์ง๋ง, React.memo ๋ฑ์ ์ฌ์ฉํด์ ์ฌ๋ ๋๋ง์ ์กฐ๊ธ์ด๋ผ๋ ์ค์ผ ์ ์์๋ค. ๋ค์ ํ๋ก์ ํธ์์๋ ํผํฌ๋จผ์ค ์ต์ ํ์ ํ์ ์จ๋ณด์!
๋๋ฏผํธ ํ๋ก์ ํธ ์ด์ ๋ฐ ํด๊ฒฐ ๊ด๋ จ ๊ธ
๋ฐ์ํ