Skip to content

Latest commit

ย 

History

History
755 lines (657 loc) ยท 30.7 KB

README.md

File metadata and controls

755 lines (657 loc) ยท 30.7 KB

AI๋ฅผ ํ™œ์šฉํ•œ ๋…์ดˆ ํŒ๋ณ„ ์„œ๋น„์Šค POISON


Medium.com

https://medium.com/@nowrobin3/poison-973f84627409


Production

https://poisonsvb.com (ํ˜„์žฌ ๋ฐฐํฌ ์ค‘๋‹จ)

์‹œ์—ฐ ์˜์ƒ (์œ ํŠœ๋ธŒ)

Video Label


Features

๋ฐ˜์‘ํ˜• UI

Desktop, Tablet, Mobile ๋“ฑ ํ™”๋ฉด์‚ฌ์ด์ฆˆ์— ๋งž๋Š” UI ์ œ๊ณต

์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ฐ ํŒ๋ณ„

Drag&Drop ์„ ํ†ตํ•œ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ฐ ๋…์ดˆ ํŒ๋ณ„ ๊ฒฐ๊ณผ ์ œ๊ณต

๋„๊ฐ

ํ•™์Šต๋œ ์‹๋ฌผ๋“ค์˜ ๋ฆฌ์ŠคํŠธ ๋ฐ ์‹๋ฌผ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€
๋„๊ฐ๋ฆฌ์ŠคํŠธ ์ „์ฒด๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฌดํ•œ์Šคํฌ๋กค์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๋งŒํผ์˜ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ

๊ฒ€์ƒ‰

๋„๊ฐ์— ๋“ฑ๋ก๋œ ์‹๋ฌผ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€
MongoDB Atlas Search๋ฅผ ํ†ตํ•ด ์œ ์‚ฌ์–ด ๊ฒ€์ƒ‰, ๋‹ค์ค‘๊ฒ€์ƒ‰ ์ง€์›

๋žญํ‚น

ํŒ๋ณ„ ๊ฒฐ๊ณผ๋กœ ๋งŽ์ด ์กฐํšŒ๋œ ์ˆœ์œผ๋กœ ๋žญํ‚น์„ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ
์Šค์ผ€์ฅด๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 1์‹œ๊ฐ„ ๋‹จ์œ„์˜ ๋žญํ‚น ์ œ๊ณต ๊ฐ€๋Šฅ
์ฐจํŠธ๋ฅผ ํ†ตํ•ด ๊ฒฐ๊ณผ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œํ˜„

System Arcitechture


Tech Stack

Area Tech Stack
Frontend
Backend
AI
DevOps
Monitoring node-exporter Elastic Stack
etc Slack Notion Figma Postman GitKraken Visual Studio Code

Frontend

File Directory

๐Ÿ“ฆfrontend
 โ”ฃ ๐Ÿ“‚.github
 โ”ƒ โ”ฃ ๐Ÿ“‚ISSUE_TEMPLATE
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œerror-report.md
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfeature-request.md
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œrefactoring-report.md
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œsetting-report.md
 โ”ƒ โ”— ๐Ÿ“œPULL_REQUEST_TEMPLATE.md
 โ”ฃ ๐Ÿ“‚.storybook
 โ”ƒ โ”ฃ ๐Ÿ“œmain.cjs
 โ”ƒ โ”ฃ ๐Ÿ“œpreview-head.html
 โ”ƒ โ”— ๐Ÿ“œpreview.cjs
 โ”ฃ ๐Ÿ“‚public
 โ”ƒ โ”ฃ ๐Ÿ“œfavicon.ico
 โ”ƒ โ”— ๐Ÿ“œmockServiceWorker.js
 โ”ฃ ๐Ÿ“‚src
 โ”ƒ โ”ฃ ๐Ÿ“‚assets
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œFirstMedal.png
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œSecondMedal.png
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œThirdMedal.png
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcrown.svg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfirstPlace.svg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon_x.png
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œimage1.svg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlogo.svg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlogo2.png
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œmain_background.png
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œoutercrown.svg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œreact.svg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsearch.svg
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œupload.svg
 โ”ƒ โ”ฃ ๐Ÿ“‚components
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚BarChart
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚DetailModal
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚DonutChart
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚EncyclopediaBtn
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚FlowerCard
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚Loading
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚Loading2
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚LogoTitle
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚NavigationBar
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚PieChart
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankList
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankModal
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankTop
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankingBtn
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”— ๐Ÿ“‚ResultCard
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ฃ ๐Ÿ“‚hooks
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œuseInput.ts
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œuseSearchFlower.ts
 โ”ƒ โ”ฃ ๐Ÿ“‚mocks
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhandlers.ts
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œworker.ts
 โ”ƒ โ”ฃ ๐Ÿ“‚pages
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚Encyclopedia
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚Main
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚Result
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œ_layout.tsx
 โ”ƒ โ”ฃ ๐Ÿ“‚stories
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚DetailModal
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œDetailModal.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚DonutChart
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œDountChart.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚EncyclopediaBtn
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œEncyclopediaBtn.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚FlowerCard
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œFlowerCard.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚Loading
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLoading.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚Loading2
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLoading2.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚LogoTitle
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLogotitle.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚NavigationBar
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œNavigationBar.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankList
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œRankList.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankModal
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œRankModal.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankTop
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œRankTop.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚RankingBtn
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œRankingBtn.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚ResultCard
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œResultCard.stories.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.tsx
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œstyles.module.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚assets
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œFirstMedal.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œSecondMedal.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œThirdMedal.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcode-brackets.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcolors.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcomments.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcrown.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œdirection.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfirstPlace.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œflow.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon_x.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œimage1.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlogo copy.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlogo.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlogo2.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œmain_background.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œoutercrown.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œplugin.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œreact.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œrepo.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsearch.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œstackalt.svg
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œupload.svg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚hooks
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œuseInput.ts
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œuseSearchFlower.ts
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œButton.stories.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œButton.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œHeader.stories.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œHeader.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œIntroduction.stories.mdx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œPage.stories.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œPage.tsx
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbutton.css
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œheader.css
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œmedia.scss
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œpage.css
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œqueryClient.ts
 โ”ƒ โ”ฃ ๐Ÿ“‚types
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œdetail.ts
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œency.ts
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œrank.ts
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œresult.ts
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œtest.ts
 โ”ƒ โ”ฃ ๐Ÿ“œApp.tsx
 โ”ƒ โ”ฃ ๐Ÿ“œRoutes.tsx
 โ”ƒ โ”ฃ ๐Ÿ“œmain.tsx
 โ”ƒ โ”ฃ ๐Ÿ“œmedia.scss
 โ”ƒ โ”ฃ ๐Ÿ“œqueryClient.ts
 โ”ƒ โ”ฃ ๐Ÿ“œreset.scss
 โ”ƒ โ”— ๐Ÿ“œvite-env.d.ts
 โ”ฃ ๐Ÿ“œ.dockerignore
 โ”ฃ ๐Ÿ“œ.eslintrc.js
 โ”ฃ ๐Ÿ“œ.git
 โ”ฃ ๐Ÿ“œ.gitignore
 โ”ฃ ๐Ÿ“œ.prettierrc
 โ”ฃ ๐Ÿ“œDockerfile.dev
 โ”ฃ ๐Ÿ“œDockerfile.prod
 โ”ฃ ๐Ÿ“œLICENSE
 โ”ฃ ๐Ÿ“œREADME.md
 โ”ฃ ๐Ÿ“œindex.html
 โ”ฃ ๐Ÿ“œpackage.json
 โ”ฃ ๐Ÿ“œpostcss.config.cjs
 โ”ฃ ๐Ÿ“œtailwind.config.cjs
 โ”ฃ ๐Ÿ“œtsconfig.json
 โ”ฃ ๐Ÿ“œtsconfig.node.json
 โ”ฃ ๐Ÿ“œvite.config.ts
 โ”— ๐Ÿ“œyarn.lock

React Vite TypeScript


ESModule ๊ธฐ๋ฐ˜์˜ Vite๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋”์šฑ ๋น ๋ฅด๊ฒŒ ๊ตฌ๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.
SPA์ธ React๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ UX๋ฅผ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
Code splitting์„ ์‚ฌ์šฉํ•ด ๋ผ์šฐํŠธ๋ณ„๋กœ ํŒŒ์ผ์„ ๋‚˜๋ˆ„์–ด ํŠธ๋ž˜ํ”ฝ๊ณผ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ •์  ํƒ€์ž… ์–ธ์–ด์ธ Typescript์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์—๋Ÿฌ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

React Query & MSW


React query๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ ์บ์‹ฑ์„ ํ™œ์šฉํ•˜์—ฌ, API ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ์†Œ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.
๋„คํŠธ์›Œํฌ ๋‹จ์—์„œ API๋ฅผ Mocking ํ•  ์ˆ˜ ์žˆ๋Š” MSW๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๊ฐœ๋ฐœ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ง€์—ฐ์‹œ๊ฐ„ ์—†์ด ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜์—ฌ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

Storybook


Storybook์„ ์‚ฌ์šฉํ•ด์„œ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ธํ„ฐ๋ ‰์…˜ ๋ฐ UI๋ฅผ ํ…Œ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Monitoring

Sentry

Performance Monitoring Error Example

ํ”„๋ก ํŠธ์—”๋“œ ์—๋Ÿฌ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ํŠธ๋ž˜ํ‚น ํˆด์ธ ์„ผํŠธ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—๋Ÿฌ๋ฅผ ์ถ”์ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์—๋Ÿฌ์˜ ์ข…๋ฅ˜, ๋ฐœ์ƒ ์œ„์น˜ ๋“ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์›์ธ์„ ์ฐพ๋Š” ๋ฐ ๋“ค์ด๋Š” ์‹œ๊ฐ„์„ ๋œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—๋Ÿฌ ๋ฐœ์ƒ ์ฆ‰์‹œ ๋ฉ”์ผ ์•Œ๋ฆผ์„ ๋ฐ›์•„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Backend

File Directory

๐Ÿ“ฆbackend
 โ”ฃ ๐Ÿ“‚.github
 โ”ƒ โ”ฃ ๐Ÿ“‚ISSUE_TEMPLATE
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œerror-report.md
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfeature-request.md
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œrefactoring-report.md
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œsetting-report.md
 โ”ƒ โ”ฃ ๐Ÿ“œ.DS_Store
 โ”ƒ โ”— ๐Ÿ“œPULL_REQUEST_TEMPLATE.md
 โ”ฃ ๐Ÿ“‚config
 โ”ƒ โ”ฃ ๐Ÿ“œ.env
 โ”ƒ โ”ฃ ๐Ÿ“œ__init__.py
 โ”ƒ โ”ฃ ๐Ÿ“œasgi.py
 โ”ƒ โ”ฃ ๐Ÿ“œsettings.py
 โ”ƒ โ”ฃ ๐Ÿ“œurls.py
 โ”ƒ โ”— ๐Ÿ“œwsgi.py
 โ”ฃ ๐Ÿ“‚flower
 โ”ƒ โ”ฃ ๐Ÿ“‚migrations
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œ0001_initial.py
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œ__init__.py
 โ”ƒ โ”ฃ ๐Ÿ“œ__init__.py
 โ”ƒ โ”ฃ ๐Ÿ“œadmin.py
 โ”ƒ โ”ฃ ๐Ÿ“œapps.py
 โ”ƒ โ”ฃ ๐Ÿ“œcelery.py
 โ”ƒ โ”ฃ ๐Ÿ“œconnect.py
 โ”ƒ โ”ฃ ๐Ÿ“œmodels.py
 โ”ƒ โ”ฃ ๐Ÿ“œserializers.py
 โ”ƒ โ”ฃ ๐Ÿ“œtasks.py
 โ”ƒ โ”ฃ ๐Ÿ“œtests.py
 โ”ƒ โ”ฃ ๐Ÿ“œupdater.py
 โ”ƒ โ”ฃ ๐Ÿ“œurls.py
 โ”ƒ โ”— ๐Ÿ“œviews.py
 โ”ฃ ๐Ÿ“‚static
 โ”ƒ โ”ฃ ๐Ÿ“‚admin
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚vendor
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚select2
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE-SELECT2.md
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œselect2.css
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œselect2.min.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œautocomplete.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbase.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œchangelists.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œdashboard.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfonts.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œforms.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlogin.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œnav_sidebar.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œresponsive.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œresponsive_rtl.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œrtl.css
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œwidgets.css
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚fonts
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE.txt
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œREADME.txt
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œRoboto-Bold-webfont.woff
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œRoboto-Light-webfont.woff
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œRoboto-Regular-webfont.woff
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚img
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚gis
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œmove_vertex_off.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œmove_vertex_on.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œREADME.txt
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcalendar-icons.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-addlink.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-alert.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-calendar.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-changelink.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-clock.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-deletelink.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-no.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-unknown-alt.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-unknown.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-viewlink.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œicon-yes.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œinline-delete.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsearch.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œselector-icons.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsorting-icons.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œtooltag-add.svg
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œtooltag-arrowright.svg
 โ”ƒ โ”ƒ โ”— ๐Ÿ“‚js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚admin
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œDateTimeShortcuts.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œRelatedObjectLookups.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚vendor
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚jquery
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE.txt
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œjquery.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œjquery.min.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚select2
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚i18n
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œaf.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œar.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œaz.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbg.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbn.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbs.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œca.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcs.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œda.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œde.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œdsb.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œel.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œen.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œes.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œet.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œeu.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfa.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfi.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfr.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œgl.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhe.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhi.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhr.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhsb.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhu.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhy.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œid.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œis.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œit.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œja.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œka.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œkm.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œko.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlt.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œlv.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œmk.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œms.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œnb.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œne.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œnl.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œpl.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œps.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œpt-BR.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œpt.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œro.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œru.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsk.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsl.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsq.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsr-Cyrl.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsr.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œsv.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œth.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œtk.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œtr.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œuk.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œvi.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œzh-CN.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œzh-TW.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE.md
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œselect2.full.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œselect2.full.min.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚xregexp
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE.txt
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œxregexp.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œxregexp.min.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œSelectBox.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œSelectFilter2.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œactions.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œautocomplete.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcalendar.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcancel.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œchange_form.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcollapse.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcore.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œinlines.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œjquery.init.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œnav_sidebar.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œpopup_response.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œprepopulate.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œprepopulate_init.js
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œurlify.js
 โ”ƒ โ”ฃ ๐Ÿ“‚drf-yasg
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚redoc
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œredoc-logo.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œredoc.min.js
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œredoc.standalone.js.map
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚redoc-old
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œredoc.min.js
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œredoc.min.js.map
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚swagger-ui-dist
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œLICENSE
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œNOTICE
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œabsolute-path.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfavicon-32x32.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œindex.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œoauth2-redirect.html
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-bundle.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-bundle.js.map
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-es-bundle-core.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-es-bundle-core.js.map
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-es-bundle.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-es-bundle.js.map
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-standalone-preset.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui-standalone-preset.js.map
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œswagger-ui.css.map
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œswagger-ui.js.map
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œREADME
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œimmutable.js
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œimmutable.min.js
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œinsQ.js
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œinsQ.min.js
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œredoc-init.js
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œstyle.css
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œswagger-ui-init.js
 โ”ƒ โ”— ๐Ÿ“‚rest_framework
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbootstrap-theme.min.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbootstrap-theme.min.css.map
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbootstrap-tweaks.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbootstrap.min.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbootstrap.min.css.map
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œdefault.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfont-awesome-4.0.3.css
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œprettify.css
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚docs
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚css
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbase.css
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhighlight.css
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œjquery.json-view.min.css
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚img
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfavicon.ico
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œgrid.png
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“‚js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œapi.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œhighlight.pack.js
 โ”ƒ โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œjquery.json-view.min.js
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚fonts
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfontawesome-webfont.eot
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfontawesome-webfont.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfontawesome-webfont.ttf
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfontawesome-webfont.woff
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œglyphicons-halflings-regular.eot
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œglyphicons-halflings-regular.svg
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œglyphicons-halflings-regular.ttf
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œglyphicons-halflings-regular.woff
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œglyphicons-halflings-regular.woff2
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“‚img
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œglyphicons-halflings-white.png
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œglyphicons-halflings.png
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œgrid.png
 โ”ƒ โ”ƒ โ”— ๐Ÿ“‚js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œajax-form.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œbootstrap.min.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcoreapi-0.1.1.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œcsrf.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œdefault.js
 โ”ƒ โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œjquery-3.5.1.min.js
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œprettify-min.js
 โ”ฃ ๐Ÿ“œ.git
 โ”ฃ ๐Ÿ“œ.gitignore
 โ”ฃ ๐Ÿ“œDockerfile
 โ”ฃ ๐Ÿ“œREADME.md
 โ”ฃ ๐Ÿ“œmanage.py
 โ”— ๐Ÿ“œrequirements.txt

API

swagger

image

Swagger๋ฅผ ํ†ตํ•ด API ๋ช…์„ธ์„œ๋ฅผ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Celery

image

Celery๋ฅผ ํ™œ์šฉํ•ด ๋น„๊ต์  ์˜ค๋ž˜๊ฑธ๋ฆฌ๋Š” ๋…์ดˆ ํŒ๋ณ„ ์„œ๋น„์Šค๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Polling ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด celery๊ฐ€ ์š”์ฒญ์ฒ˜๋ฆฌ์ค‘์—๋„ ๋‹ค๋ฅธ ์š”์ฒญ๋“ค์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

DataBase

image

MongoDB Atlas Search๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฝƒ ์ด๋ฆ„ ์œ ์‚ฌ์–ด ๊ฒ€์ƒ‰ ๋ฐ ๋‹ค์ค‘๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฒ€์ƒ‰์—”์ง„์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.๋˜ํ•œ Scheduler ๋ฅผ ํ™œ์šฉํ•˜์—ฌ 1์‹œ๊ฐ„ ๋‹จ์œ„๋กœ Database์˜ ๊ฐ’์„ update ํ•ด์ฃผ๋Š” Ranking System์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Monitoring

Grafana + Prometheus, ELK

Django Node exporter
cAdvisor ELK

Django์—์„œ Prometheus๋ฅผ ํ†ตํ•ด request,response์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘์„ ํ•œ ํ›„ Grafana๋ฅผ ํ†ตํ•ด ์‹œ๊ฐํ™” ํ•˜์˜€์Šต๋‹ˆ๋‹ค. Slack๊ณผ Grafana๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์„ค์ •ํ•œ CPU ์‚ฌ์šฉ๋Ÿ‰ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๊ฒฝ์šฐ Slack์— ๊ฒฝ๊ณ  ์•Œ๋ฆผ์ด ์˜ค๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. CAdvisor๋ฅผ ํ™œ์šฉํ•ด ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ cpu, memory์‚ฌ์šฉ๋Ÿ‰๋“ฑ์„ ์•Œ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€๊ณ , ์ปจํ…Œ์ด๋„ˆ๋ณ„ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์•Œ์ˆ˜์žˆ๊ฒŒํ•˜์˜€์Šต๋‹ˆ๋‹ค. node exporter๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„์˜ ๋ฉ”๋ชจ๋ฆฌ, cpu ์‚ฌ์šฉ๋Ÿ‰, network traffic ๋“ฑ์„ ์•Œ์ˆ˜์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

ELK ์Šคํƒ์„ ํ™œ์šฉํ•˜์—ฌ nginx log๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ์‹œ๊ฐ„๋Œ€, ์‚ฌ์ดํŠธ๋ณ„ ์‘๋‹ต์ฝ”๋“œ, ์‘๋‹ต์ฝ”๋“œ ๋น„์œจ๋“ฑ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

AI

File Directory

๐Ÿ“ฆAI
 โ”ฃ ๐Ÿ“‚.github
 โ”ƒ โ”ฃ ๐Ÿ“‚ISSUE_TEMPLATE
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œerror-report.md
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œfeature-request.md
 โ”ƒ โ”ƒ โ”ฃ ๐Ÿ“œrefactoring-report.md
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œsetting-report.md
 โ”ƒ โ”— ๐Ÿ“œPULL_REQUEST_TEMPLATE.md
 โ”ฃ ๐Ÿ“œ.git
 โ”ฃ ๐Ÿ“œ.gitignore
 โ”ฃ ๐Ÿ“œDockerfile
 โ”ฃ ๐Ÿ“œREADME.md
 โ”ฃ ๐Ÿ“œapp.py
 โ”ฃ ๐Ÿ“œlb6.pickle
 โ”ฃ ๐Ÿ“œp6flower.model
 โ”— ๐Ÿ“œrequirements.txt

Model

image

์นด์นด์˜ค ์˜คํ”ˆ api์ธ crawling๊ณผ Kaggle์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์…‹์„ ํ™•๋ณดํ•˜์˜€๊ณ  MobileNet V2 ๋ชจ๋ธ์„ ํ•™์Šต ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

image

ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ํ•™์Šต๋œ ๋ชจ๋ธ์˜ ํ‰๊ฐ€ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์•ฝ 90%์˜ ์ •ํ™•๋„์™€ ๊ฝค ๋‚ฎ์€ ์†์‹ค๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋ธ์ด over fitting ๋˜์ง€ ์•Š์€ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Devops

HTTPS

image

SSL์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„ Https๋ฅผ ์ ์šฉํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณดํ˜ธํ•˜๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Github Actions

Github Actions๋ฅผ ํ†ตํ•ด CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์„œ๋ฒ„์— ์›ํ• ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


Installation

์„œ๋ฒ„ ์‹œ์ž‘ํ•˜๊ธฐ

Backend .env file

  • config/.env
DJANGO_SECRET_KEY=
DJANGO_PASSWORD=
$ git clone https://github.com/SV-Team-B/docker.git
$ git submodule update --recursive --remote --init
$ cd frontend
$ yarn
$ yarn build
$ cd ..
$ docker-compose up --build -d

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘ํ•˜๊ธฐ

$ git clone https://github.com/SV-Team-B/docker.git
$ git submodule update --recursive --remote --init
$ docker-compose -f docker-compose-dev.yml up -d

Our Team

Name ์ด์ƒ๋ฏผ ํ•œ์ •์šฑ ๊ฐ•์„๊ทœ
Profile
role Team Leader
Frontend, DevOps
Frontend,
DevOps
Frontend ,
DevOps
GitHub @sangminlee98 @nowrobin @AlgeMoya
Name ๊ฐ•๊ธฐํ™˜ ์ด์ค€์šฐ ๋ฐ•์˜์‹ ์ •๋™ํ›ˆ
Profile
role Bakcend ,
DevOps,
AI
Backend,
DevOps
Backend,
DevOps
Backend,
DevOps
GitHub @GiHwan2 @JunRain2 @0sik @jjeongdong