|
|
|
|
| κΉλ―Όμ | μ μ§λ―Ό | μ΄μ°¬μ |
- νλ‘μ νΈ κ°μ
- κΈ°μ μ€ν
- μ μ νλ‘μ°
- μν€ν μ²
- μ£Όμ νΉμ§
- λͺ¨λν°λ§ & μ΄μ
- ν μ€νΈ
- AI μ½λ© μμ΄μ νΈ κ°μ΄λ
Railloλ μ½λ μΌ(KORAIL) μλ§€ μμ€ν
μ ν΄λ‘ μ½λ©ν κΈ°μ°¨ μμ½ νλ«νΌμΌλ‘,
μ€μ μλΉμ€μ ν΅μ¬ κΈ°λ₯λ€μ μ΅λν μ μ¬νκ² κ΅¬ννμ¬ νμ
μμ μ¬μ©λλ κΈ°μ μ€νκ³Ό μ€κ³ ν¨ν΄μ νμ΅νκ³ μ μ©ν νλ‘μ νΈμ
λλ€.
-
-
-
- ~ now
-
-
- μ€μ μλΉμ€μ μ μ¬ν ν΅μ¬ κΈ°λ₯ ꡬν : μ€μ μ½λ μΌμμ μ 곡νλ νμ μΈμ¦ λ° μ£Όμ μλ§€ νλ¦μ μ΅λν λΉμ·νκ² κ΅¬ν
- νλ°ν νμ κ³Ό μν λΆλ΄ κ²½ν : ν λ΄λΆμμ μν μ λΆλ΄, νμ ν΄μ μ΄μ©ν λ²μ κ΄λ¦¬, μ΄μ νΈλνΉ, μ½λ 리뷰 λ± νμ λ°©μμ μ μ©
- μ€λ¬΄μμ μ¬μ©λλ κΈ°μ μ€ν νμ΅ λ° κ²½ν : μ€λ¬΄μμ μ¬μ©λλ λ€μν κΈ°μ μ€νμ νμ΅, κ²½ννκ³ κ΄λ ¨ ν¨ν΄μ μ μ©
- Language : Java 25
- Framework : Spring Boot 4.1, Spring Security, Spring Batch
- ORM : Spring Data JPA, QueryDSL
- DB : MySQL 8.4
- Cache / μ’μ μ μ : Valkey 9 (Redis νΈν)
- Authentication : JWT
- Payment : Toss Payments
- Build Tool : Gradle (λ©ν° λͺ¨λ)
- Cloud Platform : Oracle Cloud (OKE), AWS
- Container : Docker, Kubernetes
- CI/CD : ArgoCD, GitHub Actions, GHCR
- Monitoring : Prometheus, Grafana
- VCS : Git, GitHub
- Framework : JUnit 5, Spring Boot Test
- Test Environment : Testcontainers (MySQL 8.4.10, Valkey 9) β μ΄μκ³Ό λμΌ λ²μ , Docker νμ
- Test Utils : AssertJ, ArchUnit
- Performance Testing : K6
- Email Testing : GreenMail
raillo-domain β raillo-api
β raillo-batch
raillo-domain: Entity, VO, λλ©μΈ κ·μΉ, Redis ν€ κ³μ½μ λ¨μΌ μλ³Έraillo-api: REST API. κ²°μ λλ©μΈμ ν₯μ¬κ³ λ ꡬ쑰(port, adapter)raillo-batch: μκ°ν νμ±, μ΄ν μμ±, μ΄μ°¨ μΊμ μ μ¬, νμ μ 리λ₯Ό νλ Spring Batch μ±
Controller β Facade β Service β Repository
- Facade : μ¬λ¬ Serviceλ₯Ό μ‘°ν©νλ μ§μ μ . Facade β Facade νΈμΆμ κΈμ§
- Service : λΉμ¦λμ€ λ‘μ§κ³Ό νΈλμμ κ²½κ³. Service β Service νΈμΆμ κΈμ§
- Validator / Calculator / Generator : κ²μ¦, κ³μ°, μλ³μ μμ± λ± μ± μμ΄ λΆλ¦¬λ 보쑰 μ»΄ν¬λνΈ
- JWT κΈ°λ° μΈμ¦ μμ€ν : Access Tokenκ³Ό Refresh Tokenμ νμ©ν Stateless μΈμ¦ λ° μΈκ°
- μ΄λ©μΌ μΈμ¦ : Redisλ₯Ό νμ©ν μΈμ¦ μ½λ λ°μ‘ λ° κ²μ¦
- 보μ κ°ν : λ‘κ·Έμμλ ν ν° Redis κ΄λ¦¬, μΏ ν€ κΈ°λ° Refresh Token κ΄λ¦¬
- κ³ μ νμλ²νΈ μμ€ν
: Redis κΈ°λ° μΌμΌ μ¦λΆ μΉ΄μ΄ν°λ₯Ό νμ©ν νμλ²νΈ μλ μμ± (
yyyyMMddCCCCνμ) - Soft-Delete : μ€μ νμ μμ κ° μλ λΉνμ±ν μ²λ¦¬
- λ§λ£ νμ μΌκ΄ μμ : νν΄ ν 3λ μ΄ μ§λ νμμ Batchλ‘ μꡬ μμ
- μ€μ λ°μ΄ν° νμ© : μ½λ μΌμ μ€μ μ΄μ μκ°νμ μ΄μν Excelμ νμ±ν΄ λ°μ΄ν° ꡬμΆ
- μμΌ ν νλ¦Ώ κΈ°λ° μ΄ν μμ± : μκ°ν ν νλ¦ΏμΌλ‘ λ μ§λ³ μ΄νμ λ§€μΌ Batchλ‘ μμ±
- κ΅¬κ° λ¨μ μμ¬μ κ³μ° : μ μ°¨ μμ ꡬκ°μΌλ‘ κ²ΉμΉ¨μ νλ¨ν΄, κ°μ μ’μμ κ²ΉμΉμ§ μλ ꡬκ°μ λλ νλ§€
- μ΄μ°¨ μΊμ : μμ½ μμ±μ νμν μ΄μ°¨, μ΄ν μ 보λ₯Ό Batchκ° Redisμ μ μ¬ν΄ μμ½ μ DBλ₯Ό μ½μ§ μμ
- μ΄ν μΊλ¦°λ μΊμ± : ν루 λμ κ°μ μλ΅μ μΊμνκ³ μμ μ κ°±μ
- Redis Lua κΈ°λ° μ’μ μ μ : μ’μ κ΅¬κ° μΆ©λ κ²μ¬μ μ μ λ₯Ό Lua μ€ν¬λ¦½νΈλ‘ μμμ μΌλ‘ μ²λ¦¬ν΄ λμ μμ½ λ°©μ§
- κ°μ°¨λ³ Hash κ΅¬κ° μ μ : κ°μ°¨λ§λ€ Hash νλμ
{μ’μ}:{ꡬκ°}fieldλ‘ μ μ λ₯Ό κΈ°λ‘ - TTL κΈ°λ° μλ λ§λ£ : κ²°μ νμ§ μμ μμ½μ μ’μ μ μ λ field λ¨μ λ§λ£(
HEXPIRE)λ‘ μλ ν΄μ - μλ§€ νμ : κ²°μ κ° λλλ©΄ μλ§€μ μΉμ°¨κΆμ λ§λ€κ³ , μ’μ μ μ λ₯Ό μμ½μμ μλ§€λ‘ μ ν
- μ£Όλ¬Έ λ¨μ κ²°μ : μ¬λ¬ μμ½μ νλμ μ£Όλ¬ΈμΌλ‘ λ¬Άμ΄ ν λ²μ κ²°μ
- μμ½ μ€λ μ· : μ£Όλ¬Έ μμ μ μμ½μ μ μ₯ν΄, Redis μμ½μ΄ λ§λ£λ λ€μλ κ²°μ λ₯Ό νμ
- Toss Payments μ°λ : Toss κ²°μ μ°½κ³Ό μΉμΈ APIλ‘ κ²°μ μ²λ¦¬
- λ©±λ±ν μΉμΈ :
paymentKeyμμ κ³μ°ν μλ IDμ μ λν¬ μ μ½μΌλ‘ κ°μ μΉμΈ μμ²μ μ€λ³΅ μ²λ¦¬ λ°©μ§ - κ²°κ³Ό λΆλͺ λμ : νμμμ, Toss 5xxλ μ€ν¨λ‘ λ¨μ νμ§ μκ³ , μ¬μμ² μ Toss μ‘°νλ‘ μνλ₯Ό λ§μΆ° μ΄μ€ μ²κ΅¬ λ°©μ§
- νΈλμμ λΆλ¦¬ : μΉμΈ μμ, Toss νΈμΆ, μΉμΈ νμ μ λλ μ₯μ μμ κ³Ό κ΄κ³μμ΄ λ³΅κ΅¬ κ°λ₯ν κΈ°λ‘μ λ¨κΉ
- Outbox : DB μ»€λ° λ€ Redis μ’μ μ μ μ νμ Workerκ° λΉλκΈ°λ‘ μ¬μλνλ©° μ²λ¦¬
- Oracle Cloud OKE(Kubernetes)μ API, Batch CronJob, MySQL, Valkey, λͺ¨λν°λ§μ μ΄μ
developμ λ¨Έμ§λλ©΄ GitHub Actionsκ° ν μ€νΈ, ARM64 μ΄λ―Έμ§ λΉλ, μ»€λ° SHA νκ·Έ λ°°ν¬κΉμ§ μνreadinessProbeκΈ°λ° Rolling Updateλ‘ λ¬΄μ€λ¨ λ°°ν¬- μ΄μ DBλ bastionμ ν΅ν SSH ν°λλ‘λ§ μ μ
- Spring Boot Actuator + Micrometer β Prometheus β Grafana κΈ°λ° λ©νΈλ¦ νμ΄νλΌμΈ
- Node, JVM, HTTP μμ², MySQL, Valkey λ©νΈλ¦μ μμ§νκ³ μκ°ν
- μμ½, μ’μ μΆ©λ, κ²°μ , Outbox λ± λΉμ¦λμ€ λ©νΈλ¦μ Micrometerλ‘ μμ§. μμ½κ³Ό κ²°μ λ AOPλ‘ κ³μΈ‘ν΄ λΉμ¦λμ€ λ‘μ§μ 건λλ¦¬μ§ μμ
- λλ©μΈ λ¨μ ν μ€νΈ : Entity, VOμ ν΅μ¬ κ·μΉμ λΉ λ₯΄κ² κ²μ¦
- μλΉμ€ ν΅ν© ν
μ€νΈ :
@ServiceTestκΈ°λ°μΌλ‘ Testcontainers MySQL/Valkeyλ₯Ό μ¬μ©ν΄ μ΄μκ³Ό λμΌν μμ§μμ κ²μ¦ - λμμ± ν μ€νΈ : μ’μ μ μ , κ²°μ μΉμΈμ²λΌ μΆ©λ κ°λ₯μ±μ΄ λμ νλ¦μ λ³λ μλ리μ€λ‘ κ²μ¦
- μν€ν μ² ν μ€νΈ : ArchUnitμΌλ‘ κ²°μ λλ©μΈμ ν₯μ¬κ³ λ μμ‘΄ λ°©ν₯μ κ°μ
- BDD μ€νμΌ :
given / when / thenμ£Όμκ³Ό νκ΅μ΄@DisplayNameμΌλ‘ ν μ€νΈ μλλ₯Ό νν
μ΄μ νκ²½κ³Ό μ μ¬ν μ€νμ Docker Composeλ‘ λμ λ°λ³΅ κ°λ₯ν λΆν ν μ€νΈ νκ²½μ ꡬμΆ
- Spring Boot (CPU/λ©λͺ¨λ¦¬ μ νμΌλ‘ μ΄μ Pod μ€ν λͺ¨μ¬)
- MySQL, Valkey + redis-exporter
- WireMock : Toss Payments μΈλΆ API λͺ¨νΉ β κ²°μ νλ¦κΉμ§ μ 체 λΆν ν μ€νΈ
- Prometheus + Grafana : λ©νΈλ¦ μ€μκ° μμ§, μκ°ν (
qa/grafana/dashboards)
Claude Code, Codex λ± AI μ½λ© μμ΄μ νΈκ° κ°μ 컨벀μ
μΌλ‘ μμ
νλλ‘ λ¬Έμμ μ€ν¬μ μ μ₯μμ ν¨κ» λλ€. μμμ μ AGENTS.mdμ΄λ©° CLAUDE.mdλ κ·Έ μ¬λ³Όλ¦ λ§ν¬λ€.
| μμΉ | λ΄μ© |
|---|---|
AGENTS.md |
λ¬Έμ μ§λ, λͺ¨λ ꡬ쑰, λΉλ λͺ λ Ή, μμ νλ¦ |
docs/ |
λλ©μΈλ³ λ¬Έμ. λλ©μΈ μ€λͺ , μ©μ΄, λͺ¨λΈ, μ€κ³ κ²°μ |
.agents/rules/ |
μ½λ 컨벀μ , ν μ€νΈ κ·μΉ, λ¬Έμ κ·μΉ |
.agents/skills/ |
ν μμ
νλ¦μ μ½λνν μ€ν¬. .claude/skillsλ μ΄λ₯Ό κ°λ¦¬ν€λ μ¬λ³Όλ¦ λ§ν¬ |
.claude/hooks/ |
μμ΄μ νΈκ° μ΄μ ν΄λ¬μ€ν°μ DBλ₯Ό μ‘°νλ§ νλλ‘ λ§λ κ°λ ν . μμΈλ μΈνλΌ λ¬Έμ |
.githooks/ |
λ―Όκ°ν κ° pre-commit ν
. ν΄λ‘ ν brew install gitleaks && git config core.hooksPath .githooksλ‘ μΌ λ€. μμΈλ μΈνλΌ λ¬Έμ |
/issue β /branch β /implement [ ꡬν β /test β /commit ] Γ n β /review β /docs β /tidy-commits β /pr
| Skill | μ©λ |
|---|---|
/issue |
ν νμμΌλ‘ μ΄μλ₯Ό μ°κ³ μΉμΈ ν μμ± |
/branch |
μ΄μ λ²νΈ κΈ°λ° λΈλμΉλ₯Ό μ격 μ΅μ κΈ°μ€μΌλ‘ λΆκΈ° |
/implement |
μ΄μλ₯Ό μ»€λ° λ¨μ λ¨κ³λ‘ λλ λ¨κ³λ§λ€ κ²ν ν μ»€λ° |
/test |
κ·μΉμ λ§λ ν μ€νΈ μμ±κ³Ό μ€ν |
/commit |
type: μ€λͺ
(#N) νμμΌλ‘ μ»€λ° |
/review |
λν λ§₯λ½μ΄ μλ μλΈμμ΄μ νΈκ° 컨벀μ , μ νμ±, ν μ€νΈ κ΄μ μΌλ‘ 리뷰 |
/docs |
λ¬Έμλ₯Ό μ½λμ λμ‘°ν΄ μΈμ λ§₯λ½, μ€λ³΅μ κ±·μ΄λ΄κ³ κ°κ²°νκ² μ μ§ |
/tidy-commits |
PR μ μ μμ 컀λ°μ ν©μΉκ³ λ©μμ§ μ 리 |
/pr |
μ΄μ κΈ°μ€μΌλ‘ PRμ μ°κ³ μΉμΈ ν μμ± |
/db-reset |
ν μ€νΈ DBμμ μ΄μ°¨, νμ λ°μ΄ν°λ§ λ¨κΈ°κ³ ν μ΄λΈ μ΄κΈ°ν |