์ค์๊ฐ ์ฐจ๋ ์์น ์ถ์ /๋ชจ๋ํฐ๋ง ์๋น์ค. ์๋ฎฌ๋ ์ดํฐโKafkaโDBโ๋ฐฑ์๋โํ๋ฐํธ ๋์๋ณด๋๊น์ง ์๋ํฌ์๋ ํ์ดํ๋ผ์ธ์ ์ ๊ณตํฉ๋๋ค.
- ๋ชฉํ: ๋๋ ์ฐจ๋์ ์์น ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์์ง/์ฒ๋ฆฌ/์๊ฐํ
- ํต์ฌ ๊ธฐ๋ฅ
- ์ค์๊ฐ GPS ์คํธ๋ฆผ ์ฒ๋ฆฌ (Kafka ๊ธฐ๋ฐ)
- ๋์๋ณด๋์์ ์ฐจ๋ ํํฉ/์ฃผํ ์ด๋ ฅ ํ์ธ
- ์ต๊ทผ 2๋ถ ๊ธฐ์ค ์ํ ํ์ (์ฃผํ/์ ์ง/์คํ๋ผ์ธ)
- ํน์ง
- ๋ชจ๋๋ฆฌ์์ด ์๋ Main/Consumer/Emulator/Support ๋ฉํฐ๋ชจ๋
- AWS ECS + ALB + S3/CloudFront + RDS + ECR ํ๋ก๋์ ๋ฐฐํฌ
- Terraform์ผ๋ก ์ธํ๋ผ IaC, Jenkins๋ก CI/CD
- Backend: Java 17, Spring Boot 3, Spring Data JPA, WebFlux, Spring Security, JWT
- Messaging: Apache Kafka (Zookeeper)
- DB/Cache: MySQL (RDS)
- Frontend: React , TypeScript
- Infra: Terraform, AWS (ECS, ALB, S3/CloudFront, ECR, RDS, Route53, CloudWatch), Docker, Docker Compose
- CI/CD: Jenkins (๋ฉํฐ๋ธ๋์น/ํ์ดํ๋ผ์ธ)
KUNI_GPSTracker/
โโ BackendServer/
โ โโ consumer/ # Kafka consumer
โ โโ emulator/ # ์๋ฎฌ๋ ์ดํฐ๋ก๋ถํฐ ๋ฐ์ดํฐ ๋ฐ๋ ์๋ฒ
โ โโ server/ # ๊ด์ ์๋ฒ api
โ โโ support/
| โโ common/ # Util
| โโ business/ # Record ๊ด๋ จ DTO
| โโ database/ # DB
| โโ global/ # swagger, exception, kafka ๋ชจ๋ธ
โ โโ log/ # log ๊ด๋ จ ์ค์
โโ Emulator/ # ์ ๋ฎฌ๋ ์ดํฐ ๊ธฐ๊ธฐ
โโ infra/
โ โโ terraform/ # AWS IaC
โ |โ Jenkinsfile # CI/CD Jenkins ์ค์ ํ์ผ
| โโ Dockerfile # ์๋ฒ ์ด๋ฏธ์ง ๋์ปค ํ์ผ
โโ docs/
โโ images/ # ์ํคํ
์ฒ/์คํฌ๋ฆฐ์ท/GIF
flowchart TD
%% ------------------ ์ฌ์ฉ์ ์์ญ ------------------
subgraph USER[์ฌ์ฉ์]
direction TB
A1["๐ค ๋ ํฐ์นด ์
์ฒด ๊ด๋ฆฌ์"]
A2["๐ ์ฐจ๋ ๋ฑ๋ก/์ญ์ "]
A3["๐งโ๐ผ ์ด์ ์ ์ ๋ณด ์
๋ ฅ"]
end
%% ------------------ Emulator ์๋ฒ ------------------
subgraph EMULATOR_SERVER[Emulator ์๋ฒ]
direction TB
B1["๐ ๏ธ Emulator API"]
B2["/api/emulator/token - ํ ํฐ ๋ฐ๊ธ"]
B3["/api/emulator/on - ์๋ ON"]
B4["/api/emulator/off - ์๋ OFF"]
B5["/api/emulator/gps - GPS ์ฃผ๊ธฐ์ ๋ณด ์ ์ฅ (CSV ์์ )"]
B6["Kafka Producer"]
end
%% ------------------ Kafka & DB ------------------
subgraph KAFKA_DB[Kafka & DB]
direction TB
C1["๐งฑ Kafka Broker (1๋ถ๋น 15,000๊ฑด)"]
C2["๐ฅ Kafka Consumer"]
C3["๐๏ธ MySQL RDS"]
C4["๐ Vehicle"]
C5["๐ Device"]
C6["๐งพ Record"]
C7["๐ก GpsRecord"]
end
%% ------------------ BackendServer ------------------
subgraph BACKEND[BackendServer API]
direction TB
D1["๐ง BackendServer API"]
D2["/vehicles - ์ฐจ๋ ๋ชฉ๋ก"]
D3["/location - ์ค์๊ฐ ์์น"]
D4["/dashboard - ์ดํ ํต๊ณ"]
D5["/api/emulator - Emulator ์ด๋ฒคํธ ์ฒ๋ฆฌ"]
end
%% ------------------ React Frontend ------------------
subgraph FRONTEND[React ๋์๋ณด๋]
direction TB
E1["๐ป React ๋์๋ณด๋"]
E2["๐ ๋ก๊ทธ์ธ/ํ์๊ฐ์
"]
E3["๐ ์ ์ฒด ์ฐจ๋ ํํฉ"]
E4["๐บ๏ธ ์ค์๊ฐ ์์น ์ง๋"]
E5["๐งพ ์ดํ ์ผ์ง ํ์ด์ง"]
E6["๐ ์ฐจ๋ ๊ด๋ฆฌ ํ์ด์ง"]
E7["๐ ๊ฐ๋ณ ์ฐจ๋ ์์ธ ํ์ด์ง"]
E8["โฑ๏ธ 15์ด ๊ฐ๊ฒฉ ๋ฐ์ดํฐ fetch"]
end
%% ------------------ ์ธํ๋ผ ------------------
subgraph INFRA[์ธํ๋ผ ๊ตฌ์ฑ]
direction TB
F1["โ๏ธ AWS ECS + ALB"]
F2["๐๏ธ S3 + CloudFront"]
F3["๐ณ ECR + RDS"]
F4["๐ ๏ธ Terraform + Jenkins"]
F5["๐ CloudWatch Logs"]
end
%% ------------------ ์ฐ๊ฒฐ ------------------
%% ์ฌ์ฉ์ โ BackendServer
A1 --> A2
A2 --> D2
A3 --> D2
%% Emulator ์๋ฒ API
B1 --> B2
B1 --> B3
B1 --> B4
B1 --> B5
B5 --> B6
%% Kafka โ DB
B6 --> C1
C1 --> C2
C2 --> C7
%% DB ๊ด๊ณ
C4 --> C5
C4 --> C6
C4 --> C7
C6 --> C7
%% BackendServer API โ DB
D1 --> D2
D1 --> D3
D1 --> D4
D1 --> D5
D2 --> C4
D2 --> C5
D3 --> C7
D4 --> C4
D4 --> C6
D4 --> C7
D5 --> C7
%% React Frontend โ BackendServer API
E2 --> D1
E6 --> D2
E5 --> D4
E4 --> D3
E3 --> D4
E5 --> E7
E8 --> D2
E8 --> D3
E8 --> D4
%% ์ธํ๋ผ ์ฐ๊ฒฐ
F1 --> D1
F2 --> E2
F3 --> C3
F4 --> F1
F5 --> F1
- JDK 17
- MYSQL 8.0
- Docker / Docker Compose
# BackendServer ๊ณตํต (๋ฃจํธ/BackendServer/.env.properties)
DB_HOST=localhost
DB_PORT=3306
DB_NAME=gpsTracker
DB_USERNAME=root
DB_PASSWORD=password
KAFKA_BOOTSTRAP_SERVERS=localhost:9092
jwt.secret=very-secret-key-very-secret-key-123456
jwt.secret-base64=SFVGjDe/OwyN46p1euKSNQvZrpF14kwEKI9kUJ50BvI=
# Emulator์ฉ (๋ฃจํธ/Emulator/.env.properties)
TARGET_BASE_URL=http://localhost:8081/api/emulator# ๋ฃจํธ์์ ์คํ
docker compose -f docker-compose.mysql.yaml up -d
docker compose -f docker-compose.kafka.yaml up -d# Backend๋ BackendServer ํด๋์์ ์คํ
# Backend (main)
./gradlew :server:bootRun
# Backend (emulator(server))
./gradlew :emulator:bootRun
# Backend (Consumer)
./gradlew :consumer:bootRun
# Emulator ํด๋์์ ์คํ
./gradlew :bootRunSwagger UI:
http://localhost:8080/swagger-ui/index.htmlemulator web:http://localhost:8082/emulator
- Develop ๋ธ๋์น ํธ์ฌ ํ Jenkins์์ ๋น๋
- Terraform์ผ๋ก ์ธํ๋ผ ๋ณ๊ฒฝ (ํ์ ์)
- CloudWatch Logs๋ก ๋ชจ๋ํฐ๋ง
- Kafka ์ค์ : ์์ฐ ๋ฌธ์ ๋ก broker 1๊ฐ๋ก ์งํ
- ์ฒ๋ฆฌ๋: 1๋ถ์ 15000๊ฑด์ ์์ฒญ, ํ ์์ฒญ๋น 60๊ฐ gps์ ๋ณด
- ECS ์คํ ์ค์ผ์ผ (CPU ๊ธฐ๋ฐ)
kafka ์ ์ฉ ์ด์ (์ด ๋ ธํธ๋ถ 5๋๋ก ์งํ, ์๋ ์์๋ 1๋)
์ฑ๊ณต๋ฅ ์ด 20% -> 70% ๋ก ์ฆ๊ฐ
- JWT ๊ธฐ๋ฐ ์ธ์ฆ
- CORS ํ์ฉ ๋๋ฉ์ธ ํ์ดํธ๋ฆฌ์คํธ
- ๋น๋ฐ์ ๋ณด๋ ํ๊ฒฝ๋ณ์ ์ฌ์ฉ
- HTTPS(CloudFront/ALB) ์ํธํ ์ฌ์ฉ
| ์ด๋ฆ | ์ญํ | ๋ด๋น | GitHub |
|---|---|---|---|
| ๊น์ฌํ | ๋ฐฑ์๋ ๋ฆฌ๋ | API/Kafka | @id |
| ์ฅ์นํ | ์ธํ๋ผ | AWS/Terraform/CI-CD | @id |
| ๋ฐฑ์์ฐ | ์ธํ๋ผ | AWS/Terraform/CI-CD | @id |
| ๊น์ํ | ์ธํ๋ผ | AWS/Terraform/CI-CD | @id |
| ๊น์ ๋น | ์ธํ๋ผ | AWS/Terraform/CI-CD | @id |