From 9f1513d05526f95e45aa0292ed1e3b571a0713a2 Mon Sep 17 00:00:00 2001 From: bicco2 <77577434+bicco2@users.noreply.github.com> Date: Wed, 28 Sep 2022 04:00:45 +0900 Subject: [PATCH] Create README.md --- README.md | 273 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..9b361fa --- /dev/null +++ b/README.md @@ -0,0 +1,273 @@ +# **๐ŸŒณย What is ReBike?** + +--- + +> ์ƒํ™œ ์“ฐ๋ ˆ๊ธฐ ์ข…๋ฅ˜ AI ๋ถ„์„ ๋ฐ ๋ถ„๋ฆฌ์ˆ˜๊ฑฐ ์ƒํ™œํ™”๋ฅผ ์œ„ํ•œ ํ”Œ๋žซํผ +> + +## ๐Ÿชตย **System Architecture** + + + +## ๐ŸŒตย **Tech Stack** +|Dev-Ops| | +|----------|:-------------:| +|__Frontend__| | +|__Backend__| | +|__DB__| | +|__AI__| | +|__Monitoring__| | +|__Others__| | + + +## ๐ŸŒธย **Core Screens** + + + +### **Redux** + +``` +acitions +โŽฟ DecodeActions.tsx + dispatch๊ฐ€ ์–ด๋–ค type์— ๋”ฐ๋ผ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์ค„์ง€ ์ •ํ•œ๋‹ค. state๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝํ• ์ง€ ์ •ํ•ด์ฃผ๋Š” ํŒŒ์ผ + ์ธ์ž๋กœ token๊ฐ’์„ ๋ฐ›์•„์„œ ๊ทธ๊ฑธ ๋””์ฝ”๋”ฉ ํ•ด์ค€๋‹ค . + ๊ทธ๋ฆฌ๊ณ  payload์— [success, action[success, payload]] ๋ฅผ ์„ค์ • + +โŽฟ ImgIDReducer.tsx + dispatch๋กœ ์‹คํ–‰ํ•  ์•ก์…˜ ๊ฐ’ 1๊ฐœ (SAVE_ID) ์ด๊ฑธ๋กœ id ๊ฐ’์„ ๋„˜๊ฒจ์ค€๋‹ค. + +reducer +โŽฟ DecodeReducer.tsx + state ์ดˆ๊ธฐ๊ฐ’ ์„ค์ • ๋ฐ dispatch๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ณณ action ์ด ๋“ค์–ด์™€์„œ action.payload๋กœ + id, alias ๋ฅผ ๊ฐ€์ ธ์™€ state๊ฐ’์„ dispatch์—์„œ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ๋ณ€๊ฒฝํ•ด์ค€๋‹ค .(์ „์—ญ๊ด€๋ฆฌ ์‹œ์ž‘) + ex. const userIdtoRedux = ReduxModule().decodeInfo?.id; + + +โŽฟ ImgIDReducer.tsx + SAVE_ID ํƒ€์ž…์œผ๋กœ dispatch ๊ฐ€ ์‹คํ–‰๋์œผ๋ฉด ๊ฑฐ๊ธฐ์„œ ์ €์žฅ๋œ payload๋ฅผ ๊ฐ€์ ธ์™€ ๊ทธ ๊ฐ’์„ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. + dispatch(save_ID(res.data.image_id)); ์‹คํ–‰ํ›„ itemID ๋ฆฌํ„ด + ex. const itemID = useSelector((state: RootReducerType) => state.ImgIDReducer); + +โŽฟ index.tsx + root ๋ฆฌ๋“€์„œ ๊ด€๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ DecodeReducer, ImgIDReducer๋ฅผ ์ด๊ด„ํ•œ๋‹ค. app.tsx์—์„œ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉ +``` + +> ReduxModule +ํ† ํฐ์ด ์žˆ์„ ๋•Œ๋งŒ dispatch๋ฅผ ํ†ตํ•ด id๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ๋”ฐ๋กœ ๋ชจ๋“ˆ๋กœ ๋บด๋†“์Œ +ํ† ํฐ์„ decoderedux๋ฅผ ํ†ตํ•ด ๋””์ฝ”๋”ฉ์‹œํ‚จ ํ›„ id๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. +> + +- ์ •๋ฆฌ + 1. redux๋ฅผ ํ†ตํ•ด token decode ํ›„ uuid ์ „์—ญ๊ด€๋ฆฌ + 2. ์ปดํฌ๋„ŒํŠธ ์žฌํ™œ์šฉ์„ ์œ„ํ•ด uploadํ•œ ์ด๋ฏธ์ง€ ๋ฐ ๋‚ด๊ฐ€ ๋ฒ„๋ฆฐ ์“ฐ๋ ˆ๊ธฐ ์ƒ์„ธํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ trash_id ์ „์—ญ๊ด€๋ฆฌ + + +### Mainpage + +- Search + + + +- UploadImage (polling) + + + +- PopularTrash + + + + +### Sign up/ Sign in + +- Sign Up + + + +- Sign In + + + +### MyPage + +- MyTrashcan โ†’ ์˜ฌ๋ ธ๋˜ ์‚ฌ์ง„๋“ค์„ ๋ชจ๋‘ ํ™•์ธ๊ฐ€๋Šฅ
+autosave - On : ์˜ฌ๋ฆฐ ์‚ฌ์ง„์„ ์ž๋™ ์ €์žฅ / Off : ์ €์žฅ๋˜์ง€ ์•Š์Œ
+ + +- Graph โ†’ ์˜ฌ๋ฆฐ ์‚ฌ์ง„์˜ ์ข…๋ฅ˜์™€ ์ˆ˜ ํŒŒ์•… ๊ฐ€๋Šฅ +Default : ์ง€๊ธˆ๊นŒ์ง€ ์˜ฌ๋ ธ๋˜ ์ด ์‚ฌ์ง„ ์ข…๋ฅ˜, ๊ฐœ์ˆ˜ +์‹œ์ž‘ ๋‚ ์งœ, ๋ ๋‚ ์งœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์›ํ•˜๋Š” ๋‚ ์งœ์— ์˜ฌ๋ฆฐ ์“ฐ๋ ˆ๊ธฐ ์ข…๋ฅ˜ ํ™•์ธ + + +- Challenge โ†’ ์‚ฌ์ง„์„ ์˜ฌ๋ ธ์„ ๋•Œ ํ™œ์„ฑํ™”/Change Info โ†’ ๋น„๋ฐ€๋ฒˆํ˜ธ, ๋‹‰๋„ค์ž„ ๋ณ€๊ฒฝ/Log Out + + + +## ๐ŸŒฟย ERD + + + +### **users api** + +- ***api/users/*** + - `GET` : ํšŒ์›๊ฐ€์ž… ์‹œ ์•„์ด๋””, ๋‹‰๋„ค์ž„ ์ค‘๋ณต ์ฒดํฌ ๊ฒฐ๊ณผ + - `POST` : ํšŒ์› ๊ฐ€์ž… ์ •๋ณด ์ €์žฅ + - `PATCH` : ํšŒ์› ์ •๋ณด ์ˆ˜์ • +- ***api/users/auth*** + - `POST` : access token, refresh token ๊ฐฑ์‹  +- ***api/users/autosave*** + - `GET` : ์—…๋กœ๋“œ ์‚ฌ์ง„ ์ž๋™์ €์žฅ ์—ฌ๋ถ€ + - `PATCH` : ์—…๋กœ๋“œ ์‚ฌ์ง„ ์ž๋™์ €์žฅ ์—ฌ๋ถ€ ๋ณ€๊ฒฝ + +### **trash api** + +- ***api/challenges*** + - `GET` : ๋ชจ๋“  ๋„์ „๊ณผ์ œ ์ •๋ณด +- ***api/statistics/ranking*** + - `GET` : ์ธ๊ธฐ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ผ์ฃผ์ผ๊ฐ„์˜ ์žฌํ™œ์šฉ ๋ฐ์ดํ„ฐ +- ***api/users/{user_id}/results/tasks*** + - `POST` : ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ์‚ฌ์ง„ ๋ถ„์„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ +- ***api/users/{user_id}/results/tasks/{task_id}*** + - `GET` : task_id๋กœ ๋ถ„์„ ์™„๋ฃŒ ์—ฌ๋ถ€ ํ™•์ธ, ํ”„๋ก ํŠธ์—์„œ polling +- ***api/users/{user_id}/challenges*** + - `GET` : ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ฌ์„ฑํ•œ ๋„์ „๊ณผ์ œ ์ •๋ณด +- ***api/users/{user_id}/pages/{page_number}*** + - `GET` : ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ์žฌํ™œ์šฉ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ, ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ด์šฉ +- ***api/trash/users/{user_id}/statistics*** + - `GET` : ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ๋ชจ๋“  ์žฌํ™œ์šฉ ๋ฐ์ดํ„ฐ์˜ ํ†ต๊ณ„ +- ***api/trash/users/{user_id}/statistics/period/{from_date}/{to_date}*** + - `GET` : ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ๋‚ ์— ๋”ฐ๋ฅธ ์žฌํ™œ์šฉ ๋ฐ์ดํ„ฐ ํ†ต๊ณ„ + +### S**earch api** + +- ***api/search/*** + - `POST` : value ๊ฐ’์— ๋งž๋Š” ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ + +### Elastic_search + + + +- used_library + - `elasticsearch` + - `django_elasticsearch_dsl` +- setup_es.py + - elastic_search default data setter + 1. make connection with `django_elasticsearch_dsl` + + + + 2. make default data by using `search_cofig.json` + + + + + + 3. bulk default data on elastic_search + + + +- elastic_search on Search api + - get search_value from query_param + + + + - make connection with elastic_search by using `django_elasticsearch_dsl` + + + + - get data which contained key that has correlation with search_value + - example + 1. send request + + + + 2. output + + + +- why_elastic_search? + - elastic_search has bunch of useful functions with searching data + - elastic_search is much lighter than other DB + + + + +### KIBANA + +- ์ผ๋ผ์Šคํ‹ฑ ์„œ์น˜์˜ ๊ฐ ๋ฐ์ดํ„ฐ๋“ค์„ ์‹œ๊ฐํ™”ํ•˜๋ฉฐ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋„์›€์„ ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ +- ์ถ”ํ›„. ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐ, ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•œ ๋ณด๋‹ค ์ข‹์€ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ, + + + +## ๐Ÿชดย **AI** + + + + + + + + + +- Result + + +## JWT + +- used_library + - `djangorestframework-jwt` +- JWT_Settings.py + - set JWTโ€™s default_settings + + + +- JWT on frontEND + - restore tokens by using redux + - if we need some user data, we donโ€™t need to make connection with backend + by opening JWT payload, we can get user data + +- JWT on backEND + - after we identify user by check login data, give authorization by using JWT + - by using refresh_token, we enhanced our security level + +## ๐Ÿ’ป Monitoring + + + +## Prometheus + +- exporter๊ฐ€ ๋งคํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๊ณ  HTTP ํ†ต์‹ ์„ ํ†ตํ•ด metric data๋ฅผ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ /metrics ๋ผ๋Š” HTTP ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Prometheus server๊ฐ€ ์ด exporter์˜ ์—”๋“œํฌ์ธํŠธ์— HTTP GET ์š”์ฒญ์„ ์ด์šฉํ•˜์—ฌ metric data๋ฅผ pull ํ•œ๋‹ค. +- ํ•ด๋‹น ๋…ธ๋“œ์˜ metric data + + + +## Grafana + +- Prometheus์˜ ์‹œ๊ฐํ™” ๋„๊ตฌ๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ์ด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๊ณ  ๋Œ€๊ฒŒ Grafana๋ผ๋Š” Data Visualization tool์„ ์ด์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์žˆ๋‹ค. + + + +CPU load / RAM usage / Memory swap + +## Cadvisor + +- ์ƒ์„ฑ๋œ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋“ฑ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•ด์ค€๋‹ค. + + + +## **How to Start** + + + +## **Project Tree** + + + +# โ„ข๏ธโฑ **Members of Team-E** +|์ด๋ฆ„|๊ฐœ๋ฐœ๋ถ„์•ผ|์†Œ๊ฐœํŽ˜์ด์ง€| +|---|---|---| +|๐Ÿฆฅ๊น€์šฉ๋ฏผ|Back-end,DevOps|https://github.com/Ryokuman +|๐Ÿ’›๊น€์œ ๋ฆผ|Back-end,DevOps,AI|https://github.com/Ellie010707 +|๐Ÿ†๋ฐ•์„ฑ๋นˆ|Back-end,DevOps|https://github.com/SeongbinPark +|๐Ÿงš๐Ÿปโ€โ™€๏ธ์ด์ฑ„ํ˜„|Front-end|https://github.com/chloe1129 +|๐ŸŽน์ด์ •์šฐ|Front-end|https://github.com/RayLee-Kor +|๐Ÿ‘ผ์ง„ํ˜ธ๋ณ‘|Front-end|https://github.com/bicco2