diff --git a/README.md b/README.md index 0dbfd5ca..f533c6f9 100644 --- a/README.md +++ b/README.md @@ -1 +1,188 @@ -Raillo-Server-Architecture +# πŸš… Raillo + +## πŸ™ŒπŸ» 멀버 + + + + + + + + + + + + + + + + + + + + + +
+ κΉ€λ―Όμ•„
+
+ κΉ€μ˜λ ¬
+
+ λ°•λ²”μ§„
+
+ μ‹ μ§€λ―Ό
+
+ μ΄μŠΉν›ˆ
+
+ 이찬원
+
+ μ‘°μœ€μ„±
+
κΉ€λ―Όμ•„κΉ€μ˜λ ¬λ°•λ²”μ§„μ‹ μ§€λ―Όμ΄μŠΉν›ˆμ΄μ°¬μ›μ‘°μœ€μ„±
+ +## πŸ“‹ λͺ©μ°¨ +- [ν”„λ‘œμ νŠΈ κ°œμš”](#-ν”„λ‘œμ νŠΈ-κ°œμš”) +- [기술 μŠ€νƒ](#-기술-μŠ€νƒ) +- [μ•„ν‚€ν…μ²˜](#-μ•„ν‚€ν…μ²˜) +- [μ£Όμš” κΈ°λŠ₯](#-μ£Όμš”-κΈ°λŠ₯) +- [λͺ¨λ‹ˆν„°λ§ & 운영](#-λͺ¨λ‹ˆν„°λ§--운영) +- [ν…ŒμŠ€νŠΈ](#-ν…ŒμŠ€νŠΈ) +- [μ£Όμš” μ—”λ“œν¬μΈνŠΈ](#-μ£Όμš”-μ—”λ“œν¬μΈνŠΈ) + +## πŸ“– ν”„λ‘œμ νŠΈ κ°œμš” +**Raillo**λŠ” μ½”λ ˆμΌ(KORAIL) 예맀 μ‹œμŠ€ν…œμ„ ν΄λ‘ μ½”λ”©ν•œ κΈ°μ°¨ μ˜ˆμ•½ ν”Œλž«νΌμœΌλ‘œ, +μ‹€μ œ μ„œλΉ„μŠ€μ˜ 핡심 κΈ°λŠ₯듀을 μ΅œλŒ€ν•œ μœ μ‚¬ν•˜κ²Œ κ΅¬ν˜„ν•˜μ—¬ ν˜„μ—…μ—μ„œ μ‚¬μš©λ˜λŠ” 기술 μŠ€νƒκ³Ό 섀계 νŒ¨ν„΄μ„ ν•™μŠ΅ν•˜κ³  μ μš©ν•œ ν”„λ‘œμ νŠΈμž…λ‹ˆλ‹€. + +### πŸ“… μ§„ν–‰ κΈ°κ°„ +- 1μ°¨ (기획 및 개발) : 2025. 05. 28. ~ 2025. 07. 01. +- 2μ°¨ (ν΄λΌμ΄μ–ΈνŠΈ μš”κ΅¬μ‚¬ν•­ 반영) : 2025. 07. 02. ~ 2025. 07. 15. +- 3μ°¨ (카카였 API 톡합) : 2025. 07. 16. ~ 2025. 08. 08. +- 지속 κ°œμ„  : 2025. 08. 09. ~ endless + +### 🎯 핡심 λͺ©ν‘œ +- **μ‹€μ œ μ„œλΉ„μŠ€μ™€ μœ μ‚¬ν•œ 핡심 κΈ°λŠ₯ κ΅¬ν˜„** : μ‹€μ œ μ½”λ ˆμΌμ—μ„œ μ œκ³΅ν•˜λŠ” νšŒμ› 인증 및 μ£Όμš” 예맀 흐름을 μ΅œλŒ€ν•œ λΉ„μŠ·ν•˜κ²Œ κ΅¬ν˜„ +- **ν™œλ°œν•œ ν˜‘μ—…κ³Ό μ—­ν•  λΆ„λ‹΄ κ²½ν—˜** : νŒ€ λ‚΄λΆ€μ—μ„œ 역할을 λΆ„λ‹΄, ν˜‘μ—…νˆ΄μ„ μ΄μš©ν•œ 버전관리, 이슈 νŠΈλž˜ν‚Ή, μ½”λ“œ 리뷰 λ“± ν˜‘μ—… 방식을 적용 +- **μ‹€λ¬΄μ—μ„œ μ‚¬μš©λ˜λŠ” 기술 μŠ€νƒ ν•™μŠ΅ 및 κ²½ν—˜** : μ‹€λ¬΄μ—μ„œ μ‚¬μš©λ˜λŠ” λ‹€μ–‘ν•œ 기술 μŠ€νƒμ„ ν•™μŠ΅, κ²½ν—˜ν•˜κ³  κ΄€λ ¨ νŒ¨ν„΄μ„ 적용 + +## πŸ”§ 기술 μŠ€νƒ +### Backend +[![backend](https://skillicons.dev/icons?i=java,spring,redis,mysql,gradle)](https://skillicons.dev) +- **Language** : Java +- **Framework** : Spring Boot, Spring Security, Spring Batch +- **ORM** : Spring Data JPA, QueryDSL +- **DB** : MySQL (Production), H2 (Test) +- **Cache** : Redis +- **Authentication** : JWT +- **File Processing** : Apache POI +- **Build Tool** : Gradle + +### Infrastructure & DevOps +[![infra,devops](https://skillicons.dev/icons?i=git,github,docker,kubernetes,aws,prometheus,grafana,githubactions)](https://skillicons.dev) +- **Cloud Platform** : AWS (EKS, RDS, Route53, Load Balancer) +- **Container** : Docker, Kubernetes +- **CI/CD** : GitHub Actions, ArgoCD (GitOps) +- **Monitoring** : Prometheus, Grafana +- **VCS** : Git, GitHub + +### Testing +- **Framework** : JUnit, Spring Boot Test +- **DB** : H2 (in-memory) +- **Cache** : Embedded Redis +- **Test Utils** : AssertJ +- **Performance Testing** : K6 +- **Email Testing** : GreenMail +- **Coverage** : JaCoCo + +## πŸ—οΈ μ•„ν‚€ν…μ²˜ +Raillo-Server-Architecture + +### 도메인 주도 섀계 (DDD) +``` +src/main/java/com/sudo/railo/ +β”œβ”€β”€ auth/ # 인증 도메인 +β”œβ”€β”€ booking/ # μ˜ˆμ•½ 도메인 +β”œβ”€β”€ global/ # 곡톡 κΈ°λŠ₯ +β”œβ”€β”€ member/ # νšŒμ› 도메인 +β”œβ”€β”€ payment/ # 결제 도메인 +└── train/ # μ—΄μ°¨ 도메인 +``` + +## πŸš€ μ£Όμš” νŠΉμ§• +### πŸ”‘ Auth 도메인 +- **JWT 기반 인증 μ‹œμŠ€ν…œ** : Access Tokenκ³Ό Refresh Token을 ν™œμš©ν•œ Stateless 인증 및 인가 +- **이메일 인증** : Redisλ₯Ό ν™œμš©ν•œ 인증 μ½”λ“œ λ°œμ†‘ 및 검증 μ‹œμŠ€ν…œ +- **λ³΄μ•ˆ κ°•ν™”** : λ‘œκ·Έμ•„μ›ƒλœ 토큰 Redis 관리, μΏ ν‚€ 기반 Refresh Token 관리 + +### πŸ‘€ Member 도메인 +- **고유 νšŒμ›λ²ˆν˜Έ μ‹œμŠ€ν…œ** : Redis 기반 일일 증뢄 μΉ΄μš΄ν„°λ₯Ό ν™œμš©ν•œ νšŒμ›λ²ˆν˜Έ μžλ™ 생성 (`yyyyMMddCCCC` ν˜•μ‹) +- **Soft-Delete** : μ‹€μ œ νšŒμ› μ‚­μ œκ°€ μ•„λ‹Œ λΉ„ν™œμ„±ν™” 처리 +- **만료 νšŒμ› 일괄 μ‚­μ œ** : 만료된 νšŒμ› 데이터 정리λ₯Ό μœ„ν•œ Spring Batch ν™œμš© + +### 🎫 Booking 도메인 +- **μž₯λ°”κ΅¬λ‹ˆ μ‹œμŠ€ν…œ** : μ˜ˆμ•½ ν›„ 결제 μ „ μž„μ‹œ μ €μž₯ 및 관리 κΈ°λŠ₯ +- **μ’Œμ„ μ˜ˆμ•½ 관리** : 승객 μœ ν˜•λ³„ μ’Œμ„ λ°°μ • 및 μ˜ˆμ•½ μƒνƒœ 관리 +- **μš”κΈˆ 계산** : 거리별, 승객 μœ ν˜•λ³„, μ°¨λŸ‰ 등급별 μš”κΈˆ μžλ™ 계산 + +### πŸ’΅ Payment 도메인 +- **결제 μˆ˜λ‹¨ ν™•μž₯을 μœ„ν•œ μœ μ—°ν•œ ꡬ쑰** : 절차λ₯Ό λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ μΆ”ν›„ 결제 μˆ˜λ‹¨ ν™•μž₯ μš©μ΄ν•¨ +- **결제 ν‚€ 생성** : κ³ μœ ν•œ 결제 μ‹λ³„μž μžλ™ 생성 +- **결제 검증** : κΈˆμ•‘ 검증 및 쀑볡 결제 λ°©μ§€ +- **μžλ™ ν‹°μΌ“ λ°œκΈ‰** : 결제 μ™„λ£Œ μ‹œ ν‹°μΌ“ 생성 +- **μ·¨μ†Œ 및 ν™˜λΆˆ** : 결제 μ·¨μ†Œ 및 ν™˜λΆˆ 처리 μ‹œμŠ€ν…œ + +### πŸš… Train 도메인 +- **μ‹€μ œ 데이터 ν™œμš©** : μ½”λ ˆμΌμ˜ μ‹€μ œ 운영 μŠ€μΌ€μ€„ Excel νŒŒμΌμ„ νŒŒμ‹±ν•˜μ—¬ 데이터 ꡬ좕 +- **μ—‘μ…€ 데이터 νŒŒμ‹±** : Apache POIλ₯Ό ν™œμš©ν•œ λ³΅μž‘ν•œ μŠ€μΌ€μ€„ 데이터 μžλ™ νŒŒμ‹± +- **μ—΄μ°¨ 검색 μ΅œμ ν™”** : 배치 쿼리λ₯Ό ν™œμš©ν•œ λŒ€μš©λŸ‰ μŠ€μΌ€μ€„ 검색 μ„±λŠ₯ μ΅œμ ν™” +- **μ’Œμ„ ν˜„ν™© 관리** : μ‹€μ‹œκ°„ μ’Œμ„ μ˜ˆμ•½ ν˜„ν™© 및 μ—¬μœ μ„ 정보 제곡 +- **μ—­ κ°„ μš”κΈˆ μ‹œμŠ€ν…œ** : ꡬ간별 μ„ΈλΆ„ν™”λœ μš”κΈˆ 체계 κ΅¬ν˜„ + +## πŸ“Š λͺ¨λ‹ˆν„°λ§ & 운영 +- `GitHub Actions`와 `ArgoCD`λ₯Ό ν™œμš©ν•΄ μ½”λ“œ λ³€κ²½ μ‹œ μžλ™ λΉŒλ“œ, 배포, ν΄λŸ¬μŠ€ν„° 적용 +- `AWS EKS` κΈ°λ°˜μ—μ„œ λͺ¨λ“  κ΅¬μ„±μš”μ†Œλ₯Ό μ»¨ν…Œμ΄λ„ˆλ‘œ 관리 +- `Prometheus`, `Grafana`등을 λ„μž…ν•˜μ—¬ λ…Έλ“œ 별 μ„œλΉ„μŠ€ μƒνƒœ, λ¦¬μ†ŒμŠ€ μ‚¬μš©λŸ‰μ„ μ‹€μ‹œκ°„μœΌλ‘œ μˆ˜μ§‘ 및 κ°€μ‹œν™” +- μ—¬λŸ¬ `Node Group`κ³Ό λΆ„μ‚°λœ λ°±μ—”λ“œ 및 Redis둜 κ΅¬μ„±λ˜μ–΄ κ³ κ°€μš©μ„± 확보 +- `RDS`, `Route53`, `LB` λ“± `AWS μ„œλΉ„μŠ€`λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터 관리와 νŠΈλž˜ν”½ λΆ„μ‚° 및 도메인 운영 지원 + +## πŸ§ͺ ν…ŒμŠ€νŠΈ +### 둜컬 ν…ŒμŠ€νŠΈ ν™˜κ²½ ꡬ좕 +- λ‘œμ»¬μ—μ„œ μš΄μ˜ν™˜κ²½κ³Ό λΉ„μŠ·ν•œ ν™˜κ²½ ꡬ좕 ν›„ 슀트레슀 ν…ŒμŠ€νŠΈ μ§„ν–‰ +- Spring Boot, LB, Redis, Prometheus, Grafana, AWS RDS 이용 + +### K6λ₯Ό μ΄μš©ν•œ λΆ€ν•˜ ν…ŒμŠ€νŠΈ +- K6둜 API 호좜 -> λ‘œλ“œλ°ΈλŸ°μ„œ -> Spring Boot Application -> DB +- λΆ€ν•˜ ν…ŒμŠ€νŠΈ λͺ©ν‘œ μ„€μ • (예: Target TPS 500, Avg Latency 800ms μ΄ν•˜) +- λΆ€ν•˜ ν…ŒμŠ€νŠΈ μ§„ν–‰ ν›„ 병λͺ© 지점 νŒŒμ•…, μ„±λŠ₯ κ°œμ„  +- κ°œμ„ ν•œ μ‹œμŠ€ν…œμ΄ μ–΄λŠ 정도 νŠΈλž˜ν”½κΉŒμ§€λ₯Ό κ²¬λ”œ 수 μžˆλŠ”μ§€ ν…ŒμŠ€νŠΈ κ³Όμ • 반볡 + +## πŸ“Œ μ£Όμš” μ—”λ“œν¬μΈνŠΈ +```http +# Auth +POST /auth/signup +POST /auth/login +POST /auth/logout +POST /auth/emails/verify +POST /auth/reissue + +# Booking +GET /api/v1/booking/reservation +GET /api/v1/booking/reservation/{reservationId} +POST /api/v1/booking/reservation +DELETE /api/v1/booking/reservation +GET /api/v1/booking/ticket + +# Member +DELETE /api/v1/members +GET /api/v1/members/me +PUT /api/v1/members/password + +# Payment +GET /api/v1/payments +POST /api/v1/payments/{paymentKey}/cancel +POST /api/v1/payments/bank-account +POST /api/v1/payments/card + +# Train +GET /api/v1/trains/calendar +POST /api/v1/trains/cars +POST /api/v1/trains/search +POST /api/v1/trains/seats +```