๐ย ํ๋ก์ ํธ ์๊ฐ
ํ๋ก์ ํธ ๊ฐ์
- ๊ธฐ๊ฐ : 24.01. ~ 24.02. 5์ฃผ
- ์ธ์ : FE 4๋ช
- ํ ์ค ์ค๋ช
: ์ ์ ์ปค์คํ
๋ ์ด์์, ๋ค์ค ํ๋ฉด ๊ณต์ , ํ์
ํด์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ ํ๊ฒฝ ๋ด ํ์ ํ์ ์น ์ฑ
- ๋งํฌ : Github / Site / Figma
ํ๋ก์ ํธ ๋ฐฐ๊ฒฝ
๊ธฐ์กด ๋ฉํ๋ฒ์ค ํ์ ํ์ ํ๋ซํผ์์ ์ฒญ์ทจ์๋ ๋ฐํ์๊ฐ ์ ๊ณตํ๋ ์ผ๋ฐฉ์ ์ธ ํ๋ฉด ์ธ ์ถ๊ฐ ์ ๋ณด๋ฅผ ํ์ํ๊ฑฐ๋ ์ฐธ์กฐํ ์ ์์ผ๋ฉฐ, ๋ฐํ์๋ ์ฒญ์ทจ์์ ๋ค์ํ ํ๊ฒฝ์ ๋ง์ถฐ์ ์ค๋นํด์ผ ํ๋ ๋ฌธ์ ์ ์ ๊ฐ์ ํ๊ณ ์ ๋ง๋ค์๋ค.
ํ๋ก์ ํธ ์ค๋ช
Pixtudy๋ ๋ฐํ์์ ํ๋ฉด์ ์ผ๋ฐฉ์ ์ผ๋ก ๊ณต์ ๋ฐ๋ ์ฒญ์ทจ์๋ค์ด ์์ ๋กญ๊ฒ ์๋ฃ๋ฅผ ํ์ํ๊ณ , ๋ฐํ์๋ ์ฒญ์ทจ์์ ํ๊ฒฝ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ํจ์จ์ ์ผ๋ก ์๋ฃ๋ฅผ ๊ณต์ ํ ์ ์๋ ํ์ํ์ ํ๋ซํผ์ ๋ชฉํ๋ก ํ๋ค. Phaser์ ๊ฒ๋ ํ์ด์ ์์
์ ํ์ฉํ ๊ฐ์ํ๊ฒฝ ๊ตฌ์ถ, WebRTC๋ฅผ ์ด์ฉํ ์ค์๊ฐ ๋ค์ค ์์ ๊ณต์ , ์คํฌ๋ผ ๋ณด๋๋ฅผ ํตํ ํ์
์ง์ ๋ฑ์ ๊ธฐ๋ฅ์ ํตํด ์ฌ์ฉ์๋ค์๊ฒ ์๋ก์ด ํํ์ ๋ฉํ๋ฒ์ค ๊ธฐ๋ฐ ํ์ ํ์ ๊ฒฝํ์ ์ ๊ณตํ๋ค.
ํ๋ก์ ํธ ๊ธฐ๋ฅ
- ์ค์๊ฐ ๊ฐ์ ํ๊ฒฝ ํ๋ซํผ
- Phaser3 + ๊ฒ๋ ํ์ด ์์
์ ์ด์ฉํ ๊ฐ์ ํ๊ฒฝ ํ๋ซํผ ๊ตฌํ
- Socket์ ํตํ ์ค์๊ฐ ๋ฉํฐ ํ๋ ์ด ํ๊ฒฝ ๊ตฌ์ฑ
- ํ์ ํ์ ์ฑํ
๊ธฐ๋ฅ
- Mediasoup์ ์ด์ฉํ WebRTC ๊ธฐ๋ฐ SFU ๋ฐฉ์ ์ ์ฉ ๊ตฌํ
- ์ค์๊ฐ ๋ค์ค ํ๋ฉด (์ต๋ 4๊ฐ), ์น ์บ , ๋ง์ดํฌ ๊ณต์ ๋ฅผ ์ด์ฉํ ์ค์๊ฐ ํ์ ํ์ ๊ตฌํ
- ๋ค์ค ํ๋ฉด ๊ณต์ ์ ์์ฒญ์๊ฐ ์ํ๋ ๋ ์ด์์, ํน์ ํ๋ฉด ํ๋ / ์ถ์ ๊ธฐ๋ฅ ๊ตฌํ
- ์คํฌ๋ผ ๋ณด๋๋ฅผ ํตํฉ ํ์
ํด ๊ธฐ๋ฅ ์ ๊ณต
- Supabase RealTime์ ์ด์ฉํ ์ค์๊ฐ ์๋น์ค ์ ๊ณต
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ก ๋ณ๋ ํ์ด์ง ๋ฐ ๊ฐ์ ํ๊ฒฝ (์คํ์ด์ค) ๋ด๋ถ์์ ์ด์ฉ ๊ฐ๋ฅ
- ๋๋๊ทธ ์ค ๋๋ ๊ธฐ๋ฅ์ ํตํ ์ฌ์ฉ์ ๊ฒฝํ ํฅ์
- ์ฝ๋ ์ปจ๋ฒค์
์ ํตํ ํ๋ก์ ํธ ๊ด๋ฆฌ
- ESLint๋ฅผ ํ์ฉํ์ฌ ์ฝ๋์ ์ผ๊ด์ฑ ์ ์ง
- ์ฝ๋ ์ปจ๋ฒค์
์ ๋ฆฝ์ ํตํฉ ํ๋ก์ ํธ ๊ด๋ฆฌ
์ํคํ
์ณ
๊ธฐ์ ์คํ
- ๊ณตํต ๋ฐ ๋ฐฐํฌ : Yarn, Git, GitHub, Vercel, AWS
- Front-End : TypeScript, Next JS, Zustand, React-Query, React-Hook-Form, Styled-Components, Framer, Socket.IO, Mediasoup, Phaser3, Joyride, React-dnd
- Back-End : Node JS, Express JS, Socket.IO, Mediasoup
- BasS : Supabase
โ
ย ์ฃผ์ ๊ตฌํ ์ฌํญ
WebRTC ๊ธฐ์ ์ ํ์ฉํ ํ์ ํ์ ๊ธฐ๋ฅ ๊ตฌํ
-
WebRTC ๊ธฐ์ ๊ธฐ๋ฐ ํ๋ฉด ๊ณต์ (์ต๋ 4๊ฐ), ์น ์บ , ๋ง์ดํฌ ๊ณต์ ๊ธฐ๋ฅ ๊ตฌํ
-
N:M ํ์ํ์๋ฅผ Mesh ๋ฐฉ์์ผ๋ก ๊ตฌํ ์ ํด๋ผ์ด์ธํธ ๋ถ๋ด โฌ๏ธ
โ SFU ๋ฐฉ์์ ์ด์ฉํ Mediasoup์ ์ด์ฉํ์ฌ ํด๋ผ์ด์ธํธ ๋ถ๋ด โฌ๏ธ, ์ ์ง์ฐ์ฑ, ์ค์๊ฐ์ฑ ํ๋ณด
Space CRUD
- Supabase, React-Hook-Form, Zustand๋ฅผ ์ด์ฉํ์ฌ Space CRUD ๊ตฌํ
- ์คํ์ด์ค ์ด๋ฆ, ์ค๋ช
๊ธธ์ด ์ ํ ๋ฑ ์ ํจ์ฑ ๊ฒ์ฌ ๊ธฐ๋ฅ ๊ตฌํ
Dashboard ํ์ด์ง
- SSG ๋ฐฉ์์ ์ด์ฉํ์ฌ ๋ฐฐ๋ ์ฌ๋ผ์ด๋ ์ผ ๊ตฌํ
- Swiper์ ์ด์ฉํ์ฌ ์ฌ๋ผ์ด๋ ์ผ UX ํฅ์
Home ํ์ด์ง ์คํฌ๋กค ์ ๋๋ฉ์ด์
๊ตฌํ
- ์ปดํฌ๋ํธ ๋ง์ดํธ ์์ ์ ์คํฌ๋กค ์๊ณ๊ฐ ๊ณ์ฐํ๊ณ , ๋ธ๋ผ์ฐ์ ์ฐฝ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๊ณ๊ฐ ์ฌ๊ณ์ฐ
- IntersectionObserver๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ๋ทฐํฌํธ์ ๋ค์ด์ฌ ๋ ์น์
์๋ณ
๐ ๏ธย ํธ๋ฌ๋ธ ์ํ
- SSR ๋ฐฉ์์ผ๋ก ์คํ์ด์ค ์ ๋ณด + ์ ์ ์คํ์ด์ค ์ฐธ์ฌ ์ฌ๋ถ ๋ฐ์ดํฐ ํจ์นญ โ ํ์ด์ง ๋ก๋ฉ ์๋ ์ ํ (2000ms)
- SSG ๋ฐฉ์์ผ๋ก ์คํ์ด์ค ์ ๋ณด ํจ์นญ + ํด๋ผ์ด์ธํธ ์ฐธ์ฌ ์ฌ๋ถ ์ฒ๋ฆฌ ํด๊ฒฐ โ ํ์ด์ง ๋ก๋ฉ ์๋ ๊ฐ์ (40ms)
- ์ค๋ณต ์ ์ ์ ๊ฐ์ ํ๊ฒฝ์ ๋ ๋ฌ์์๋ ๋ถ๊ตฌํ๊ณ ๊ทธ๋๋ก ๋จ์์๋ ํ์ ๋ฐ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ฐ์ ํ๊ฒฝ ํ๋ซํผ ๋ด ์กด์ฌํ๋ ๋ฌธ์ ๋ฐ์
- ์ต์ด socket ์ฐ๊ฒฐ ์ ์๋ฒ ์ธก์์ ์ค๋ณต ์ ์ ์ฌ๋ถ ํ์ธ
- ์ค๋ณต ์ ์ ์ฌ์ฉ์๋ ๋ฆฌ๋๋ ์
์ ํตํ์ฌ ์ค๋ณต ์ ์ ๋ฐฉ์ง ๊ธฐ๋ฅ ๊ตฌํ
-
ํ๋ฉด ๊ณต์ ๋ฅผ ์ค๋จํด๋ ๋ค๋ฅธ ์ฌ์ฉ์์๊ฒ ์ฌ์ ํ ๊ฒ์์ ํ๋ฉด์ผ๋ก ๊ณต์ ๋๊ณ ์๋ ๋ฌธ์ ๋ฐ์
โ ๋ฉํฐ Socket ์ธ์คํด์ค๋ก ํ๋ฉด ๊ณต์ , ์ค๋จ ์ด๋ฒคํธ๊ฐ ์ ๋๋ก ๋์ํ์ง ์๋ ๊ฒ์ด ์์ธ
-
Zustand๋ฅผ ์ด์ฉํ์ฌ ์ฑ๊ธํค ํจํด ๊ตฌํ์ผ๋ก ๋ฉํฐ Socket ์ธ์คํด์ค ๋ฌธ์ ํด๊ฒฐ
์ด๋ฒคํธ ์์์ ํตํ ํจ์จ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ
- ๊ฐ์ ํ๊ฒฝ ๋ด ํน์ ํค ๊ฐ(โRโ)์ ๋ํ ์ด๋ฒคํธ ํ์ง๋ก ์ธํ input, textarea์ ์
๋ ฅ์ด ์ ๋๋ก ์๋ํ์ง ์๋ ๋ฌธ์ ๋ฐ์
- ๋ถ๋ชจ ์์์ focus, blur ์ด๋ฒคํธ ์์์ ํตํด ํจ์จ์ ๋ฌธ์ ํด๊ฒฐ