결제하는 순간, 가장 유리한 카드를 알려주는 간편결제 플랫폼
🏆 LG CNS AM Inspire Camp 4기 최종 프로젝트 대상 (1위)
2026.04 – 2026.06 · 8인 팀 · 백엔드 마이크로서비스 13종 + 클라이언트 3종 · AWS EKS
"저희는 결제 직전의 3초를 바꾸고 싶습니다."
여러 장의 카드를 보유하고 있어도 결제 순간 어떤 카드가 가장 유리한지 판단하기는 쉽지 않습니다.
하지만 ErumPay는 결제 데이터를 기반으로 카드 혜택과 실적 조건을 분석하여 최적의 결제 방식을 추천합니다.
ErumPay는 결제 시점의 데이터를 실시간 분석해 최적의 카드 조합을 자동 추천하고, 분할결제·더치페이·원격결제로 혜택을 놓치는 순간 자체를 없애는 금융 결제 플랫폼입니다. 앱 → PG → 카드사로 이어지는 실제 결제 흐름을 카드사 단계(시뮬레이터)까지 직접 구현했습니다.
|
결제 요청 시 가맹점 MCC · 결제 금액 · 보유 카드 혜택 · 전월 실적을 분석해 4가지 전략(혜택 단일 / 혜택 분할 / 실적 단일 / 실적 분할)의 최적 조합을 계산합니다. 금액 계산은 룰 기반 추천 엔진이 수행하고, AI(OpenAI API)는 사용자의 소비 패턴 요약을 바탕으로 4가지 전략 중 대표 추천 1개를 고르는 Selector로만 활용합니다. |
하나의 결제 금액을 여러 카드에 나눠 카드별 혜택 한도·실적 조건을 최대로 활용합니다(할부 아님). PG가 결제 그룹(Group ID)을 생성해 카드별 승인을 순차 처리하고, 일부 승인 실패 시 전체 취소하는 원자성 보장 구조로 설계했습니다. 전표를 임의 분할하지 않고 PG가 하나의 주문 안에서 전체 흐름을 통제합니다. |
|
대표자가 전체 금액을 Auth-Only 가승인으로 보증 → 참여자들이 각자 추천받은 카드로 개별 결제 → 전원 완료 시 가승인 Void(한도 홀드 해제). 한 사람이 몰아서 결제하던 기존 방식과 달리, 참여자 전원이 자기 카드 혜택을 챙깁니다. 진행 상황은 SSE + Redis Pub/Sub으로 전원에게 실시간 공유됩니다. |
결제 요청자와 승인자를 분리해, 보호자가 떨어진 곳에서 자녀의 온라인 결제를 대신 승인하는 시나리오를 지원합니다. 요청 생성(DRAFT) → 대상 지정 → 수락/수행 → 완료·만료(기본 30분) 배치까지 전체 라이프사이클을 상태 기계로 관리합니다. |
flowchart TB
subgraph CLIENT["클라이언트"]
direction LR
APP["📱 Pay App<br/>React Native"]
MWEB["🏪 가맹점 웹"]
AWEB["🖥️ PG 어드민 웹"]
end
GW["API Gateway<br/>JWT 인증 · 라우팅 · API Key(HMAC) 검증"]
subgraph PAY["PAY Server"]
direction TB
PAYMENT["payment-service<br/>결제 · 더치페이 · 원격 · QR"]
AUTH["auth-service<br/>OAuth · JWT · PIN · 친구"]
CARD["card-service<br/>카드 등록 · 혜택"]
RECO["recommendation-service<br/>4전략 계산 + AI Selector"]
NOTI["notification-service<br/>FCM 알림"]
OCR["card-ocr-service<br/>카드 이미지 OCR"]
end
subgraph PG["PG Server"]
direction TB
PGPAY["pg-payment-service<br/>승인 · 취소 · Auth-only · Void"]
BILLING["billing-key-service<br/>빌링키 발급"]
MERCHANT["merchant-service<br/>가맹점 관리 · 심사"]
PGAUTH["pg-auth-service<br/>PG 관리자 인증"]
end
SIM["🏦 card-simulator-service<br/>카드사 시뮬레이터"]
DATA[("MySQL · Database per Service 10개 논리 DB<br/>Redis · S3")]
EXT["Kakao OAuth · SMS 인증 · Firebase FCM"]
CLIENT --> GW
GW --> PAYMENT
GW -. "SSE + Redis Pub/Sub (실시간 진행 상황)" .-> CLIENT
PAYMENT -- "OpenFeign (동기)" --> AUTH & CARD & RECO
PAYMENT -- "OpenFeign (승인 요청)" --> PGPAY
PAYMENT -. "Kafka (비동기 이벤트)" .-> NOTI & RECO
PGPAY --> SIM
NOTI --> EXT
PAY --- DATA
PG --- DATA
- 동기/비동기 분리 — 즉시 응답이 필요한 호출은 OpenFeign, 결과를 기다릴 필요 없는 이벤트는 Kafka(
payment.event,dutch.event,recommend.command/event등 토픽 7종) - 실시간 브로드캐스트 — SSE 구독 + Redis Pub/Sub으로 다중 파드 환경에서도 결제·더치페이·원격결제 진행 상황을 전 구독자에게 전파
develop/main push → Jenkins ── Gradle Build · Test ── Docker Build ── ECR Push
│
└── infra 레포 Helm values 이미지 태그 커밋 (커밋 해시 기반)
│
ArgoCD가 Git 변경 감지 → EKS 자동 Sync
- IaC — Terraform으로 VPC · EKS(용도별 노드그룹 4종) · RDS · ECR(리포지토리 14종) · Security Group 프로비저닝. Jenkins CI 서버는 GCP VM에서 호스팅
- GitOps — 서비스 전체를 공용 Helm 차트 + ArgoCD Application으로 선언적 관리,
:latest캐싱 문제를 커밋 해시 태깅으로 원천 차단 - 관측성 — Grafana(RED 메트릭) · Zipkin(분산 트레이싱) · EFK(traceId 기준 로그 추적) · ArgoCD(배포 상태)
- 카오스 엔지니어링 — LitmusChaos로 파드 삭제 · 메모리 부하 · 네트워크 지연 · 네트워크 로스 4종 실험을 수행해 장애 전파·복구를 사전 검증.
| 분류 | 기술 |
|---|---|
| Backend | Java 21 · Spring Boot 3.5.14 · Spring Cloud Gateway · Spring Security · Spring Data JPA · OpenFeign · springdoc(Swagger) |
| Data / Messaging | MySQL(Database per Service) · Redis(Cache · Pub/Sub) · Apache Kafka(+ Schema Registry) |
| Mobile / Web | React Native · Expo · React · TypeScript · Tailwind CSS · Firebase Cloud Messaging |
| AI / OCR | Python · FastAPI · PaddleOCR · OpenAI API(추천 Selector) |
| Cloud | AWS — EKS · EC2 · RDS · ECR · ALB · S3 · Route53 · ACM · VPC · IAM · WAF · CloudFront · GCP — VM Instance(Jenkins CI 서버) |
| DevOps | Terraform · Docker · Helm · Argo CD · Jenkins(+ GitHub Webhook) · External Secrets Operator + AWS Secrets Manager |
| Observability | Prometheus · Grafana · Zipkin · EFK(Elasticsearch · Fluent Bit · Kibana) · LitmusChaos |
| DB | 주요 테이블 |
|---|---|
| auth_db | auth_users, friend_relations |
| card_db | card_registered, card_benefit |
| recommend_db | recommend_mcc_mapping, recommend_results |
| payment_db | payment_orders, payemnt_events, payment_remote_requests, dutch_pay_sessions |
| pg_payment_db | pg_payment_group, pg_payment_ledger |
| pg_auth_db | pg_admin_accounts, pd_admin_audit_logs |
| pg_merchant_db | pg_settlements, pg_merchants |
| notification_db | notifications, notification_preferences |
| simulator_db | simulator_card, simulator_card_token |
| pg_billing_db | pg_billing_keys |
ERD
| 레포지토리 | 설명 | 메인 담당 |
|---|---|---|
| api-gateway | BFF + JWT 인증 + SSE + 라우팅 | 하지혁 |
| auth-service | 회원 인증 및 인가 서비스 | 고민균 |
| card-service | 사용자 카드 등록 및 관리 | 이준혁 |
| recommendation-service | 결제 상황에 가장 적합한 카드를 추천 | 이준혁 |
| card-ocr-service | 카드 이미지 OCR 처리 | 이준혁 |
| payment-service | 결제 도메인의 핵심 오케스트레이션 담당 | 김다윤, 나영은 |
| notification-service | Kafka 이벤트 기반 알림 서비스 | 은종혁 |
| pg-payment-service | PG 결제 처리 및 원장 관리 | 은종혁 |
| pg-auth-service | PG 관리자 인증 | 나혜빈 |
| pg-merchant-service | 가맹점 정보 관리 | 조보름 |
| billing-key-service | 정기결제 및 간편결제를 위한 빌링키 발급 | 하지혁 |
| card-simulator-service | 테스트용 카드사 서비스 | 하지혁 |
| mobile-app | React Native 기반 사용자 모바일 애플리케이션 | 조보름, 나혜빈 |
| web | React 기반 가맹점 / PG 관리자 웹 애플리케이션 | 조보름, 나혜빈 |
| sdk | 외부 가맹점 연동을 위한 SDK | 나영은 |
| mcp-server | AI Agent와 ErumPay 서비스 연동을 위한 MCP 서버 | 나영은 |
| infra | AWS 기반 클라우드 인프라 구축 및 GitOps 기반 CI/CD 운영 환경 관리 | 나영은, 은종혁 |
- 브랜치 전략: Git Flow (
main·develop·feature) — main 머지 시에만 배포 - 작업 관리: Jira 티켓 기반 개발 + Git 연동 (이슈 키 기반 브랜치/커밋/PR 자동 추적) · Notion 문서화
- 코드 품질: CodeRabbit AI 코드 리뷰 · 커밋 컨벤션(feat/fix/refactor) 통일
- 개발 표준화: MSA 에러 응답 표준화(
status·error·code·reason·message) · API/Kafka 명세서 컨벤션 · MSA 온보딩 가이드 문서 - 통합 테스트: 각자 Dockerfile로 이미지를 만들어 Docker Compose 컨테이너 통신 검증 후 EKS 배포 — OS(맥/윈도우) 환경 차이 문제 사전 차단
| 이름 | GitHub | 담당 |
|---|---|---|
| 고민균 | @alsrbs915-jpg | BE, FE |
| 김다윤 | @kdayun | BE, FE |
| 나영은 | @Yeongeunn | BE, Infra (팀장) |
| 나혜빈 | @nahyebin | BE, FE |
| 이준혁 | @LeeJuneHyuck | BE, FE |
| 은종혁 | @0chotona | BE, Infra |
| 조보름 | @choboreum | BE, FE |
| 하지혁 | @hajihyeok | BE |