๋ฐฉ์ ๋ฐฉ์ก์ผ๋ก ๋ด โ ๊ณต์ธ์ค๊ฐ์ฌ์ ์ค์๊ฐ ํ์์ผ๋ก ๋งค๋ฌผ์ ํ์ธํ๊ณ ,
์ฒดํฌ๋ฆฌ์คํธ์ AI ํ์ ๋ฆฌํฌํธ๋ก ๊ธฐ๋ก์ ๋จ๊ธฐ๋ ๋น๋๋ฉด ๋ถ๋์ฐ ํฌ์ด ์๋น์ค
๋งค๋ฌผ ํ ๋ฒ ๋ณด๋ฌ ์๋ณต 4์๊ฐ, ์ฌ์ง๊ณผ ๋ค๋ฅธ ์ค๋ฌผ, ๋ญ ํ์ธํด์ผ ํ ์ง ๋ชจ๋ฅด๋ ์ฒซ ๊ณ์ฝ. ๋ฐฉ๋ฐฉ๋ด๋ ์ง ๋ณด๋ ๋ฐฉ์์ "์์ฝ โ ๋ผ์ด๋ธ ํฌ์ด โ ์ฒดํฌ๋ฆฌ์คํธ โ AI ๋ฆฌํฌํธ" ๋ค ๋จ๊ณ๋ก ๋ฐ๊ฟ๋๋ค.
- ํ๋ก์ ํธ ๊ฐ์
- ์ฃผ์ ๊ธฐ๋ฅ
- ์๋น์ค ํ๋ฉด
- ์์คํ ์ํคํ ์ฒ
- ํต์ฌ ๊ธฐ์
- ๊ธฐ์ ์คํ
- ๊ฐ๋ฐ ๊ฐ์ด๋
- ์คํ ๋ฐฉ๋ฒ
- ํ ์๊ฐ
์์ทจ๋ฐฉ ๊ตฌํ๊ธฐ์ 3๋ ํ์ธํฌ์ธํธ์์ ์์ํ์ต๋๋ค.
- ์๋ณต 4์๊ฐ ๋ฐํ โ ๋งค๋ฌผ ํ๋ ๋ณด๋ ค๊ณ ๋ฐ๋์ ์ ์๋๋ค
- ์ฌ์ง๊ณผ ๋ค๋ฅธ ์ค๋ฌผ โ ๋์ฐฉํด ๋ณด๋ฉด ์ฌ์ง์ด ์ข์์ ๋ฟ์ ๋๋ค
- ์ฒ์ ํด๋ณด๋ ๊ณ์ฝ โ ๊ณฐํก์ดยท์์ยท์ฑ๊ด, ๋ญ ํ์ธํด์ผ ํ ์ง ๋ชจ๋ฆ ๋๋ค
"์ง์ ๊ฐ์ง ์์๋, ๋์น๋ ๊ฒ ์์ด, ๊ธฐ๋ก์ด ๋จ๊ฒ ์ง์ ๋ณผ ์ ์๋ค๋ฉด?"
์์ฝ โโโถ ๋ผ์ด๋ธ ํฌ์ด โโโถ ์ฒดํฌ๋ฆฌ์คํธ โโโถ AI ํ์ ๋ฆฌํฌํธ
(WebRTC ํ์) (์ค์๊ฐ ๊ธฐ๋ก) (๊ณฐํก์ด ๋ฑ ์๋ ํ์ง)
- ์์ฝ: ๋ง์์ ๋๋ ๋งค๋ฌผ์ ๋ผ์ด๋ธ ํฌ์ด๋ฅผ ์์ฝ
- ๋ผ์ด๋ธ ํฌ์ด: ๊ณต์ธ์ค๊ฐ์ฌ์ 1:1 WebRTC ํ์์ผ๋ก ๋งค๋ฌผ์ ์ค์๊ฐ ํ์ธ
- ์ฒดํฌ๋ฆฌ์คํธ: ํฌ์ด ์ค ํ์ธ ํญ๋ชฉ์ ๊ทธ ์๋ฆฌ์์ ๊ธฐ๋ก
- AI ๋ฆฌํฌํธ: ํฌ์ด ์์ ํ๋ ์์ AI๊ฐ ๋ถ์ํด ๊ณฐํก์ด ๋ฑ ํ์๋ฅผ ํ์งํ ๋ฆฌํฌํธ ์ ๊ณต
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๊ธฐ๊ฐ | 2026.07 ~ 2026.08 (์ฝ 4์ฃผ) |
| ํ ๊ตฌ์ฑ | 6์ธ โ FE 3 ยท BE 3 ยท AI 2 ยท ์ธํ๋ผ 1 (๊ฒธ์ ํฌํจ) |
| ์ ์ฅ์ ๊ตฌ์กฐ | frontend/ React SPA ยท backend/ Spring Boot ยท infra/ coturn ๋ฑ ์ธํ๋ผ ์ค์ |
- ๋งค๋ฌผ ํ์: ๊ฒ์ ยท ์ง์ญ ยท ๊ฐ๊ฒฉ ยท ์ ํ ํํฐ, Kakao ์ง๋ ๋ทฐ(๋ง์ปค ํด๋ฌ์คํฐ๋ง ยท ์ปค์คํ ๋ง์ปค 9์ข ยท ์ฃผ๋ณ ํธ์์์ค), ์ ์ฅ(์ฐ)
- ๋ผ์ด๋ธ ํฌ์ด ์์ฝ: ๋งค๋ฌผ ์์ธ์์ ์ํ๋ ์๊ฐ์ ํฌ์ด ์์ฝ, ์์ฝ ํํฉ ๊ด๋ฆฌ
- WebRTC ๋ผ์ด๋ธ ํฌ์ด: ๊ณต์ธ์ค๊ฐ์ฌ โ ์ธ์ ์ 1:1 ์ค์๊ฐ ํ์ ์ฐ๊ฒฐ, TURN ์ค๊ณ๋ก ์ ๋ฃฐ๋ฌยท์ฌ๋ด๋ง์์๋ ์ฐ๊ฒฐ ๋ณด์ฅ
- ์ค์๊ฐ ์ฒดํฌ๋ฆฌ์คํธ: ํฌ์ด ์ค ํ์ธ ํญ๋ชฉ์ ๊ธฐ๋ก, ๋ฐฑ์๋ API ์ฐ๋์ผ๋ก ์ธ์ ๋ณ ์ ์ฅ
- AI ํ์ ๋ฆฌํฌํธ: ๋ผ์ด๋ธ ์ค "๊ณฐํก์ด ์์ฌ N๊ฑด ๊ฐ์ง" ์ค์๊ฐ ๋ฐฐ์ง, ์ข ๋ฃ ํ ์บก์ฒ ์ด๋ฏธ์ง + ํ์ ์ ํ ๋ฐฐ์ง๊ฐ ๋ด๊ธด ๋ถ์ ๋ฆฌํฌํธ
- ์์ ๋ก๊ทธ์ธ ยท ๊ด๋ฆฌ์: ์นด์นด์ค ยท ๊ตฌ๊ธ OAuth2 ๋ก๊ทธ์ธ, ์ค๊ฐ์ธ ์ธ์ฆ ์ฌ์ฌ ๊ด๋ฆฌ์ ํ์ด์ง
๊ณต์ธ์ค๊ฐ์ฌ์ 1:1 ํ์์ผ๋ก ๋งค๋ฌผ์ ํ์ธํ๋ ๋ผ์ด๋ธ ํฌ์ด
| ํ๋ฉด | ์ค๋ช |
|---|---|
๋๋ฉ (/) |
ํ์ด๋ก ์ผ์ผ์ด์ค(๋งค๋ฌผ ์นด๋ โ ์คํฌ๋กค ์ ํฌ์ด ์์ ์ฌ์), ํํ์ด์ง ์ค๋ + ์น์ ๋ํธ ๋ด๋น๊ฒ์ด์ |
๋งค๋ฌผ ๋ชฉ๋ก (/properties) |
๊ฒ์ ยท ํํฐ, ๋งค๋ฌผ ์นด๋ ๊ทธ๋ฆฌ๋, ์ง๋ ๋ทฐ(ํด๋ฌ์คํฐ๋ง ยท ํธ์์์ค), ์ ์ฅ ํ ๊ธ |
๋งค๋ฌผ ์์ธ (/properties/:id) |
์ฌ์ง ์บ๋ฌ์ , ๋งค๋ฌผ ์ ๋ณด, ์ฃผ๋ณ ํธ์์์ค(์งํ์ฒ ยท ํธ์์ ยท ๋นจ๋๋ฐฉ), ๋ผ์ด๋ธ ํฌ์ด ์์ฝ |
| ๋ผ์ด๋ธ ํฌ์ด | WebRTC ์ค์๊ฐ ํ์, ์ฒดํฌ๋ฆฌ์คํธ ๊ธฐ๋ก, AI ํ์ ์ค์๊ฐ ๊ฐ์ง ๋ฐฐ์ง |
| ๋ฆฌํฌํธ | ์ฒดํฌ๋ฆฌ์คํธ + AI ํ์ ํ์ง ๊ฒฐ๊ณผ(์บก์ฒ ์ด๋ฏธ์ง ยท ํ์ ์ ํ)๋ฅผ ๋ด์ ํฌ์ด ๋ฆฌํฌํธ |
ํด๋ผ์ด์ธํธ (React SPA)
โ HTTPS
โผ
Nginx (TLS ์ข
๋ฃ ยท Reverse Proxy, AWS EC2)
โโโ / โ React ์ ์ ํ์ผ (Docker, 127.0.0.1:3000)
โโโ /api/** โ Spring Boot
โโโ PostgreSQL / H2 (JPA)
โโโ OAuth2 (์นด์นด์ค ยท ๊ตฌ๊ธ)
โโโ WebSocket ์๊ทธ๋๋ง (OFFER / ANSWER / ICE_CANDIDATE)
์ค๊ฐ์ฌ โโโโโ WebRTC P2P (์์ ยท ์์ฑ) โโโโโถ ์ธ์
์
โ โโ P2P ๋ถ๊ฐ ๊ตฌ๊ฐ์ coturn TURN ์ค๊ณ
โ (3478/udpยทtcp, relay 49160-49200/udp, host ๋คํธ์ํฌ ๋ชจ๋)
โ
โโโ ํ๋ ์ ์บก์ฒ (1fps ยท ๊ธด ๋ณ 960px ยท JPEG)
โผ
AI ํ์ ํ์ง ์๋ฒ (RunPod GPU + ngrok, YOLO ๊ณ์ด)
โโโ bbox ยท ์ ๋ขฐ๋ ยท ํ์ ์ ํ(MOLD ๋ฑ) ์๋ต โ ๋ฆฌํฌํธ ์์ฑ
STUN๋ง์ผ๋ก๋ ๋์นญ NAT ยท ๋ฐฉํ๋ฒฝ ํ๊ฒฝ(์ ๋ฃฐ๋ฌ, ์ฌ๋ด๋ง)์์ P2P ๊ฒฝ๋ก๋ฅผ ๋ซ์ ์ ์์ด, coturn 4.6์ ๋์ปค๋ก EC2์ ์ฌ๋ ค TURN ์ค๊ณ๋ฅผ ๋์ ํ์ต๋๋ค.
- relay ํฌํธ ๋ฒ์(49160~49200/udp)๋ฅผ ๋์ปค NAT๋ก ๋งคํํ๋ฉด ์ฑ๋ฅ์ด ๋จ์ด์ ธ coturn๋ง
network_mode: host๋ก ์คํ - TURN ์๋ฒ๊ฐ VPC ๋ด๋ถ ๊ณต๊ฒฉ ํต๋ก๊ฐ ๋์ง ์๋๋ก ๋ด๋ถ IP ๋์ญ 5์ข
์
denied-peer-ip๋ก ์ฐจ๋จ, ์ธ์ ๋น ๋์ญํญ 1.5Mbps ์ํ - EC2 ๊ณต์ธ/์ฌ์ค IP๋ฅผ ์๋ ๊ฐ์งํด
external-ip=๋ฅผ ์ฑ์ฐ๋setup.shโ ์ธ์คํด์ค๊ฐ ๋ฐ๋์ด๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ - ์๊ทธ๋๋ง 2๊ณํต: ์ด์์ Spring WebSocket, ๋ก์ปฌ ๊ฐ๋ฐ์ Vite ํ๋ฌ๊ทธ์ธ์ผ๋ก ๋ง๋ ๋ฏธ๋ ์๊ทธ๋๋ง ์๋ฒ โ ๋ฐฑ์๋ ์์ด๋ ํ๋ก ํธ ๊ฐ๋ฐ ๊ฐ๋ฅ
- ์๋ ์ฌ์
์ฅ ์
RTCPeerConnection์ฌ์์ฑ, remoteDescription ์ค์ ์ ๋์ฐฉํ ICE ํ๋ณด๋ ๋ณด๊ด ํ flush
2. AI ํ์ ํ์ง ํ๋ ์ ํ์ดํ๋ผ์ธ โ "๋ช ํ๋ ์์, ์ด๋ค ํด์๋๋ก ๋ณด๋ผ ๊ฒ์ธ๊ฐ"
AI ์๋ฒ ๋ด๋น์์ ํ์ํด ์ ์ก ๊ธฐ์ค์ ํ์ ํ์ต๋๋ค.
| ํญ๋ชฉ | ๊ฐ | ๊ทผ๊ฑฐ |
|---|---|---|
| ์ ์ก ์ฃผ๊ธฐ | 1์ด๋น 1ํ๋ ์ | ํ์๋ ์ ์ ๋์ โ ๊ณ fps ๋ถํ์, ์๋ฒ ๋ถํ ์ต์ํ |
| ํด์๋ | ๊ธด ๋ณ 960px ๋ค์ด์ค์ผ์ผ | AI ๋ชจ๋ธ ์ ๋ ฅ ํฌ๊ธฐ์ ๋ง์ถค โ ์ด์์ ๋ญ๋น, ์ดํ๋ ์ ํ๋ ์์ค |
| ํฌ๋งท | JPEG ํ์ง 0.85 | ์ฉ๋ ๋๋น ํ์ง ๊ท ํ |
| ์บก์ฒ ์์น | ์ค๊ฐ์ฌ(์ก์ถ) ์ชฝ์์๋ง ์บก์ฒ | WebRTC ์ฝ๋ฑ ์์ถ์ ๊ฑฐ์น๊ธฐ ์ ์๋ณธ ํ์ง ํ๋ณด |
- AI ์
๋ ฅ 960px๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์นด๋ฉ๋ผ๋
getUserMedia๋ก 1080p๋ฅผ ์์ฒญ - ์ด์ ํ๋ ์ ์์ฒญ์ด ์ ๋๋ฌ์ผ๋ฉด ๋ค์ ํ๋ ์ ์คํต โ ๋๋ฆฐ ๋คํธ์ํฌ์์ ์์ฒญ์ด ๋ฐ๋ ค ์์ด๋ ๊ฒ์ ๋ฐฉ์ง
- ๋(ๆด) ๋จ์ ์ง์ค์ฝ๋ฉ์ผ๋ก ํ์ด ๋ ์ค์ฌ์ ๋ชฐ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์ง๋ ํ ์ ์ฉ API์ ์ค์ขํ ๊ธฐ๋ฐ์ผ๋ก ์ ํ, ์ขํ ์๋ ๋งค๋ฌผ๋ง ์ง์ค์ฝ๋ฉ ํด๋ฐฑ
- ๊ฐ์ ๊ฑด๋ฌผ ๋งค๋ฌผ๋ค์ด ํ ์ ์ ๊ฒน์น๋ ๋ฌธ์ ๋ ํฉ๊ธ๊ฐ(2.4 rad) ๋์ ๋ถ์ฐ์ผ๋ก ํด์ โ ๊ฒฝ๋ ์ด๋๋์
cos(์๋)๋ณด์ - ํธ์์์ค์ ์นดํ
๊ณ ๋ฆฌ ์ฝ๋ ๊ฒ์(์งํ์ฒ
SW8ยท ํธ์์ CS2), ์ฝ๋๊ฐ ์๋ ์ ํ๋นจ๋๋ฐฉ์ ํค์๋ ๊ฒ์์ผ๋ก ์ฐํ - ์ง์ค์ฝ๋ฉ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ๋ ๋ฒจ ์บ์์ ์ ์ฅํ๊ณ ์คํจ ๊ฑด๋ง ์ฌ์๋ ํ์ฉ โ API ์ฟผํฐ ์ ์ฝ
ํ๊ฒฝ(๋ก์ปฌ ํฌํธ ยท ๋ฐฐํฌ ๋๋ฉ์ธ)๋ง๋ค ๋ฆฌ๋ค์ด๋ ํธ URI ๋ถ์ผ์น๋ก ์๋ฌ๊ฐ ๋ฐ๋ณต๋๋ ๋ฌธ์ ๋ฅผ, redirect_uri๋ฅผ window.location.origin ๊ธฐ๋ฐ์ผ๋ก ๋ฐํ์์ ์กฐ๋ฆฝํ๋ ๊ตฌ์กฐ๋ก ๋ฐ๊ฟ ์์ฒ ์ ๊ฑฐํ์ต๋๋ค. OAuth ๋ณต๊ท ์ SPA ๋ผ์ฐํฐ state ์ ์ค์ sessionStorage ๋ณต์์ผ๋ก, React StrictMode์ ์ธ๊ฐ ์ฝ๋ ์ด์ค ์ฌ์ฉ์ ref ๊ฐ๋๋ก ํด๊ฒฐํ์ต๋๋ค.
Frontend
- React 19 ยท TypeScript ยท Vite
- Tailwind CSS v4 ยท shadcn/ui ยท framer-motion ยท Swiper
- TanStack Query 5 (์๋ฒ ์ํ) ยท Zustand (ํด๋ผ์ด์ธํธ ์ํ) ยท react-router 7
- WebRTC (๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ API) ยท Kakao Maps API
Backend
- Java 21 ยท Spring Boot (Spring Security ยท OAuth2 ยท JPA)
- PostgreSQL / H2
- WebSocket ์๊ทธ๋๋ง ์๋ฒ
AI
- YOLO ๊ณ์ด ํ์ ํ์ง ๋ชจ๋ธ (๊ณฐํก์ด ยท ๋ฒฝ์ง ์์)
- RunPod GPU ํ๊ฒฝ + ngrok ํฐ๋
Infra
- AWS EC2 (Ubuntu) ยท Docker ยท docker compose
- Nginx (TLS ์ข ๋ฃ ยท ๋ฆฌ๋ฒ์ค ํ๋ก์ ยท SPA ํด๋ฐฑ)
- coturn 4.6 (TURN)
master (๋ฐฐํฌ ยท ์ ์ถ)
โโโ frontend / backend (ํํธ ํตํฉ)
โโโ feat/*, feature/* ๊ธฐ๋ฅ ๊ฐ๋ฐ
โโโ fix/* ๋ฒ๊ทธ ์์
| ํ์ | ์ค๋ช |
|---|---|
feat |
์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ |
fix |
๋ฒ๊ทธ ์์ |
refactor |
๋์ ๋ณ๊ฒฝ ์๋ ๊ตฌ์กฐ ๊ฐ์ |
docs |
๋ฌธ์ ์์ |
chore |
์ค์ ยท ๋น๋ ๋ฑ ๊ธฐํ ์์ |
AI ์์ฑ ์ฝ๋์ ํ์ง์ ํ ์ฐจ์์์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ท์น ์ฒด๊ณ๋ฅผ ๋์์ต๋๋ค.
- ๊ท์น์ ๋จ์ผ ์ง์ค ๊ณต๊ธ์์
frontend/AGENTS.mdํ๋ โCLAUDE.md๋@AGENTS.md์ํฌํธ ํ ์ค๋ก ๋ฌธ์ ๋ถ์ผ์น๋ฅผ ์ฐจ๋จ frontend/.agents/rules/7์ข ์ด ํ์ผ ๊ฒฝ๋ก(glob)๋ณ๋ก ์ ์ฉ โ ์ํ ๊ด๋ฆฌ ยท API ๊ณ์ธต ยท TypeScript ยท ์ ๊ทผ์ฑ ยท ๋ณด์ ๊ท์น- "
pnpm lintยทpnpm build๋ฅผ ์ค์ ์คํํ ๊ฒ, ์คํ ๋ชป ํ์ผ๋ฉด ์ฑ๊ณต์ด๋ผ ๋งํ์ง ๋ง ๊ฒ" ๋ฑ AI์ ๊ฑฐ์ง ๋ณด๊ณ ๋ฅผ ๋ง๋ ์๋ฃ ์กฐ๊ฑด ๋ช ์ - ์ธ๋ถ ์คํฌ์
skills-lock.json์ผ๋ก ์ถ์ฒ ยท ๋ฆฌ๋น์ ๊ณ ์
git clone https://github.com/dfizae/bangbangbwa-service.git
cd bangbangbwa-service/frontend
# ํ๊ฒฝ ๋ณ์ ์ค์ (.env.example ์ฐธ๊ณ โ Kakao ํค, TURN ๊ณ์ ๋ฑ)
cp .env.example .env
pnpm install
pnpm dev # http://localhost:5173
pnpm build # ํ๋ก๋์
๋น๋cd bangbangbwa-service/backend
./gradlew bootRun# EC2 ๊ณต์ธ/์ฌ์ค IP๋ฅผ ๊ฐ์งํด turnserver.conf์ external-ip๋ฅผ ์ฑ์
bash infra/coturn/setup.sh
# ํ๋ก ํธ ์น + coturn ๊ธฐ๋
cd frontend && docker compose up -d์ด ์ ์ฅ์์ TURN ๊ณ์ ๋ฑ ์ํฌ๋ฆฟ ๊ฐ์ ํ๋ ์ด์คํ๋(
YOUR_TURN_CREDENTIAL๋ฑ)๋ก ์นํ๋์ด ์์ต๋๋ค.infra/coturn/turnserver.conf์user=์frontend/.env์ TURN ๊ณ์ ์ ๋ฐ๋์ ๊ฐ์ ๊ฐ์ผ๋ก ์ฑ์์ผ ํฉ๋๋ค. AI ํ์ ํ์ง๋ ๋ณ๋ AI ์๋ฒ๊ฐ ํจ๊ป ๊ตฌ๋๋์ด์ผ ๋์ํฉ๋๋ค.
| ํํธ | ํ์ |
|---|---|
| FE | ๊น์ฌ์(@dfizae), ๋ฐxx, ํฉxx |
| BE | ์xx, ์คxx, ์ตxx |
| AI | ๋ฐxx, ์ตxx |
| ์ธํ๋ผ | ํฉxx |
๋์๋ฐ์ ์๋ฃ๋ค:
- shadcn/ui โ UI ์ปดํฌ๋ํธ
- WebRTC samples โ WebRTC ์ฐ๊ฒฐ ยท TURN ๋์ ํ ์คํธ
- Kakao Developers โ ์์ ๋ก๊ทธ์ธ ยท ์ง๋ API

