|
|
|
|
| ๊น๋ฏผ์ | ์ ์ง๋ฏผ | ์ด์ฐฌ์ |
- ํ๋ก์ ํธ ๊ฐ์
- ๊ธฐ์ ์คํ
- ์ ์ ํ๋ก์ฐ
- ์ํคํ ์ฒ
- ์ฃผ์ ๊ธฐ๋ฅ
- ๋ชจ๋ํฐ๋ง & ์ด์
- ํ ์คํธ
- AI ์ฝ๋ฉ ์์ด์ ํธ ๊ฐ์ด๋
Raillo๋ ์ฝ๋ ์ผ(KORAIL) ์๋งค ์์คํ
์ ํด๋ก ์ฝ๋ฉํ ๊ธฐ์ฐจ ์์ฝ ํ๋ซํผ์ผ๋ก,
์ค์ ์๋น์ค์ ํต์ฌ ๊ธฐ๋ฅ๋ค์ ์ต๋ํ ์ ์ฌํ๊ฒ ๊ตฌํํ์ฌ ํ์
์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์คํ๊ณผ ์ค๊ณ ํจํด์ ํ์ตํ๊ณ ์ ์ฉํ ํ๋ก์ ํธ์
๋๋ค.
- v1 : 2025. 05. 28. ~ 2025. 08. 08.
- v2 : 2025. 10. 11. ~ now
- ์ค์ ์๋น์ค์ ์ ์ฌํ ํต์ฌ ๊ธฐ๋ฅ ๊ตฌํ : ์ค์ ์ฝ๋ ์ผ์์ ์ ๊ณตํ๋ ํ์ ์ธ์ฆ ๋ฐ ์ฃผ์ ์๋งค ํ๋ฆ์ ์ต๋ํ ๋น์ทํ๊ฒ ๊ตฌํ
- ํ๋ฐํ ํ์ ๊ณผ ์ญํ ๋ถ๋ด ๊ฒฝํ : ํ ๋ด๋ถ์์ ์ญํ ์ ๋ถ๋ด, ํ์ ํด์ ์ด์ฉํ ๋ฒ์ ๊ด๋ฆฌ, ์ด์ ํธ๋ํน, ์ฝ๋ ๋ฆฌ๋ทฐ ๋ฑ ํ์ ๋ฐฉ์์ ์ ์ฉ
- ์ค๋ฌด์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์คํ ํ์ต ๋ฐ ๊ฒฝํ : ์ค๋ฌด์์ ์ฌ์ฉ๋๋ ๋ค์ํ ๊ธฐ์ ์คํ์ ํ์ต, ๊ฒฝํํ๊ณ ๊ด๋ จ ํจํด์ ์ ์ฉ
- Language : Java
- Framework : Spring Boot, Spring Security
- ORM : Spring Data JPA, QueryDSL
- DB : MySQL
- Cache : Redis
- Authentication : JWT
- Build Tool : Gradle
- Cloud Platform : AWS (EKS, RDS, Route53, Load Balancer)
- Container : Docker, Kubernetes
- CI/CD : GitHub Actions, ArgoCD (GitOps)
- Monitoring : Prometheus, Grafana
- VCS : Git, GitHub
- Framework : JUnit, Spring Boot Test
- Test Environment : Testcontainers (MySQL 8.4.10, Redis 7.4) โ ์ด์๊ณผ ๋์ผ ๋ฒ์ , Docker ํ์
- Test Utils : AssertJ
- Performance Testing : K6
- Email Testing : GreenMail
src/main/java/com/sudo/raillo/
โโโ auth/ # ์ธ์ฆ
โโโ booking/ # ์์ฝยท์๋งค
โโโ member/ # ํ์
โโโ order/ # ์ฃผ๋ฌธ
โโโ payment/ # ๊ฒฐ์
โโโ train/ # ์ด์ฐจ
โโโ global/ # ๊ณตํต ์ธํ๋ผ
Controller โ Facade โ Service โ Repository
- Facade : ๋๋ฉ์ธ ๋จ์ผ ์ง์ ์ ์ผ๋ก ์ฌ๋ฌ Service๋ฅผ ์กฐํฉํ๋ฉฐ, Facade โ Facade ํธ์ถ์ ๊ธ์ง
- Service : ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์ ๊ฒฝ๊ณ ๋ด๋น
- Validator / Calculator / Generator : ๊ฒ์ฆ, ๊ณ์ฐ, ์๋ณ์ ์์ฑ ๋ฑ ์ฑ ์์ด ๋ถ๋ฆฌ๋ ๋ณด์กฐ ์ปดํฌ๋ํธ
- JWT ๊ธฐ๋ฐ ์ธ์ฆ ์์คํ : Access Token๊ณผ Refresh Token์ ํ์ฉํ Stateless ์ธ์ฆ ๋ฐ ์ธ๊ฐ
- ์ด๋ฉ์ผ ์ธ์ฆ : Redis๋ฅผ ํ์ฉํ ์ธ์ฆ ์ฝ๋ ๋ฐ์ก ๋ฐ ๊ฒ์ฆ ์์คํ
- ๋ณด์ ๊ฐํ : ๋ก๊ทธ์์๋ ํ ํฐ Redis ๊ด๋ฆฌ, ์ฟ ํค ๊ธฐ๋ฐ Refresh Token ๊ด๋ฆฌ
- ๊ณ ์ ํ์๋ฒํธ ์์คํ
: Redis ๊ธฐ๋ฐ ์ผ์ผ ์ฆ๋ถ ์นด์ดํฐ๋ฅผ ํ์ฉํ ํ์๋ฒํธ ์๋ ์์ฑ (
yyyyMMddCCCCํ์) - Soft-Delete : ์ค์ ํ์ ์ญ์ ๊ฐ ์๋ ๋นํ์ฑํ ์ฒ๋ฆฌ
- ๋ง๋ฃ ํ์ ์ผ๊ด ์ญ์ : ๋ง๋ฃ๋ ํ์ ๋ฐ์ดํฐ ์ ๋ฆฌ๋ฅผ ์ํ ๋ฐฐ์น ์ฒ๋ฆฌ ํ์ฉ
- ์ฅ๋ฐ๊ตฌ๋ ์์คํ : ์์ฝ ํ ๊ฒฐ์ ์ ์์ ์ ์ฅ ๋ฐ ๊ด๋ฆฌ ๊ธฐ๋ฅ
- ์ข์ ์์ฝ ๊ด๋ฆฌ: ์น๊ฐ ์ ํ๋ณ ์ข์ ๋ฐฐ์ ๋ฐ ์์ฝ ์ํ ๊ด๋ฆฌ
- ์๊ธ ๊ณ์ฐ: ๊ฑฐ๋ฆฌ๋ณ, ์น๊ฐ ์ ํ๋ณ, ์ฐจ๋ ๋ฑ๊ธ๋ณ ์๊ธ ์๋ ๊ณ์ฐ
- Redis Lua ์คํฌ๋ฆฝํธ ๊ธฐ๋ฐ ์ข์ ์ ์ : ์ข์ ๊ตฌ๊ฐ ์ถฉ๋ ๊ฒ์ฌ์ ์์ ์ข์ ์ ์ ๋ฅผ Lua ์คํฌ๋ฆฝํธ๋ก ์์์ ์ฒ๋ฆฌํ์ฌ ๋์ ์์ฝ ๋ฐฉ์ง
- ์ข์ ์ ์ ์ธ๋ฑ์ค ์ต์ ํ: ์ข์๋ณ, ๊ฐ์ฐจ๋ณ ๋ค์ค ์ธ๋ฑ์ค ๊ตฌ์กฐ๋ก ์ข์ ์กฐํ ์ฑ๋ฅ๊ณผ ์ ํ์ฑ ํ๋ณด
- TTL ๊ธฐ๋ฐ ์๋ ๋ง๋ฃ: ์ผ์ ์๊ฐ ๋ด ๊ฒฐ์ ํ์ง ์์ ์์ ์์ฝ๊ณผ ์ข์ ์ ์ ๋ ์๋์ผ๋ก ํด์ ๋์ด ์ข์์ ์๋งค ๊ฐ๋ฅ ์ํ๋ก ์ ํ
- ์ฃผ๋ฌธ ํตํฉ ๊ด๋ฆฌ: ์์ฝ๊ณผ ๊ฒฐ์ ๋ฅผ ์ฐ๊ฒฐํ๋ ์ฃผ๋ฌธ ๋จ์ ๊ด๋ฆฌ
- ์ฃผ๋ฌธ ์ํ ๋ผ์ดํ์ฌ์ดํด ๊ด๋ฆฌ: ๊ฒฐ์ ๋๊ธฐ โ ๊ฒฐ์ ์๋ฃ โ ์ทจ์๊น์ง์ ์ฃผ๋ฌธ ์ํ ํ๋ฆ์ ๋๋ฉ์ธ ๋จ์์ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌ
- ๊ฒฐ์ ํ๋ฆ ์ผ๊ด์ฑ ๋ณด์ฅ: ์ฃผ๋ฌธ ๋จ๊ณ๋ณ ์ํ ๊ฒ์ฆ์ผ๋ก ์ค๋ณต ๊ฒฐ์ ์ ์๋ชป๋ ์ํ ์ ์ด ์ฐจ๋จ
- Toss Payments ๊ธฐ๋ฐ ๊ฒฐ์ ์ฐ๋: Toss Payments์ ๊ฒฐ์ UI๋ฅผ ํตํด ๊ฒฐ์ ํ๋ก์ฐ๋ฅผ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌ
- ๊ฒฐ์ ํค ์์ฑ: ๊ณ ์ ํ ๊ฒฐ์ ์๋ณ์ ์๋ ์์ฑ
- ๊ธ์ก ๋ค์ค ๊ฒ์ฆ ๋ฐ ์ค๋ณต๊ฒฐ์ ๋ฐฉ์ง: ๊ฒฐ์ ๋จ๊ณ๋ณ ๊ธ์ก์ ๋น๊ต ๊ฒ์ฆํ๊ณ , ์ด๋ฏธ ์ฒ๋ฆฌ๋ ์ฃผ๋ฌธ์ ๋ํ ์ฌ๊ฒฐ์ ์๋ ์ฐจ๋จ
- ์๋ ํฐ์ผ ๋ฐ๊ธ: ๊ฒฐ์ ์๋ฃ ์ ํฐ์ผ ์์ฑ
- ์ทจ์ ๋ฐ ํ๋ถ: ๊ฒฐ์ ์ทจ์ ๋ฐ ํ๋ถ ์ฒ๋ฆฌ ์์คํ
- ์ค์ ๋ฐ์ดํฐ ํ์ฉ: ์ฝ๋ ์ผ์ ์ค์ ์ด์ ์ค์ผ์ค Excel ํ์ผ์ ํ์ฑํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์ถ
- ์ด์ฐจ ๊ฒ์ ์ต์ ํ: ๋ฐฐ์น ์ฟผ๋ฆฌ๋ฅผ ํ์ฉํ ๋์ฉ๋ ์ค์ผ์ค ๊ฒ์ ์ฑ๋ฅ ์ต์ ํ
- ์ดํ ์บ๋ฆฐ๋ ์บ์ฑ: Redis ์บ์๋ก ๋ฐ๋ณต ์กฐํ๋๋ ์ดํ ์บ๋ฆฐ๋ ์๋ต ์ต์ ํ
- ์ข์ ํํฉ ๊ด๋ฆฌ: ์ค์๊ฐ ์ข์ ์์ฝ ํํฉ ๋ฐ ์ฌ์ ์ ์ ๋ณด ์ ๊ณต
- ์ญ ๊ฐ ์๊ธ ์์คํ : ๊ตฌ๊ฐ๋ณ ์ธ๋ถํ๋ ์๊ธ ์ฒด๊ณ ๊ตฌํ
- GitHub Actions์ ArgoCD๋ฅผ ํ์ฉํด GitOps ๊ธฐ๋ฐ CI/CD ํ๊ฒฝ ๊ตฌ์ฑ
- Public / Private ์๋ธ๋ท์ ๋ถ๋ฆฌํ๊ณ , ALB๋ฅผ ํตํด์๋ง ๋ด๋ถ ์๋น์ค์ ์ ๊ทผํ๋๋ก ๋คํธ์ํฌ ๊ตฌ์ฑ
topologySpreadConstraints๊ธฐ๋ฐ Pod ๋ถ์ฐ ๋ฐฐ์น์ ๋ค์ค Replica ์ด์์ ํตํด ๊ณ ๊ฐ์ฉ์ฑ์ ํ๋ณดํ๊ณ ,readinessProbe๊ธฐ๋ฐ Rolling Update๋ก ๋ฌด์ค๋จ ๋ฐฐํฌ ๊ตฌ์ฑ- Spring Boot ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ Redis๋ Kubernetes(EKS) ๊ธฐ๋ฐ์ผ๋ก ์ด์ํ๊ณ , DB๋ AWS ๊ด๋ฆฌํ ์๋น์ค(RDS)๋ก ๊ตฌ์ฑ
- Spring Boot Actuator + Micrometer โ Prometheus โ Grafana ๊ธฐ๋ฐ ๋ฉํธ๋ฆญ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
- NodeยทJVMยทHTTP ์์ฒญยท์ ํ๋ฆฌ์ผ์ด์ ๋ฉํธ๋ฆญ์ ์ค์๊ฐ ์์ง ๋ฐ ์๊ฐํ
- ์๋งค, ์ข์ ์ถฉ๋, ๊ฒฐ์ ํ๋ฆ ๋ฑ ๋น์ฆ๋์ค ๋๋ฉ์ธ ๊ธฐ๋ฐ ์ปค์คํ ๋ฉํธ๋ฆญ์ ์ค๊ณํ๊ณ Grafana ๋์๋ณด๋๋ก ์๊ฐํ
- AOP ๊ธฐ๋ฐ ๊ณ์ธก์ ์ ์ฉํด ๋น์ฆ๋์ค ๋ก์ง ์์ ์์ด ๋ฉํธ๋ฆญ ์์ง
- ๋๋ฉ์ธ ๋จ์ ํ ์คํธ : Entity, VO, Calculator, Validator์ ํต์ฌ ๊ท์น์ ๋น ๋ฅด๊ฒ ๊ฒ์ฆ
- ์๋น์ค ํตํฉ ํ
์คํธ :
@ServiceTest๊ธฐ๋ฐ์ผ๋ก Testcontainers MySQL/Redis๋ฅผ ์ฌ์ฉํด ์ด์๊ณผ ๋์ผํ ์์ง์์ DB/Redis ์ฐ๋ ํ๋ฆ ๊ฒ์ฆ - ๋์์ฑ ํ ์คํธ : ์ข์ ์ ์ , ์ค๋ณต ์๋งค, ๊ฒฐ์ ์น์ธ์ฒ๋ผ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ํ๋ฆ์ ๋ณ๋ ์๋๋ฆฌ์ค๋ก ๊ฒ์ฆ
- ํ ์คํธ ๋ฐ์ดํฐ ๊ตฌ์ฑ : Fixture์ Test Helper๋ฅผ ๋ถ๋ฆฌํด ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ์ ๋ฐ์ดํฐ ์ค๋น ์ฑ ์์ ๊ตฌ๋ถ
- BDD ์คํ์ผ :
given / when / then์ฃผ์๊ณผ ํ๊ตญ์ด@DisplayName์ผ๋ก ํ ์คํธ ์๋๋ฅผ ๋ช ํํ๊ฒ ํํ
์๋น์ค ํตํฉ ํ ์คํธ์์๋ ๋ฐ๋ณต๋๋ DB ์ ์ฅ ๋ก์ง์ Test Helper๋ก ๋ถ๋ฆฌํด ํ ์คํธ ๋ณธ๋ฌธ์ด ๊ฒ์ฆ ์๋์ ์ง์คํ๋๋ก ๊ตฌ์ฑํ๋ค.
- Fixture : DB ์ ์ฅ ์์ด ์์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ
- Test Helper : DB ์ ์ฅ์ด ํ์ํ ํตํฉ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฑํ ๋ ์ฌ์ฉ
| Helper | ์ญํ |
|---|---|
TrainTestHelper |
ํ ์คํธ์ฉ ์ด์ฐจ, ๊ฐ์ฐจ, ์ข์ ์์ฑ ๋ฐ ์์ฝ ๊ฐ๋ฅํ ์ข์ ์กฐํ |
TrainScheduleTestHelper |
๊ธฐ๋ณธ/์ปค์คํ ์ดํ ์ค์ผ์ค, ์ ์ฐจ์ญ, ์ญ ๊ฐ ์๊ธ ์์ฑ |
BookingTestHelper |
ํ์ ์๋งค, ์ข์ ์๋งค, ํฐ์ผ ๋ฐ๊ธ๊น์ง ํฌํจํ ์๋งค ๋ฐ์ดํฐ ๊ตฌ์ฑ |
OrderTestHelper |
์ฃผ๋ฌธ, OrderBooking, OrderSeatBooking ๋ฐ์ดํฐ ๊ตฌ์ฑ |
์ด์ ํ๊ฒฝ๊ณผ ์ ์ฌํ ์คํ์ Docker Compose๋ก ๋์, ์ธ๋ถ ๋น์ฉยท์ ์ฝ ์์ด ๋ฐ๋ณต ๊ฐ๋ฅํ ๋ถํ ํ ์คํธ ํ๊ฒฝ ๊ตฌ์ถ
- Spring Boot (CPU/๋ฉ๋ชจ๋ฆฌ ์ ํ์ผ๋ก ์ด์ Pod ์คํ ๋ชจ์ฌ)
- Redis + redis-exporter (์ข์ ์ ์ , ์บ์, ๋ฉํธ๋ฆญ ์์ง)
- WireMock : Toss Payments ์ธ๋ถ API ๋ชจํน โ ๊ฒฐ์ ํ๋ฆ๊น์ง ์ ์ฒด ๋ถํ ํ ์คํธ
- Prometheus + Grafana : Spring Boot Actuator / Redis ๋ฉํธ๋ฆญ ์ค์๊ฐ ์์งยท์๊ฐํ (
qa/grafana/dashboards)
ํ์ Claude CodeยทCodex ๋ฑ AI ์ฝ๋ฉ ์์ด์ ํธ๋ฅผ ์ผ๊ด๋ ์ปจ๋ฒค์
์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋ค์ ๋ฌธ์ยท๋๊ตฌ๋ฅผ ํจ๊ป ์ ๊ณตํ๋ค. ์ด๋ค ๋๊ตฌ๋ฅผ ์ฐ๋ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ก ๋จ์ผ ์ปจํ
์คํธ(AGENTS.md)๋ฅผ ๊ณต์ ํ๋ค.
| ๋ฌธ์ | ๋ด์ฉ |
|---|---|
seat-hold-architecture.md |
Redis Lua ๊ธฐ๋ฐ ์ข์ ๋์ ์ ์ ์ํคํ ์ฒ, Hold Index, Train Search ํตํฉ |
seat-conflict-validation.md |
4-Layer ์ข์ ์ถฉ๋ ๋ฐฉ์ด (Lua โ SQL โ Re-validation โ TTL) |
domain-model.md |
์ํฐํฐ ๊ด๊ณ๋, Booking Flow, ํ๊ตญ์ด ๋๋ฉ์ธ ์ฉ์ด |
testing-guide.md |
Helper/Fixture ์ฌ์ฉ ์์ ์ @ServiceTest ์์ธ |
deployment.md |
K8s, ArgoCD, Docker, CI/CD ๋ฐฐํฌ ์์ธ |
ํ ์ปจ๋ฒค์
์ ์ฝ๋ํํ ์ปค์คํ
skill. ์ค์ ํ์ผ์ .agents/skills/์ ๋๊ณ .claude/skills๋ ์ด๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ค โ Claude Code๋ .claude/skills, Codex ๋ฑ์ .agents/skills๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ์ด๋ค ๋๊ตฌ์์๋ ๋์ผํ skill์ ์ฌ์ฉํ๋ค.
| Skill | ์ฉ๋ |
|---|---|
/issue |
ํ Issue ์ปจ๋ฒค์ ์ ๋ง์ถ ์ ๋ชฉยท๋ณธ๋ฌธยท๋ผ๋ฒจ ํ ์คํธ ์์ฑ |
/branch |
์ด์ ๋ฒํธ ๊ธฐ๋ฐ ๋ธ๋์น๋ช ์๋ ์์ฑ |
/commit |
๋ธ๋์น๋ช
์์ ์ด์ ์ถ์ถ ํ ์ปค๋ฐ ๋ฉ์์ง ์์ฑ (Co-Authored-By ๊ธ์ง) |
/pr |
๋ณ๊ฒฝ์ฌํญ ๋ถ์ ํ ํ PR ํ ํ๋ฆฟ์ผ๋ก PR ์์ฑ (์ฌ์ฉ์ ๊ฒ์ ํ ์คํ) |
/test |
๋๋ฉ์ธ/์๋น์ค/Validator ํ
์คํธ ์๋ ์์ฑ (BDD, @DisplayName ํ๊ตญ์ด) |
/validator |
application/validator/{Domain}Validator.java ํด๋์ค/๋ฉ์๋ ์์ฑ |
/api-doc |
Controller ๊ธฐ๋ฐ Swagger {Domain}ControllerDoc ์ธํฐํ์ด์ค ์์ฑ |
ํ์ superpowers ์๋ฆฌ์ฆ๋ฅผ ๊ธฐ๋ณธ ์ํฌํ๋ก์ฐ๋ก ์ฌ์ฉํ๋ค.
superpowers:brainstormingโ ์๊ตฌ์ฌํญ/๋์์ธ ํ์superpowers:writing-plansโ ๊ตฌํ ๊ณํ ์๋ฆฝsuperpowers:test-driven-developmentโ TDD ๊ตฌํ/test <๋์>โ ํ๋ก์ ํธ ์ปจ๋ฒค์ ๊ธฐ๋ฐ ํ ์คํธ ์์ฑsuperpowers:verification-before-completionโ./gradlew test๋ฑ ์ฆ๊ฑฐ ๊ธฐ๋ฐ ๊ฒ์ฆ- ๋ฌธ์ ๋ฐ์ โ ๋ฐ๋ ๋ด์ฉ์ ๊ด๋ จ ๋ฌธ์(
AGENTS.md,README.md,docs/*)์ ๋ฐ์. ๊ธฐ์กด ๋ฌธ์๋ฅผ ์์ ํ๊ฑฐ๋ ํ์ํ๋ฉด ์ ์ ํ ๋ฌธ์๋ฅผ ์ ๊ท ์์ฑํ๊ณ , ๊ฐ์ PR์ ํฌํจํ๋ค /prโ PR ์์ฑ (์ฌ์ฉ์ ๊ฒ์ ํ ์คํ)
- ๋ฒ๊ทธ ๋ฐ์ ์ โ
superpowers:systematic-debugging์ฐ์ - ์ฝ๋๋ฆฌ๋ทฐ ๋ฐ์์ ๋ โ
superpowers:receiving-code-review๋ก ๋งน๋ชฉ์ ์ ์ฉ ๋ฐฉ์ง - ๋ณ๋ ฌ ์์
๊ฐ๋ฅ ์ โ
superpowers:dispatching-parallel-agents