Ea-Syno.dev

  1. Work>
  2. Pixtudy(ํ”ฝ์Šคํ„ฐ๋””)

๐Ÿ“•ย ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ


Pixtudy Hero

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

  • ๊ธฐ๊ฐ„ : 24.01. ~ 24.02. 5์ฃผ
  • ์ธ์› : FE 4๋ช…
  • ํ•œ ์ค„ ์„ค๋ช… : ์œ ์ € ์ปค์Šคํ…€ ๋ ˆ์ด์•„์›ƒ, ๋‹ค์ค‘ ํ™”๋ฉด ๊ณต์œ , ํ˜‘์—… ํˆด์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋‚ด ํ™”์ƒ ํšŒ์˜ ์›น ์•ฑ
  • ๋งํฌ : Github / Site / Figma

ํ”„๋กœ์ ํŠธ ๋ฐฐ๊ฒฝ

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

ํ”„๋กœ์ ํŠธ ์„ค๋ช…

Pixtudy๋Š” ๋ฐœํ‘œ์ž์˜ ํ™”๋ฉด์„ ์ผ๋ฐฉ์ ์œผ๋กœ ๊ณต์œ ๋ฐ›๋˜ ์ฒญ์ทจ์ž๋“ค์ด ์ž์œ ๋กญ๊ฒŒ ์ž๋ฃŒ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ๋ฐœํ‘œ์ž๋Š” ์ฒญ์ทจ์ž์˜ ํ™˜๊ฒฝ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ณ  ํšจ์œจ์ ์œผ๋กœ ์ž๋ฃŒ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ™”์ƒํšŒ์˜ ํ”Œ๋žซํผ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. Phaser์™€ ๊ฒŒ๋” ํƒ€์šด์˜ ์—์…‹์„ ํ™œ์šฉํ•œ ๊ฐ€์ƒํ™˜๊ฒฝ ๊ตฌ์ถ•, WebRTC๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋‹ค์ค‘ ์˜์ƒ ๊ณต์œ , ์Šคํฌ๋Ÿผ ๋ณด๋“œ๋ฅผ ํ†ตํ•œ ํ˜‘์—… ์ง€์› ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์ƒˆ๋กœ์šด ํ˜•ํƒœ์˜ ๋ฉ”ํƒ€๋ฒ„์Šค ๊ธฐ๋ฐ˜ ํ™”์ƒ ํšŒ์˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ

  1. ์‹ค์‹œ๊ฐ„ ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ”Œ๋žซํผ
    1. Phaser3 + ๊ฒŒ๋” ํƒ€์šด ์—์…‹์„ ์ด์šฉํ•œ ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ”Œ๋žซํผ ๊ตฌํ˜„
    2. Socket์„ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ๋ฉ€ํ‹ฐ ํ”Œ๋ ˆ์ด ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  2. ํ™”์ƒ ํšŒ์˜ ์ฑ„ํŒ… ๊ธฐ๋Šฅ
    1. Mediasoup์„ ์ด์šฉํ•œ WebRTC ๊ธฐ๋ฐ˜ SFU ๋ฐฉ์‹ ์ ์šฉ ๊ตฌํ˜„
    2. ์‹ค์‹œ๊ฐ„ ๋‹ค์ค‘ ํ™”๋ฉด (์ตœ๋Œ€ 4๊ฐœ), ์›น ์บ , ๋งˆ์ดํฌ ๊ณต์œ ๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ํ™”์ƒ ํšŒ์˜ ๊ตฌํ˜„
    3. ๋‹ค์ค‘ ํ™”๋ฉด ๊ณต์œ  ์‹œ ์‹œ์ฒญ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ, ํŠน์ • ํ™”๋ฉด ํ™•๋Œ€ / ์ถ•์†Œ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  3. ์Šคํฌ๋Ÿผ ๋ณด๋“œ๋ฅผ ํ†ตํ•ฉ ํ˜‘์—… ํˆด ๊ธฐ๋Šฅ ์ œ๊ณต
    1. Supabase RealTime์„ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค ์ œ๊ณต
    2. ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ„๋„ ํŽ˜์ด์ง€ ๋ฐ ๊ฐ€์ƒ ํ™˜๊ฒฝ (์ŠคํŽ˜์ด์Šค) ๋‚ด๋ถ€์—์„œ ์ด์šฉ ๊ฐ€๋Šฅ
    3. ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋ž ๊ธฐ๋Šฅ์„ ํ†ตํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ
  4. ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ํ†ตํ•œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ
    1. ESLint๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ผ๊ด€์„ฑ ์œ ์ง€
    2. ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ์ •๋ฆฝ์„ ํ†ตํ•ฉ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ

์•„ํ‚คํ…์ณ

pixtudy_architecture

๊ธฐ์ˆ  ์Šคํƒ

  • ๊ณตํ†ต ๋ฐ ๋ฐฐํฌ : 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 โ†’ SSG ๋ฐฉ์‹ ๋ณ€๊ฒฝ์œผ๋กœ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„  ( 2000ms โ†’ 40ms, 80%๊ฐ์†Œ)

  • SSR ๋ฐฉ์‹์œผ๋กœ ์ŠคํŽ˜์ด์Šค ์ •๋ณด + ์œ ์ € ์ŠคํŽ˜์ด์Šค ์ฐธ์—ฌ ์—ฌ๋ถ€ ๋ฐ์ดํ„ฐ ํŒจ์นญ โ†’ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ์ €ํ•˜ (2000ms)

ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… SSR 2000ms

  • SSG ๋ฐฉ์‹์œผ๋กœ ์ŠคํŽ˜์ด์Šค ์ •๋ณด ํŒจ์นญ + ํด๋ผ์ด์–ธํŠธ ์ฐธ์—ฌ ์—ฌ๋ถ€ ์ฒ˜๋ฆฌ ํ•ด๊ฒฐ โ†’ ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„  (40ms) ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… SSG 40

์ค‘๋ณต ์ ‘์† ๋ฐฉ์ง€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

  • ์ค‘๋ณต ์ ‘์† ์‹œ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋– ๋‚ฌ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๋Š” ํ˜„์ƒ ๋ฐ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ƒ ํ™˜๊ฒฝ ํ”Œ๋žซํผ ๋‚ด ์กด์žฌํ•˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ์ตœ์ดˆ socket ์—ฐ๊ฒฐ ์‹œ ์„œ๋ฒ„ ์ธก์—์„œ ์ค‘๋ณต ์ ‘์† ์—ฌ๋ถ€ ํ™•์ธ
  • ์ค‘๋ณต ์ ‘์† ์‚ฌ์šฉ์ž๋Š” ๋ฆฌ๋””๋ ‰์…˜์„ ํ†ตํ•˜์—ฌ ์ค‘๋ณต ์ ‘์† ๋ฐฉ์ง€ ๊ธฐ๋Šฅ ๊ตฌํ˜„

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๋ฉ€ํ‹ฐ Socket ๋ฌธ์ œ ํ•ด๊ฒฐ

  • ํ™”๋ฉด ๊ณต์œ ๋ฅผ ์ค‘๋‹จํ•ด๋„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ฌ์ „ํžˆ ๊ฒ€์€์ƒ‰ ํ™”๋ฉด์œผ๋กœ ๊ณต์œ ๋˜๊ณ  ์žˆ๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ

    โ†’ ๋ฉ€ํ‹ฐ Socket ์ธ์Šคํ„ด์Šค๋กœ ํ™”๋ฉด ๊ณต์œ , ์ค‘๋‹จ ์ด๋ฒคํŠธ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์›์ธ

  • Zustand๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด ๊ตฌํ˜„์œผ๋กœ ๋ฉ€ํ‹ฐ Socket ์ธ์Šคํ„ด์Šค ๋ฌธ์ œ ํ•ด๊ฒฐ

์ด๋ฒคํŠธ ์œ„์ž„์„ ํ†ตํ•œ ํšจ์œจ์  ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

  • ๊ฐ€์ƒ ํ™˜๊ฒฝ ๋‚ด ํŠน์ • ํ‚ค ๊ฐ’(โ€™Rโ€™)์— ๋Œ€ํ•œ ์ด๋ฒคํŠธ ํƒ์ง€๋กœ ์ธํ•œ input, textarea์— ์ž…๋ ฅ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ๋ถ€๋ชจ ์š”์†Œ์— focus, blur ์ด๋ฒคํŠธ ์œ„์ž„์„ ํ†ตํ•ด ํšจ์œจ์  ๋ฌธ์ œ ํ•ด๊ฒฐ