diff --git a/README.md b/README.md index f13b4c7..8cde1db 100644 --- a/README.md +++ b/README.md @@ -1 +1,192 @@ -# snap-it \ No newline at end of file +# Snap It ๐Ÿ“ธ๐ŸŽฎ + +> **์œ„์น˜ ๊ธฐ๋ฐ˜ ํ˜‘๋™ ์˜์–ด ํ•™์Šต ๊ฒŒ์ž„** +> GPS์™€ AR ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•œ ํ˜์‹ ์ ์ธ ์•ผ์™ธ ๊ต์œก ์ฝ˜ํ…์ธ  + +[![Unity](https://img.shields.io/badge/Unity-6000.0.41f-black?style=flat-square&logo=unity)](https://unity.com/) +[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.4.4-brightgreen?style=flat-square&logo=spring)](https://spring.io/projects/spring-boot) +[![Kubernetes](https://img.shields.io/badge/Kubernetes-Latest-blue?style=flat-square&logo=kubernetes)](https://kubernetes.io/) +[![FastAPI](https://img.shields.io/badge/FastAPI-Latest-009688?style=flat-square&logo=fastapi)](https://fastapi.tiangolo.com/) + +#### ๐Ÿ”— ๊ด€๋ จ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ + +- **๋ฉ”์ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ**: [snap-it](https://github.com/ChabinHwang/snap-it) +- **K8s Manifest**: [snap-it-k8s-manifest](https://github.com/ChabinHwang/snap-it-k8s-manifest) +- **Word2Vec Server**: [snap-it-word2vec](https://github.com/ChabinHwang/snap-it-word2vec) +- **Word2Vec Manifest**: [snap-it-word2vec-manifest](https://github.com/ChabinHwang/snap-it-word2vec-manifest) + + +## ๐ŸŽฏ ํ”„๋กœ์ ํŠธ ๊ฐœ์š” + +**Snap It**์€ ์ „ํ†ต์ ์ธ ์‹ค๋‚ด ๊ฒŒ์ž„์˜ ํ•œ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜ GPS ๊ธฐ๋ฐ˜ ์œ„์น˜ ์ •๋ณด๋ฅผ ํ™œ์šฉํ•œ ์•ผ์™ธ ํ˜‘๋™ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ํ”Œ๋ ˆ์ด์–ด๋“ค์ด ๋‹ค์–‘ํ•œ ์žฅ์†Œ์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ˜‘๋ ฅํ•˜๊ณ  ๊ฒฝ์Ÿํ•  ์ˆ˜ ์žˆ๋Š” ๊ต์œก์šฉ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. + +### ๐ŸŽฎ ํ•ต์‹ฌ ๊ฒŒ์ž„ํ”Œ๋ ˆ์ด + +- **AI ์ฃผ์ œ ์„ ์ •**: AI๊ฐ€ ์„ ์ •ํ•œ ์ฃผ์ œ์— ๋”ฐ๋ผ ๊ฐ ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ๊ฐœ๋ณ„ ์‚ฌ๋ฌผ ํ• ๋‹น +- **์‹œ๊ฐ„ ์ œํ•œ ์ดฌ์˜**: 15์ดˆ ์ œํ•œ์‹œ๊ฐ„ ๋‚ด ํ• ๋‹น๋œ ์‚ฌ๋ฌผ ์ดฌ์˜ ๋ฐ ์—…๋กœ๋“œ +- **AI ๋ถ„์„**: AI ์ด๋ฏธ์ง€ ๋ถ„์„์„ ํ†ตํ•œ ์ฃผ์ œ ์œ ์‚ฌ๋„ ํŒ๋‹จ ๋ฐ ์ ์ˆ˜ ์‚ฐ์ • +- **์˜์–ด ํ•™์Šต**: ์ดฌ์˜๋œ ์‚ฌ๋ฌผ์˜ ์˜์–ด ๋‹จ์–ด ํ‘œ์‹œ๋กœ ์ž์—ฐ์Šค๋Ÿฌ์šด ์˜์–ด ํ•™์Šต ํšจ๊ณผ +- **2๋ผ์šด๋“œ ์ง„ํ–‰**: ์ด 2๋ผ์šด๋“œ ์ง„ํ–‰ ํ›„ ์ตœ๊ณ  ์ ์ˆ˜์ž ์Šน๋ฆฌ + +### ๐ŸŽฅ ์‹œ์—ฐ ์˜์ƒ, ์‚ฌ์ง„ + +- **YouTube**: [https://youtu.be/BrFO9eYzvFE](https://youtu.be/BrFO9eYzvFE) +- **Google Drive**: [์‹œ์—ฐ ๋™์˜์ƒ](https://drive.google.com/file/d/1dnsZ7-Lw4wIsdbSmGqbYqKNzrhS9QO56/view?usp=share_link) + + + +Image + + +## ๐Ÿ‘ฅ ํŒ€์› + + + + + + +
+ + chabin
+ ํ™ฉ์ฐจ๋นˆ +

+ ๋ฐฑ์—”๋“œ/์ธํ”„๋ผ +
+ + yejin
+ ์ด์ˆ˜๋ฏผ +

+ ๋””์ž์ธ/ํด๋ผ์ด์–ธํŠธ +
+ + +## ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ + + + +Image + +## ์ธํ”„๋ผ ์•„ํ‚คํ…์ณ + + + + +### ํด๋ผ์ด์–ธํŠธ (Unity) +- **Unity**: 6000.0.41f +- **AR Foundation**: AR ํ™˜๊ฒฝ ๊ตฌ์ถ• +- **Native WebSocket**: ์‹ค์‹œ๊ฐ„ ํ†ต์‹  +- **Google Cloud Vision API**: ๊ฐ์ฒด ์ธ์‹ +- **STOMP Protocol**: WebSocket ๋ฉ”์‹œ์ง• + +### ์„œ๋ฒ„ (Spring Boot) +- **Spring Boot**: 3.4.4 +- **Java**: 21 +- **WebSocket (STOMP)**: ์‹ค์‹œ๊ฐ„ ๊ฒŒ์ž„ ์ง„ํ–‰ +- **OAuth2 + JWT**: ์†Œ์…œ ๋กœ๊ทธ์ธ ์ธ์ฆ +- **ConcurrentHashMap**: ๋™์‹œ์„ฑ ์ œ์–ด + +### AI +- **Google Gemini API**: ์ฃผ์ œ/๋ฌผ๊ฑด ๋ชฉ๋ก ์ƒ์„ฑ +- **Google Cloud Vision API**: ์ด๋ฏธ์ง€ ๊ฐ์ฒด ์ธ์‹ +- **Word2Vec (FastAPI)**: ๋‹จ์–ด ์œ ์‚ฌ๋„ ๋ถ„์„ + +### ์ธํ”„๋ผ & DevOps +- **Kubernetes**: ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ +- **ArgoCD**: GitOps ๊ธฐ๋ฐ˜ CD +- **GitHub Actions**: CI ํŒŒ์ดํ”„๋ผ์ธ +- **Prometheus + Grafana**: ๋ชจ๋‹ˆํ„ฐ๋ง +- **Docker**: ์ปจํ…Œ์ด๋„ˆํ™” + +## ๐Ÿš€ ์‹œ์ž‘ํ•˜๊ธฐ + +### ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ + +#### Android +- **OS**: Android 9 (Pie, API 28) ์ด์ƒ +- **RAM**: 5GB ์ด์ƒ ๊ถŒ์žฅ +- **CPU**: Snapdragon 845 ์ด์ƒ + +#### iOS +- **OS**: iOS 13.0 ์ด์ƒ +- **RAM**: 4GB ์ด์ƒ ๊ถŒ์žฅ +- **CPU**: Apple A9 ์นฉ ์ด์ƒ + +### ์„ค์น˜ ๋ฐ ์‹คํ–‰ + +#### 1. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํด๋ก  +```bash +git clone https://github.com/ChabinHwang/snap-it.git +cd snap-it +``` + +#### 2. ์„œ๋ฒ„ ์‹คํ–‰ (๋กœ์ปฌ ๊ฐœ๋ฐœ) +```bash +cd snapit-server +./gradlew bootRun +``` + +#### 3. ํด๋ผ์ด์–ธํŠธ ๋นŒ๋“œ +Unity Editor์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์—ด๊ณ : +1. Android/iOS ํ”Œ๋žซํผ ์„ค์ • +2. AR Foundation ๋ฐ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ +3. ๋นŒ๋“œ ๋ฐ ๋””๋ฐ”์ด์Šค์— ์„ค์น˜ + +## ๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ + +### ๐Ÿ” ์ธ์ฆ ์‹œ์Šคํ…œ +- **์†Œ์…œ ๋กœ๊ทธ์ธ**: Google, Kakao OAuth2 ์ง€์› +- **JWT ํ† ํฐ**: Access Token + Refresh Token ๋ฐฉ์‹ +- **WebSocket ์ธ์ฆ**: JWT ๊ธฐ๋ฐ˜ ํ•ธ๋“œ์…ฐ์ดํฌ + +### ๐ŸŽฎ ๊ฒŒ์ž„ ์‹œ์Šคํ…œ +- **์‹ค์‹œ๊ฐ„ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด**: STOMP ํ”„๋กœํ† ์ฝœ ๊ธฐ๋ฐ˜ +- **๋ฐฉ ์‹œ์Šคํ…œ**: ๋ฐฉ ์ƒ์„ฑ, ์ž…์žฅ, ํ‡ด์žฅ ๊ด€๋ฆฌ +- **๊ฒŒ์ž„ ๋ชจ๋“œ**: ๊ฐœ์ธ์ „(PERSONAL) / ํ˜‘๋ ฅ์ „(COOPERATE) +- **์ ์ˆ˜ ์‹œ์Šคํ…œ**: AI ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜ ์ ์ˆ˜ ์‚ฐ์ • + +### ๐Ÿ“ฑ AR ๊ธฐ๋Šฅ +- **๊ฐ์ฒด ์ธ์‹**: Google Vision API ์—ฐ๋™ +- **๊ฑฐ๋ฆฌ ์ธก์ •**: ARMesh๋ฅผ ํ†ตํ•œ ๊ณต๊ฐ„ ์ธ์‹ +- **๋ฌผ์ฒด ์„ ํƒ**: AR ํ™˜๊ฒฝ์—์„œ์˜ ์ง๊ด€์  ์ƒํ˜ธ์ž‘์šฉ + +### ๐Ÿค– AI ๊ธฐ๋Šฅ +- **์ฃผ์ œ ์ƒ์„ฑ**: Gemini API๋ฅผ ํ†ตํ•œ ๊ฒŒ์ž„ ์ฃผ์ œ ์ž๋™ ์ƒ์„ฑ +- **์œ ์‚ฌ๋„ ๋ถ„์„**: Word2Vec ๋ชจ๋ธ ๊ธฐ๋ฐ˜ ๋‹จ์–ด ์œ ์‚ฌ๋„ ์ธก์ • +- **์ด๋ฏธ์ง€ ๋ถ„์„**: ์ดฌ์˜๋œ ์ด๋ฏธ์ง€์˜ ๊ฐ์ฒด ์ธ์‹ ๋ฐ ๋ถ„์„ + +## ๐Ÿ“Š ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ + +### Word2Vec API ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ +- **ํ…Œ์ŠคํŠธ ์กฐ๊ฑด**: 100,000 ์š”์ฒญ, 200 ๋™์‹œ ์—ฐ๊ฒฐ +- **๋‹จ์ผ Pod**: ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„ ~200ms +- **2๊ฐœ Pod**: ํ–ฅ์ƒ๋œ ์ฒ˜๋ฆฌ๋Ÿ‰๊ณผ ์•ˆ์ •์„ฑ + +### Google Vision API ์‘๋‹ต์‹œ๊ฐ„ +- **Object Detection**: ํ‰๊ท  0.2์ดˆ, ์ตœ๋Œ€ 0.3์ดˆ +- **Gemini API**: ํ‰๊ท  0.7์ดˆ, ์ตœ๋Œ€ 0.9์ดˆ + +## ๐Ÿณ Docker & Kubernetes + +### Docker ๋นŒ๋“œ +```bash +# ๊ฒŒ์ž„ ์„œ๋ฒ„ +cd snapit-server +docker build -t snapit-server . + +# Word2Vec ์„œ๋ฒ„ +cd word2vec-server +docker build -t word2vec-server . +``` + +### Kubernetes ๋ฐฐํฌ +```bash +# ArgoCD๋ฅผ ํ†ตํ•œ ์ž๋™ ๋ฐฐํฌ +kubectl apply -f manifests/ +``` + +## ๐Ÿ“ˆ ๋ชจ๋‹ˆํ„ฐ๋ง + +- **Prometheus**: ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ +- **Grafana**: ๋Œ€์‹œ๋ณด๋“œ ์‹œ๊ฐํ™” +- **์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง**: ์‹œ์Šคํ…œ ์ƒํƒœ, ์š”์ฒญ ์ˆ˜, ์‘๋‹ต ์‹œ๊ฐ„ +