Real-time Festival Congestion Monitoring Service
μΌμΈ μΆμ μ₯ μ€μκ° νΌμ‘λ λ° μμΉ νμΈ μλΉμ€ 'μκΈμκΈ'μ λ°±μλ 리ν¬μ§ν 리μ λλ€.
'μκΈμκΈ'μ λμ μΌμΈ μΆμ μ₯μμ λ°μνλ **"μΈν νΌμ‘"**μ ν΄κ²°νκΈ° μν μμΉ κΈ°λ° μλΉμ€μ
λλ€.
κΈ°μ‘΄μ μ’
μ΄ ννλ μ λμ§νΈννκ³ μ€μκ°μΌλ‘ μ¬μ©μμ μμΉλ₯Ό μ§κ³νμ¬ μ§κ΄μ μΈ νΌμ‘λ(Heatmap/Hexagon) μ 보λ₯Ό μ 곡ν©λλ€.
ν΄λΉ νλ‘μ νΈμμ μ ν¬λ λμ©λ νΈλν½ μ²λ¦¬λ₯Ό μν΄ λ€μκ³Ό κ°μ κΈ°μ μ λμ μ νμ΅λλ€.
- Challenge: μμ² λͺ μ μ¬μ©μκ° 1μ΄λ§λ€ μμΉλ₯Ό κ°±μ ν κ²½μ°, RDBμ I/O λΆνκ° κ°λΉν μ μμ λ§νΌ μ¦κ°ν©λλ€.
- Solution:
- μμΉ μ 보λ μꡬ μ μ₯μ΄ νμ μλ νλ°μ± λ°μ΄ν°μ λλ€.
- Redis Geo μλ£κ΅¬μ‘°λ₯Ό μ¬μ©νμ¬ In-Memoryμμ μμΉ κ°±μ λ° μ‘°ν μ±λ₯μ
O(1)~O(logN)μΌλ‘ μ΅μ ννμ΅λλ€. ExpireκΈ°λ₯μ νμ©ν΄ 1λΆ μ΄μ μλ΅μ΄ μλ(Heartbeat miss) μ¬μ©μλ₯Ό μλμΌλ‘ μ§κ³μμ μ μΈν©λλ€.
- Challenge: μ μμ μ μμ μ’ν(Point)λ₯Ό νλ‘ νΈμλλ‘ μ μ‘ν κ²½μ° λ λλ§ λΆνλ‘ μΈν΄ λͺ¨λ°μΌ κΈ°κΈ°κ° λ©μΆλ νμμ΄ λ°μν©λλ€.
- Solution:
- Uber H3 Spatial Index μκ³ λ¦¬μ¦μ λμ νμ¬ μ§λλ₯Ό μ‘κ°ν(Hexagon) 그리λλ‘ λλλλ€.
- μλ²μμ 미리 ꡬμλ³ μΈμμλ₯Ό μ§κ³(Aggregation)ν λ€
HexIDμλ°μ§λ Levelλ§ μ μ‘νμ¬ λ°μ΄ν° μ μ‘λμ 90% μ΄μ μ κ°νμ΅λλ€.
| Category | Technology | Description |
|---|---|---|
| Framework | Spring Boot 3.4.2 | Java 21 κΈ°λ°μ κ²¬κ³ ν μλ² κ΅¬μΆ |
| Database | MySQL 8.0 | μ¬μ©μ, μΆμ μ 보 λ± μ ν λ°μ΄ν° κ΄λ¦¬ |
| Cache/NoSQL | Redis | μ€μκ° μμΉ μ μ₯(Geo) κ΄λ¦¬ |
| ORM | Spring Data JPA | κ°μ²΄ μ§ν₯μ μΈ λ°μ΄ν° μ κ·Ό κ³μΈ΅ ꡬν |
| Auth | JWT | Statelessν μΈμ¦ μ²λ¦¬ |
| Library | Uber H3 (Java) | μ‘κ°ν κ³΅κ° μΈλ±μ± μκ³ λ¦¬μ¦ |
λλ©μΈν λλ ν 리 ꡬ쑰λ₯Ό μ±ννμ¬ λΉμ¦λμ€ λ³΅μ‘λλ₯Ό κ΄λ¦¬ν©λλ€.
com.waglewagle.server
βββ global # μ μ μ€μ (Config, Error, Util)
βββ domain
β βββ festival # μΆμ μ 보 κ΄λ¦¬
β βββ member # μ¬μ©μ μΈμ¦/μΈκ°
β βββ map # μ§λ μ€λ²λ μ΄ λ° νμν
μ΄λΈ
β βββ location # [Core] μ€μκ° μμΉ λ° H3 μ§κ³ λ‘μ§
βββ WagleServerApplication.java
- Clone Repository
git clone [https://github.com/wagle-wagle/wagle-server.git](https://github.com/wagle-wagle/wagle-server.git)
- Setup Environment
application.ymlνμΌ μμ± λ° DB μ€μ (MySQL, Redis ν¬νΈ νμΈ)
- Run Application
./gradlew bootRun