๐ฎ DD Math
#Math Education Game
#For Kids
#Drag&Drop
DD์ํ์ ์ยท์ ์๋ฅผ ์ํ ์ํ ๊ต์ก ๊ฒ์์
๋๋ค.
์์ด๋ค์ด ์ฝ๊ฒ ์ด์ฉํ ์ ์๋๋ก, ๋๋๊ทธ ์ค ๋๋์ ์ด์ฉํด ๊ฒ์์ ๊ตฌํํด ๋ณด์์ต๋๋ค.
- ํ๋ก์ ํธ ๊ธฐ๊ฐ 2021.09.27 - 2021. 10. 18 (๊ธฐํ 1์ฃผ, ๊ฐ๋ฐ 2์ฃผ)
๐ Deploy Address: https://www.ddmath.fun
๐ Frontend: https://github.com/DDMath/ddmath-frontend
๐ Backend: https://github.com/DDMath/ddmath-backend
๐ผ Preview
์ฒซ ๋ฒ์งธ ๊ฒ์ (Shooting game)
- 1๋ถํฐ 10๊น์ง ์ฐจ๋ก๋ก ํ์ ์ ํฐ๋จ๋ฆฌ๋ ๊ฒ์์ ๋๋ค.
- ๋ํฌ์ ๋ง์ฐ์ค ํฌ์ธํฐ ์ฌ์ด์ ๋ฒกํฐ(Vector) ๊ฐ์ ์ด์ฉํ์ฌ ๋ํฌ์ ๋ฐฉํฅ์ ๊ตฌํํ์ต๋๋ค.
stage1.mp4
๋ ๋ฒ์งธ ๊ฒ์ (Puzzle game)
- ๊ณผ์ผ๊ณผ ์ซ์์ ๋ง์ถฐ ์นด๋๋ฅผ ๋ง์ถ์ด ๋ฃ๋ ๊ฒ์์ ๋๋ค.
stage2.mp4
์ธ ๋ฒ์งธ ๊ฒ์ (Matching game)
- ๊ฐ์ ๋ชจ์์ ๊ฐ์ง ์นด๋๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ ๊ฒ์์ ๋๋ค.
stage3.mp4
๐ Motivation
๊ฐ๋ฐ๋์๊ตญ์ ์ด์ ํ ๊ต์ก ํ๊ฒฝ์ ์ง์ ๋ชฉ๊ฒฉํ ๊ฒฝํ์ด ์์ต๋๋ค. ํนํ, ์ด์งํธ ์นด์ด๋ก ๋ํ๊ต์์ ํ์๋ค์ ๊ณต๋ถ ํ๊ฒฝ์ ๋ํด ์ธํฐ๋ทฐ๋ฅผ ์งํํ ์ ์ด ์๋๋ฐ์. ์ธ๋, ์ค๋น ์ด์ธ์๋ ๋ฐฐ์์ ์๋จ์ด ๋ถ์กฑํ๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์ ์ ์์์ต๋๋ค.
ํ์ง๋ง, ๊ฐ๋ฐ๋์๊ตญ์ "์ค์ํ ์ ์๊ธฐ๊ธฐ ๋ณด๊ธ๋ฅ ", "์ ์๊ธฐ๊ธฐ ์นํ์ ๋ชจ์ต", "๋ง์ ์ธ๊ตฌ๋ฅผ ๋ฐํ์ผ๋ก ํ ๊ต์ก์ ๋ํ ์ ์ฌ์ ์์"๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ง์ฝ ์ํํธ์จ์ด๋ฅผ ํตํด ์์ง์ ๊ต์ก ์ปจํ ์ธ ๊ฐ ์ ๊ณต๋๋ค๋ฉด, ๋ง์ ์ฌ๋๋ค์ด ๊ต์ก์ ํํ์ ๋๋ฆด ์ ์๊ฒ ๋ค๊ณ ์๊ฐํ๋ฉฐ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ๊ธฐํํ๊ฒ ๋์์ต๋๋ค.
โญ๏ธ Features
- ๋๋์ํ์ ์ํ ๊ฒ์, ํผ์ฆ๊ฒ์, ์ฐ๊ฒฐ์ง๊ธฐ ๊ฒ์์ผ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๊ฒ์ ๊ตฌํ ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์๋, ์ค๋ ฅ, ์ถฉ๋, ๋ง์ฐ์ค ์ด๋ฒคํธ, ์๋๋ฉ์ด์ ๋ฑ์ ๋ชจ๋ ์ฌ์ฉํ๊ณ ์ ํ์์ต๋๋ค.
- ๊ฐ ๊ฒ์์ ๋ชจ๋ ๋๋๊ทธ ์ค ๋๋์ ํตํด ์งํ๋ฉ๋๋ค.
- ๊ฐ ๊ฒ์์ ํ๋ ์ด ํ๋ ๋ฐฉ๋ฒ์ ์ ๋๋ฉ์ด์ ์ ํตํด ์๋ดํฉ๋๋ค.
- ๊ฐ ๊ฒ์์์ ๋ณ์ ๋ค ๋ชจ์ ๊ฒฝ์ฐ, ๋ค์ ์คํ ์ด์ง๋ก ๋์ด๊ฐ ์ ์์ต๋๋ค.
- Progressive Web App์ ์ง์ํ์ฌ, ๊ธฐ๊ธฐ์ ํ๋ก๊ทธ๋จ์ ๋ค์ด๋ก๋ ํ ์ ์์ต๋๋ค.
- ์คํ๋ผ์ธ ๋ชจ๋๋ฅผ ์ง์ํ์ฌ, ์์ด๊ฐ ์ด๋์๋ ์ ์ํ์ฌ ๋๋์ํ์ ์ฆ๊ธธ ์ ์์ต๋๋ค.
๐ฌ Getting Started
Local ํ๊ฒฝ์์ ์คํ์ ์๋์ ๊ฐ์ด ์ค๋น๊ฐ ํ์ํฉ๋๋ค.
Client
REACT_APP_SERVER_URL=<default: http://localhost:8080>
REACT_APP_API_KEY=<Firebase API Key>
REACT_APP_AUTH_DOMAIN=<Firebase Auth Domain>
REACT_APP_PROJECT_ID=<Firebase Project ID>
REACT_APP_APP_ID=<Firebase App ID>
Server
ORIGIN_URI_PROD=<default: http://localhost:3000>
JWT_SECRET=<jwt secret key>
MONGODB_URL=<mongodb url>
MONGODB_NAME=<db name>
๐ฅ Tech Stacks
Client
- Typescript
- React
- Styled-Component
- Phaser3
- PWA
- Workbox
Server
- Node JS
- MongoDB
- Express
Deployment
- Netlify
- AWS Elastic Beanstalk
๐ค ์ด๋ ๊ฒ ๊ฐ๋ฐํ์ต๋๋ค
๐ ๊ฐ์ฒด์งํฅ ๊ตฌ์กฐ์ ์ค๊ณ
๊ฒ์ ํ๋ก์ ํธ๋ฅผ ์งํํ๊ธฐ ๋๋ฌธ์, ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ์ํธ์์ฉ์ ์ง๊ด์ ์ด๊ณ ๊ฐ๊ฒฐํ๊ฒ ๋ํ๋ด๊ธฐ ์ํด ๋ง์ ๊ณ ๋ฏผ์ ํ์ต๋๋ค. ์ด๋ก ์ ์ผ๋ก๋ ๊ณต๋ถํด ๋ณด์์ง๋ง, ์ฃผ๋์ ์ผ๋ก ๊ฐ์ฒด์งํฅ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํด๋ณธ ๊ฒ์ ์ฒ์์ด์๊ธฐ ๋๋ฌธ์ ๋๋ค.
-
์ฒซ ๋ฒ์งธ ์ํ ๊ฒ์์์ "๋ํฌ", "๋ํฌ์ ๋ฏธ์ฌ์ผ", "๋ฏธ์ฌ์ผ Preview" ๋ฑ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ์ฒด์ ์ฑ ์์ ๋ถ์ฐํ๋๋ก ํ์ฌ ๋จ์ผ ์ฑ ์ ์์น์ ์ง์ผ๋ณด๋ ค๊ณ ํ์ต๋๋ค.
-
์นด๋์ ๊ธฐ๋ณธ ์์ฑ์ ์ ์ํด๋๊ณ , ๋ค์๊ณผ ๊ฐ์ด ๋คํ์ฑ์ ๊ฐ๋๋ก ๊ตฌํํด๋ณด์์ต๋๋ค.
- ๋๋๊ทธ๊ฐ ๊ฐ๋ฅํ ์นด๋
- ํฌ์ธํธ ๊ฐ์ฒด๋ฅผ ์์์ผ๋ก ๊ฐ๊ณ ์๋ ์นด๋
-
๋ค๋ง, ํ์ฌ๋ ๊ฐ ์ธ์คํด์ค๊ฐ ์ฌ์ฉํ์ง ์๋ ๊ธฐ๋ฅ๊น์ง๋ ์ ๋ถ ์์๋ฐ๊ณ ์๋ ๋นํจ์จ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. Interface๋ Abstract Class๋ฅผ ํตํด ๊ฐ ์นด๋์ ์์ธ ์ฌํญ์ ๊ตฌํํ๋ค๋ฉด ๋์ฑ ํจ์จ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์์ ๊ฒ์ด๋ผ๋ ์์ฌ์์ด ๋จ์ต๋๋ค.
๐ Service Worker
์คํ๋ผ์ธ์์๋ ๊ฒ์์ ์ด์ฉํ ์ ์๋๋ก Service Worker๋ฅผ ๋์ ํ์ต๋๋ค. ํนํ, Workbox๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง, ์์ ๋ฑ ๊ฒ์์ ํ์ํ ํ์ผ๋ค์ Precache ํ์ผ๋ฉฐ, StaleWhileRevalidate ๋ฑ์ Workbox Strategy๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ๋ณ๊ฒฝ์ด ์๊ธธ ๊ฒฝ์ฐ ์ ๋ฐ์ดํธ ํ ์ ์๋๋ก ์งํํ์ต๋๋ค.
๋ํ Progressive Web App์ ๊ตฌํํ์ฌ ํจ๋ ๋ฅ์์๋ ํ์ต์ด ๊ฐ๋ฅํ๋๋ก ํ์ต๋๋ค. ํด๋น ๊ณผ์ ์์ ๋ค์๊ณผ ๊ฐ์ ์ต์ ํ ๊ณผ์ ์ ๋์ ํ์ฌ Lighthouse ํผํฌ๋จผ์ค ์์น๋ฅผ ํฌ๊ฒ ํฅ์์์ผฐ์ต๋๋ค.
- Webp ์ ์ฉํ์ฌ ์ด๋ฏธ์ง ์ฉ๋ 80% ๊ฐ์
- Component Lazy Loading
- CDN ์ค์ (Amazon Cloud Front)
- Resource Size 50% ๊ฐ์. ex) ๋ถํ์ํ Phaser ์์ ์ ์ธ
- ์ด๋ฏธ์ง ํ์ผ ํ๋ฆฌ์บ์ฑ & ํฐํธ ๋น๋๊ธฐ์ ์ผ๋ก ํ์ํ ๋ฌธ์๋ง ๋ก๋
Phaser ๊ฒ์ ์คํฌ๋ฆฝํธ ํ์ผ์ Lazy Loding์ ์ ์ฉํ์ง ๋ชปํ์ฌ, ํผํฌ๋จผ์ค ์ ์๋ฅผ ๋ ๋ง์ด ๋์ด์ฌ๋ฆฌ์ง ๋ชปํ ์ ์ด ์์ฝ์ต๋๋ค. ํ์ง๋ง, ๊ทธ๋์ ๊ณ ๋ คํ์ง ์์๋ ๊ฐ์ข ์ต์ ํ ๋ฐ Critical Rendering Path์ ๋ํด ์๊ฐ ํด๋ณด๊ฒ๋์ด ๋ฟ๋ฏํ๊ฒ ์๊ฐํฉ๋๋ค. ํนํ, ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ์ด ๋จ์์ ์ฐจ์ด๊ฐ ์ ์ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ข์ฐํ ์ ์๋ค๋ ์ ์ ๋ฐฐ์ฐ๊ฒ ๋๋ฉด์, ํ๋ก ํธ์ค๋ ๊ฐ๋ฐ์ ๋ ํฐ ํฅ๋ฏธ๋ฅผ ๋๋ผ๊ฒ ๋๋ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค.