배포(vercel) : https://goodluck-steel.vercel.app/
노션 : https://best-athlete-e88.notion.site/To-Be-luckier-9b31bcbf243848249a9171c431c9af20
drei의 HTML컴퍼넌트의 구현 원리에 의한 ContextApi와의 호완 문제 디버깅
position, velocity, applyForce, wheel 의 4가지 방법을 직접 도입 및 비교하여 position 방식으로 이동 구현
필요한 글리프만 추출하여 16108Kb → 22Kb로 최적화
type EventType<T> = T extends { type: infer U } ? U : never;
type ShibaEventType = {
[K in keyof typeof SHIBA_EVENT]: EventType<(typeof SHIBA_EVENT)[K][number]>;
}[keyof typeof SHIBA_EVENT];
┣ 📂app : Next.js 앱 라우터에 의해 관리되고 라우팅 구조를 정의하는 코드
┣ 📂features : 페이지 별로 코드를 관리
┃ ┣ 📂enforcement
┃ ┃ ┣ 📂components
┃ ┃ ┣ 📂hooks
┃ ┣ 📂 ...
┣ 📂public : asset 관리
┃ ┣ 📂font
┃ ┣ 📂images
┃ ┣ 📂models
┣ 📂remote : Firebase와 API 통신을 위한 코드
┃ ┣ 📂models : Firebase와 API 통신에 필요한 데이터 모델 정의
┣ 📂shared : 공유되는 코드
┃ ┣ 📂components
┃ ┃ ┣ 📂3dmodel
┃ ┃ ┣ 📂header
┃ ┃ ┣ 📂portal
┃ ┣ 📂constants
┃ ┣ 📂hooks
┃ ┣ 📂styles
┃ ┗ 📂utils
┗ 📂store : 전역 변수 상태 관리
USERS
└── userId (Document)
├── ENFORCEMENT (Sub-Collection)
│ └── id (Document)
│ ├── date(fieldA): TimeStamp
│ ├── percent(fieldB): number
│ └── status(fieldC): string
└── SHIBA (Sub-Collection)
└── id (Document)
│ ├── date(fieldA): TimeStamp
└── type(fieldB): string