๊พธ์คํ ์ต๊ด ๊ด๋ฆฌ ๋ฐ ๋๊ธฐ ๋ถ์ฌ ์ ๊ณต์ ์ํด '์ต๊ด๋นต์ ๊ตฝ๋ ์ ๋นต์ฌ'๋ฅผ ๋ชจํ ๋ก ๋ธ๋๋ฉํ ํ ์๋น์ค
'์ต๊ด๋นต'์ ์ข์ ์ต๊ด์ ๋ง๋ค๊ณ ์ถ์ ์ฌ์ฉ์๋ค์๊ฒ ๋์์ ์ฃผ๋ ๋ชจ๋ฐ์ผ ์ฑ ์๋น์ค์ ๋๋ค.
๋ค์ํ ๋นต์ ๋ง๋๋ '์ ๋นต์ฌ'์ฒ๋ผ ์ฌ๋ฌ๋ถ์ ๋ค์ํ ์ต๊ด์ ๊ตฌ์ ์ข์ ์ต๊ด์ ์์ฑํ ์ ์๋๋ก ๋์์ค ๊ฒ๋๋ค.
์ต๊ด์ ๊ธฐ๋กํ๊ณ ํ ๋์ ์์ ๋ณผ ์ ์๋ ํต๊ณ์ ๋ญํน, ํธ์ ์๋ฆผ์ ํตํ ๋ฆฌ๋ง์ธ๋ ๊ธฐ๋ฅ์ ์ ๊ณต ๋ฐ์๋ณด์ธ์ !
- ์ถ๊ฐ ์์ ..!
Dense Ranking
๊ตฌํ์ ์ํ ๊ตฌ์กฐ
-
๊ฒฝํ์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์ฌ์ฉ์ ID ๋ฆฌ์คํธ (Sorted Sets)
[Key] "user:score" [Value] [ { "value" : "user:1", "score" : "50" }, ... ]
-
์ฌ์ฉ์ ์ ๋ณด (Hash)
[Key] "user:{id}" Ex) "user:1", "user:2" [Value] { "name" : "์ฌ์ฉ์ ์ด๋ฆ", "achievement" : "50", // ๋ฌ์ฑ๋ "exp" : "10" // ๊ฒฝํ์น }
- FCM ๋ฉ์์ง ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ๊ตฌ์กฐ
-
ํน์ ์๊ฐ์ ์๋ฆผ์ ๋ณด๋ด์ผํ๋ ์ต๊ด ID ๋ฆฌ์คํธ (Set)
[Key] "MMDDHHmm" Date ํํ์ String Ex) "10281020" [Value] [ "10", // ์ต๊ด์ ID "80" ... ]
-
Habit ์ ๋ณด (Hash)
[Key] "habit:{id}" Ex) "habit:1", "habit:2" [Value] { "userId" : "1", "title" : "๋งค์ผ ํ๋ฃจ 1๋ฒ ๋ฌผ ๋ง์๊ธฐ", "dayOfWeek" : "0100010" // ์ต๊ด์ ํด์ผํ ์์ผ }
-
User ์ ๋ณด (Hash)
[Key] "user:{id}" Ex) "user:1", "user:2" [Value] { "isAlarmOn" : "0", // 0 or 1 (์๋ ํจ ์ฌ๋ถ) "FCMToken" : "token", // FCM์์ ๋ฐ๊ธ๋ฐ์ ํ ํฐ }
-
RunTime :
Node.js
-
Web server :
Nginx + SSL ์ธ์ฆ
-
Framework :
Express
-
Language :
Typescript
-
Dependencies Management :
NPM
-
Security :
Let's Encrypt + JWT
-
Database :
MySQL
-
ORM :
Prisma2
-
Testing :
Jest + supertest
-
Interactive Build :
Docker
-
Cloud Server :
AWS EC2
-
CI / CD :
Github Action
-
OAuth :
Google
,Apple
-
Cloud Messaging :
FCM (Firebase Cloud Messaging)
์๋น์ค ์ฌ์ฉ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด issue
๋ฅผ ๋ฌ์์ฃผ์ธ์ ๐๐ปโโ๏ธ