안녕하세요 여러분! 우징입니다🤗
이번 시간에는 전자결제 프로젝트의 시스템 아키텍처와 ERD 설계에 대해 알아보겠습니다.
실제 전자결제 시스템처럼 각 서버를 어떻게 분리하고, 어떤 데이터 흐름으로 연결되는지,
그리고 테이블은 어떻게 구성되어야 하는지 차근차근 정리해볼게요!
프로젝트 흐름
- 고객이 가맹점 서버에서 상품을 주문
- 가맹점 서버는 PG 서버에 결제 요청
- PG 서버는 고유 거래번호(TID) 생성 및 카드사에 승인 요청
- 카드사는 승인 결과를 PG 서버에 응답
- PG 서버는 가맹점 서버로 콜백(Webhook) 전송
- 가맹점 서버는 결제 결과를 고객에게 전달
서버 별 기능 요약
가맹점 서버
👉 쇼핑몰 역할
- 사용자와의 인터페이스
- 고객 주문 처리
- PG에 결제 요청
- Webhook 수신
- 주문 상태 업데이트 및 고객 안내
PG 서버
👉 결제 중계 역할
- 결제 요청 수신 및 TID 생성
- 카드사에 승인 요청/응답 처리
- 승인 결과 수신 후 Webhook 전송
- 에러 기록
카드사 서버
👉 금융기관 역할
- 카드정보 및 잔액 확인
- 승인/거절 판단
- 결과 모의 응답 (응답 코드 반환)
API 연동 흐름 (예상)
주체 ➡ 대상 | HTTP | URL | 설명 |
고객 ➡ 가맹점 | POST | /api/orders | 주문 생성 |
가맹점 ➡ PG | POST | /api/payments/request | 결제 요청 |
PG ➡ 카드사 | POST | /api/card/approve | 카드 승인 요청 |
카드사 ➡ PG | 200 응답 | - | 승인/거절 결과 |
PG ➡ 가맹점 | POST | /api/payments/webhook | Webhook 콜백 |
가맹점 ➡ 고객 | 화면 또는 API 응답 | - | 결제 결과 안내 |
👉 추가적으로 PG 서버에 거래정보 조회 등 추가적인 API가 있을수도 있습니다.
보안/유효성 설계 포인트
항목 | 설명 |
API Key | PG 서버는 가맹점 요청 시 api_key로 가맹점 검증 |
JWT 토큰 (Optional) | 사용자 인증이 필요한 경우 JWT 기반 처리 가능 |
Webhook 서명 | Webhook 데이터는 HMAC 서명으로 위조 방지 가능 |
에러 로깅 | PG 서버는 모든 예외 상황을 pg_errors 테이블에 기록 |
승인 타임아웃 | 카드사 응답 지연 시 TID 상태 TIMEOUT 처리 가능 |
가맹점 서버 ERD 설계
1) users - 회원 정보 테이블
필드명 | 타입 | 설명 |
user_id | BIGINT, PK | 사용자 고유 ID |
name | VARCHAR(50) | 사용자 이름 |
VARCHAR(100) | 이메일 주소 | |
phone | VARCHAR(20) | 전화번호 |
2) products - 상품 정보 테이블
필드명 | 타입 | 설명 |
product_id | BIGINT, PK | 상품 고유 ID |
name | VARCHAR(100) | 상품명 |
price | INT | 상품 가격 |
stock | INT | 상품 재고 |
3) orders - 주문 정보 테이블
필드명 | 타입 | 설명 |
order_id | BIGINT, PK | 주문 고유 ID |
user_id | BIGINT, FK (➡ users.user_id) | 주문자 ID |
product_id | BIGINT, FK (➡ products.product_id) | 주문한 상품 ID |
amount | INT | 주문 금액 |
status | VARCHAR(20) | 주문 상태 (CREATED, PAID, CANCELLED) |
created_at | TIMESTAMP | 주문 생성일시 |
PG 서버 ERD 설계
1) merchants – 가맹점 정보 테이블
필드명 | 타입 | 설명 |
merchant_id | BIGINT, PK | 가맹점 고유 ID |
name | VARCHAR(100) | 가맹점명 |
webhook_url | VARCHAR(255) | Webhook 콜백 수신 URL |
api_key | VARCHAR(255) | API 호출 인증 키 |
2) payment_methods – 결제 수단 테이블
필드명 | 타입 | 설명 |
method_id | BIGINT, PK | 결제 수단 ID |
name | VARCHAR(50) | 결제 수단명 (카드 등) |
3) payment_requests – 결제 요청 테이블
필드명 | 타입 | 설명 |
request_id | BIGINT, PK | 결제 요청 고유 ID |
order_id | BIGINT | 가맹점 주문 번호 |
merchant_id | BIGINT, FK (→ merchants.merchant_id) | 가맹점 ID |
amount | INT | 결제 요청 금액 |
method_id | BIGINT, FK (→ payment_methods.method_id) | 결제 수단 |
created_at | TIMESTAMP | 요청 생성일시 |
4) trades – 거래 처리 테이블
필드명 | 타입 | 설명 |
trade_id | BIGINT, PK | 거래 고유 ID |
tid | VARCHAR(100), UNIQUE | 거래 TID (Transaction ID) |
request_id | BIGINT, FK (→ payment_requests.request_id) | 결제 요청 ID |
status | VARCHAR(20) | 거래 상태 (READY, APPROVED, FAILED) |
requested_at | TIMESTAMP | 승인 요청 시간 (카드사로 요청 보낸 시점) |
approved_at | TIMESTAMP | 승인 완료 시간 (응답 받은 시점) |
5) webhook_logs – Webhook 콜백 로그 테이블
필드명 | 타입 | 설명 |
log_id | BIGINT, PK | 로그 고유 ID |
trade_id | BIGINT, FK (→ trades.trade_id) | 관련 거래 ID |
result | VARCHAR(100) | 결과 메시지 또는 상태 |
sent_at | TIMESTAMP | 콜백 전송 일시 |
6) pg_errors – PG 오류 로그 테이블
필드명 | 타입 | 설명 |
error_id | BIGINT, PK | 오류 로그 고유 ID |
trade_id | BIGINT, FK (→ trades.trade_id) | 관련 거래 ID |
message | TEXT | 에러 상세 메시지 |
created_at | TIMESTAMP | 에러 발생 시간 |
카드사 ERD 설계
1) approvals – 카드 승인 결과 테이블
필드명 | 타입 | 설명 |
approval_id | BIGINT, PK | 승인 고유 ID |
tid | VARCHAR(100) | PG가 전달한 거래 고유 번호 |
card_number | VARCHAR(30) | 카드 번호 |
amount | INT | 승인 금액 |
result_code | VARCHAR(10) | 결과 코드 (0000 = 성공, 1001 = 실패 등) |
requested_at | TIMESTAMP | 승인 요청 수신 시각 |
approved_at | TIMESTAMP | 승인 처리 완료 시각 |
환경 구성
항목 | 설명 |
단일 실행 환경 | 각 서버는 독립된 Spring Boot 프로젝트 (port 분리 또는 Docker) |
DB 구성 | 각 서버는 독립된 DB 또는 schema 사용 (ex. H2 → MySQL 확장 가능) |
Swagger | 각 서버마다 Swagger 문서 자동 생성 (springdoc-openapi) |
테스트 도구 | Postman, Swagger Try it out, JUnit 기반 테스트 작성 |
확장 설계 가능성
확장 항목 | 설명 |
Redis 연동 | 결제 승인 결과 캐싱 및 재요청 방지 |
Kafka 도입 | 결제 이벤트를 비동기로 처리 (승인 → 로그 저장 분리) |
Webhook 재전송 큐 | 실패한 콜백을 재시도 (callback_retry_queue) |
모니터링 시스템 | Sentry, ELK 등과 연동하여 장애 추적 |
다음편 예고
가맹점 서버의 Spring Boot 프로젝트를 실제로 만들어보겠습니다.
Spring Boot 프로젝트를 구성하고 테스트코드 실행까지 해보겠습니다!
읽어주셔서 감사합니다 😊
'프로젝트 실습 > Spring Boot - 전자 결제 만들기' 카테고리의 다른 글
Spring Boot로 결제 프로세스 만들기 - 4편 : 가맹점, PG, 카드사 서버 Spring Boot 프로젝트 생성 (0) | 2025.04.30 |
---|---|
Spring Boot로 결제 프로세스 만들기 - 2편 : 프로젝트 소개 (0) | 2025.04.24 |
Spring Boot로 결제 프로세스 만들기 - 1편 : 전자결제란? (0) | 2025.04.24 |