|
1 | | -<img width="1920" height="1080" alt="Raillo-Server-Architecture" src="https://github.com/user-attachments/assets/d5ca3e3d-c5bc-497a-aa31-83c1ba7fb65e" /> |
| 1 | +# ๐
Raillo |
| 2 | + |
| 3 | +## ๐๐ป ๋ฉค๋ฒ |
| 4 | +<table> |
| 5 | + <tbody> |
| 6 | + <tr> |
| 7 | + <td align="center"> |
| 8 | + <a href="https://github.com/Ogu1208"><img src="https://avatars.githubusercontent.com/u/76902448?v=4" width="100px;" alt="๊น๋ฏผ์"/><br /></a> |
| 9 | + </td> |
| 10 | + <td align="center"> |
| 11 | + <a href="https://github.com/EndlessMilkyway"><img src="https://avatars.githubusercontent.com/u/26517746?v=4" width="100px;" alt="๊น์๋ ฌ"/><br /></a> |
| 12 | + </td> |
| 13 | + <td align="center"> |
| 14 | + <a href="https://github.com/karlislepark"><img src="https://avatars.githubusercontent.com/u/64067168?v=4" width="100px;" alt="๋ฐ๋ฒ์ง"/><br /></a> |
| 15 | + </td> |
| 16 | + <td align="center"> |
| 17 | + <a href="https://github.com/Jimin730"><img src="https://avatars.githubusercontent.com/u/108002997?v=4" width="100px;" alt="์ ์ง๋ฏผ"/><br /></a> |
| 18 | + </td> |
| 19 | + <td align="center"> |
| 20 | + <a href="https://github.com/Friox"><img src="https://avatars.githubusercontent.com/u/10986386?v=4" width="100px;" alt="์ด์นํ"/><br /></a> |
| 21 | + </td> |
| 22 | + <td align="center"> |
| 23 | + <a href="https://github.com/chanwonlee"><img src="https://avatars.githubusercontent.com/u/116537544?v=4" width="100px;" alt="์ด์ฐฌ์"/><br /></a> |
| 24 | + </td> |
| 25 | + <td align="center"> |
| 26 | + <a href="https://github.com/Yunsung-Jo"><img src="https://avatars.githubusercontent.com/u/135187534?v=4" width="100px;" alt="์กฐ์ค์ฑ"/><br /></a> |
| 27 | + </td> |
| 28 | + </tr> |
| 29 | + <tr> |
| 30 | + <td align="center"><a href="https://github.com/Ogu1208">๊น๋ฏผ์</a></td> |
| 31 | + <td align="center"><a href="https://github.com/EndlessMilkyway">๊น์๋ ฌ</a></td> |
| 32 | + <td align="center"><a href="https://github.com/karlislepark">๋ฐ๋ฒ์ง</a></td> |
| 33 | + <td align="center"><a href="https://github.com/Jimin730">์ ์ง๋ฏผ</a></td> |
| 34 | + <td align="center"><a href="https://github.com/Friox">์ด์นํ</a></td> |
| 35 | + <td align="center"><a href="https://github.com/chanwonlee">์ด์ฐฌ์</a></td> |
| 36 | + <td align="center"><a href="https://github.com/Yunsung-Jo">์กฐ์ค์ฑ</a></td> |
| 37 | + </tr> |
| 38 | + </tbody> |
| 39 | +</table> |
| 40 | + |
| 41 | +## ๐ ๋ชฉ์ฐจ |
| 42 | +- [ํ๋ก์ ํธ ๊ฐ์](#-ํ๋ก์ ํธ-๊ฐ์) |
| 43 | +- [๊ธฐ์ ์คํ](#-๊ธฐ์ -์คํ) |
| 44 | +- [์ํคํ
์ฒ](#-์ํคํ
์ฒ) |
| 45 | +- [์ฃผ์ ๊ธฐ๋ฅ](#-์ฃผ์-๊ธฐ๋ฅ) |
| 46 | +- [๋ชจ๋ํฐ๋ง & ์ด์](#-๋ชจ๋ํฐ๋ง--์ด์) |
| 47 | +- [ํ
์คํธ](#-ํ
์คํธ) |
| 48 | +- [์ฃผ์ ์๋ํฌ์ธํธ](#-์ฃผ์-์๋ํฌ์ธํธ) |
| 49 | + |
| 50 | +## ๐ ํ๋ก์ ํธ ๊ฐ์ |
| 51 | +**Raillo**๋ ์ฝ๋ ์ผ(KORAIL) ์๋งค ์์คํ
์ ํด๋ก ์ฝ๋ฉํ ๊ธฐ์ฐจ ์์ฝ ํ๋ซํผ์ผ๋ก, |
| 52 | +์ค์ ์๋น์ค์ ํต์ฌ ๊ธฐ๋ฅ๋ค์ ์ต๋ํ ์ ์ฌํ๊ฒ ๊ตฌํํ์ฌ ํ์
์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์คํ๊ณผ ์ค๊ณ ํจํด์ ํ์ตํ๊ณ ์ ์ฉํ ํ๋ก์ ํธ์
๋๋ค. |
| 53 | + |
| 54 | +### ๐
์งํ ๊ธฐ๊ฐ |
| 55 | +- 1์ฐจ (๊ธฐํ ๋ฐ ๊ฐ๋ฐ) : 2025. 05. 28. ~ 2025. 07. 01. |
| 56 | +- 2์ฐจ (ํด๋ผ์ด์ธํธ ์๊ตฌ์ฌํญ ๋ฐ์) : 2025. 07. 02. ~ 2025. 07. 15. |
| 57 | +- 3์ฐจ (์นด์นด์ค API ํตํฉ) : 2025. 07. 16. ~ 2025. 08. 08. |
| 58 | +- ์ง์ ๊ฐ์ : 2025. 08. 09. ~ endless |
| 59 | + |
| 60 | +### ๐ฏ ํต์ฌ ๋ชฉํ |
| 61 | +- **์ค์ ์๋น์ค์ ์ ์ฌํ ํต์ฌ ๊ธฐ๋ฅ ๊ตฌํ** : ์ค์ ์ฝ๋ ์ผ์์ ์ ๊ณตํ๋ ํ์ ์ธ์ฆ ๋ฐ ์ฃผ์ ์๋งค ํ๋ฆ์ ์ต๋ํ ๋น์ทํ๊ฒ ๊ตฌํ |
| 62 | +- **ํ๋ฐํ ํ์
๊ณผ ์ญํ ๋ถ๋ด ๊ฒฝํ** : ํ ๋ด๋ถ์์ ์ญํ ์ ๋ถ๋ด, ํ์
ํด์ ์ด์ฉํ ๋ฒ์ ๊ด๋ฆฌ, ์ด์ ํธ๋ํน, ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฑ ํ์
๋ฐฉ์์ ์ ์ฉ |
| 63 | +- **์ค๋ฌด์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์คํ ํ์ต ๋ฐ ๊ฒฝํ** : ์ค๋ฌด์์ ์ฌ์ฉ๋๋ ๋ค์ํ ๊ธฐ์ ์คํ์ ํ์ต, ๊ฒฝํํ๊ณ ๊ด๋ จ ํจํด์ ์ ์ฉ |
| 64 | + |
| 65 | +## ๐ง ๊ธฐ์ ์คํ |
| 66 | +### Backend |
| 67 | +[](https://skillicons.dev) |
| 68 | +- **Language** : Java |
| 69 | +- **Framework** : Spring Boot, Spring Security, Spring Batch |
| 70 | +- **ORM** : Spring Data JPA, QueryDSL |
| 71 | +- **DB** : MySQL (Production), H2 (Test) |
| 72 | +- **Cache** : Redis |
| 73 | +- **Authentication** : JWT |
| 74 | +- **File Processing** : Apache POI |
| 75 | +- **Build Tool** : Gradle |
| 76 | + |
| 77 | +### Infrastructure & DevOps |
| 78 | +[](https://skillicons.dev) |
| 79 | +- **Cloud Platform** : AWS (EKS, RDS, Route53, Load Balancer) |
| 80 | +- **Container** : Docker, Kubernetes |
| 81 | +- **CI/CD** : GitHub Actions, ArgoCD (GitOps) |
| 82 | +- **Monitoring** : Prometheus, Grafana |
| 83 | +- **VCS** : Git, GitHub |
| 84 | + |
| 85 | +### Testing |
| 86 | +- **Framework** : JUnit, Spring Boot Test |
| 87 | +- **DB** : H2 (in-memory) |
| 88 | +- **Cache** : Embedded Redis |
| 89 | +- **Test Utils** : AssertJ |
| 90 | +- **Performance Testing** : K6 |
| 91 | +- **Email Testing** : GreenMail |
| 92 | +- **Coverage** : JaCoCo |
| 93 | + |
| 94 | +## ๐๏ธ ์ํคํ
์ฒ |
| 95 | +<img width="1920" alt="Raillo-Server-Architecture" src="https://github.com/user-attachments/assets/d5ca3e3d-c5bc-497a-aa31-83c1ba7fb65e" /> |
| 96 | + |
| 97 | +### ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ (DDD) |
| 98 | +``` |
| 99 | +src/main/java/com/sudo/railo/ |
| 100 | +โโโ auth/ # ์ธ์ฆ ๋๋ฉ์ธ |
| 101 | +โโโ booking/ # ์์ฝ ๋๋ฉ์ธ |
| 102 | +โโโ global/ # ๊ณตํต ๊ธฐ๋ฅ |
| 103 | +โโโ member/ # ํ์ ๋๋ฉ์ธ |
| 104 | +โโโ payment/ # ๊ฒฐ์ ๋๋ฉ์ธ |
| 105 | +โโโ train/ # ์ด์ฐจ ๋๋ฉ์ธ |
| 106 | +``` |
| 107 | + |
| 108 | +## ๐ ์ฃผ์ ํน์ง |
| 109 | +### ๐ Auth ๋๋ฉ์ธ |
| 110 | +- **JWT ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ
** : Access Token๊ณผ Refresh Token์ ํ์ฉํ Stateless ์ธ์ฆ ๋ฐ ์ธ๊ฐ |
| 111 | +- **์ด๋ฉ์ผ ์ธ์ฆ** : Redis๋ฅผ ํ์ฉํ ์ธ์ฆ ์ฝ๋ ๋ฐ์ก ๋ฐ ๊ฒ์ฆ ์์คํ
|
| 112 | +- **๋ณด์ ๊ฐํ** : ๋ก๊ทธ์์๋ ํ ํฐ Redis ๊ด๋ฆฌ, ์ฟ ํค ๊ธฐ๋ฐ Refresh Token ๊ด๋ฆฌ |
| 113 | + |
| 114 | +### ๐ค Member ๋๋ฉ์ธ |
| 115 | +- **๊ณ ์ ํ์๋ฒํธ ์์คํ
** : Redis ๊ธฐ๋ฐ ์ผ์ผ ์ฆ๋ถ ์นด์ดํฐ๋ฅผ ํ์ฉํ ํ์๋ฒํธ ์๋ ์์ฑ (`yyyyMMddCCCC` ํ์) |
| 116 | +- **Soft-Delete** : ์ค์ ํ์ ์ญ์ ๊ฐ ์๋ ๋นํ์ฑํ ์ฒ๋ฆฌ |
| 117 | +- **๋ง๋ฃ ํ์ ์ผ๊ด ์ญ์ ** : ๋ง๋ฃ๋ ํ์ ๋ฐ์ดํฐ ์ ๋ฆฌ๋ฅผ ์ํ Spring Batch ํ์ฉ |
| 118 | + |
| 119 | +### ๐ซ Booking ๋๋ฉ์ธ |
| 120 | +- **์ฅ๋ฐ๊ตฌ๋ ์์คํ
** : ์์ฝ ํ ๊ฒฐ์ ์ ์์ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ ๊ธฐ๋ฅ |
| 121 | +- **์ข์ ์์ฝ ๊ด๋ฆฌ** : ์น๊ฐ ์ ํ๋ณ ์ข์ ๋ฐฐ์ ๋ฐ ์์ฝ ์ํ ๊ด๋ฆฌ |
| 122 | +- **์๊ธ ๊ณ์ฐ** : ๊ฑฐ๋ฆฌ๋ณ, ์น๊ฐ ์ ํ๋ณ, ์ฐจ๋ ๋ฑ๊ธ๋ณ ์๊ธ ์๋ ๊ณ์ฐ |
| 123 | + |
| 124 | +### ๐ต Payment ๋๋ฉ์ธ |
| 125 | +- **๊ฒฐ์ ์๋จ ํ์ฅ์ ์ํ ์ ์ฐํ ๊ตฌ์กฐ** : ์ ์ฐจ๋ฅผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ์ถํ ๊ฒฐ์ ์๋จ ํ์ฅ ์ฉ์ดํจ |
| 126 | +- **๊ฒฐ์ ํค ์์ฑ** : ๊ณ ์ ํ ๊ฒฐ์ ์๋ณ์ ์๋ ์์ฑ |
| 127 | +- **๊ฒฐ์ ๊ฒ์ฆ** : ๊ธ์ก ๊ฒ์ฆ ๋ฐ ์ค๋ณต ๊ฒฐ์ ๋ฐฉ์ง |
| 128 | +- **์๋ ํฐ์ผ ๋ฐ๊ธ** : ๊ฒฐ์ ์๋ฃ ์ ํฐ์ผ ์์ฑ |
| 129 | +- **์ทจ์ ๋ฐ ํ๋ถ** : ๊ฒฐ์ ์ทจ์ ๋ฐ ํ๋ถ ์ฒ๋ฆฌ ์์คํ
|
| 130 | + |
| 131 | +### ๐
Train ๋๋ฉ์ธ |
| 132 | +- **์ค์ ๋ฐ์ดํฐ ํ์ฉ** : ์ฝ๋ ์ผ์ ์ค์ ์ด์ ์ค์ผ์ค Excel ํ์ผ์ ํ์ฑํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์ถ |
| 133 | +- **์์
๋ฐ์ดํฐ ํ์ฑ** : Apache POI๋ฅผ ํ์ฉํ ๋ณต์กํ ์ค์ผ์ค ๋ฐ์ดํฐ ์๋ ํ์ฑ |
| 134 | +- **์ด์ฐจ ๊ฒ์ ์ต์ ํ** : ๋ฐฐ์น ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ๋์ฉ๋ ์ค์ผ์ค ๊ฒ์ ์ฑ๋ฅ ์ต์ ํ |
| 135 | +- **์ข์ ํํฉ ๊ด๋ฆฌ** : ์ค์๊ฐ ์ข์ ์์ฝ ํํฉ ๋ฐ ์ฌ์ ์ ์ ๋ณด ์ ๊ณต |
| 136 | +- **์ญ ๊ฐ ์๊ธ ์์คํ
** : ๊ตฌ๊ฐ๋ณ ์ธ๋ถํ๋ ์๊ธ ์ฒด๊ณ ๊ตฌํ |
| 137 | + |
| 138 | +## ๐ ๋ชจ๋ํฐ๋ง & ์ด์ |
| 139 | +- `GitHub Actions`์ `ArgoCD`๋ฅผ ํ์ฉํด ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋ ๋น๋, ๋ฐฐํฌ, ํด๋ฌ์คํฐ ์ ์ฉ |
| 140 | +- `AWS EKS` ๊ธฐ๋ฐ์์ ๋ชจ๋ ๊ตฌ์ฑ์์๋ฅผ ์ปจํ
์ด๋๋ก ๊ด๋ฆฌ |
| 141 | +- `Prometheus`, `Grafana`๋ฑ์ ๋์
ํ์ฌ ๋
ธ๋ ๋ณ ์๋น์ค ์ํ, ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ค์๊ฐ์ผ๋ก ์์ง ๋ฐ ๊ฐ์ํ |
| 142 | +- ์ฌ๋ฌ `Node Group`๊ณผ ๋ถ์ฐ๋ ๋ฐฑ์๋ ๋ฐ Redis๋ก ๊ตฌ์ฑ๋์ด ๊ณ ๊ฐ์ฉ์ฑ ํ๋ณด |
| 143 | +- `RDS`, `Route53`, `LB` ๋ฑ `AWS ์๋น์ค`๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ํธ๋ํฝ ๋ถ์ฐ ๋ฐ ๋๋ฉ์ธ ์ด์ ์ง์ |
| 144 | + |
| 145 | +## ๐งช ํ
์คํธ |
| 146 | +### ๋ก์ปฌ ํ
์คํธ ํ๊ฒฝ ๊ตฌ์ถ |
| 147 | +- ๋ก์ปฌ์์ ์ด์ํ๊ฒฝ๊ณผ ๋น์ทํ ํ๊ฒฝ ๊ตฌ์ถ ํ ์คํธ๋ ์ค ํ
์คํธ ์งํ |
| 148 | +- Spring Boot, LB, Redis, Prometheus, Grafana, AWS RDS ์ด์ฉ |
| 149 | + |
| 150 | +### K6๋ฅผ ์ด์ฉํ ๋ถํ ํ
์คํธ |
| 151 | +- K6๋ก API ํธ์ถ -> ๋ก๋๋ฐธ๋ฐ์ -> Spring Boot Application -> DB |
| 152 | +- ๋ถํ ํ
์คํธ ๋ชฉํ ์ค์ (์: Target TPS 500, Avg Latency 800ms ์ดํ) |
| 153 | +- ๋ถํ ํ
์คํธ ์งํ ํ ๋ณ๋ชฉ ์ง์ ํ์
, ์ฑ๋ฅ ๊ฐ์ |
| 154 | +- ๊ฐ์ ํ ์์คํ
์ด ์ด๋ ์ ๋ ํธ๋ํฝ๊น์ง๋ฅผ ๊ฒฌ๋ ์ ์๋์ง ํ
์คํธ ๊ณผ์ ๋ฐ๋ณต |
| 155 | + |
| 156 | +## ๐ ์ฃผ์ ์๋ํฌ์ธํธ |
| 157 | +```http |
| 158 | +# Auth |
| 159 | +POST /auth/signup |
| 160 | +POST /auth/login |
| 161 | +POST /auth/logout |
| 162 | +POST /auth/emails/verify |
| 163 | +POST /auth/reissue |
| 164 | +
|
| 165 | +# Booking |
| 166 | +GET /api/v1/booking/reservation |
| 167 | +GET /api/v1/booking/reservation/{reservationId} |
| 168 | +POST /api/v1/booking/reservation |
| 169 | +DELETE /api/v1/booking/reservation |
| 170 | +GET /api/v1/booking/ticket |
| 171 | +
|
| 172 | +# Member |
| 173 | +DELETE /api/v1/members |
| 174 | +GET /api/v1/members/me |
| 175 | +PUT /api/v1/members/password |
| 176 | +
|
| 177 | +# Payment |
| 178 | +GET /api/v1/payments |
| 179 | +POST /api/v1/payments/{paymentKey}/cancel |
| 180 | +POST /api/v1/payments/bank-account |
| 181 | +POST /api/v1/payments/card |
| 182 | +
|
| 183 | +# Train |
| 184 | +GET /api/v1/trains/calendar |
| 185 | +POST /api/v1/trains/cars |
| 186 | +POST /api/v1/trains/search |
| 187 | +POST /api/v1/trains/seats |
| 188 | +``` |
0 commit comments