32 결제 시스템 (Payment System)
가상의 현금을 처리할 수 있는 결제 인터페이스를 만들어 봅시다. (실제 현금을 다루는 것은 추가적인 보안 단계와 법적 절차가 필요하므로, 처음에는 가상의 사이버 머니로 시작하는 것이 좋습니다.) 사용자는 돈을 받고 보내며, 현재 잔액을 확인할 수 있어야 합니다.
이 프로젝트는 금융 데이터의 무결성과 트랜잭션(Transaction) 처리, 그리고 보안 프로토콜을 이해하는 데 아주 좋습니다. 특히 두 사용자 간에 돈을 주고받을 때, 한쪽은 줄어들고 다른 쪽은 늘어나는 과정이 원자적(Atomic)으로 이루어지는 시스템을 설계해 보세요.
32.1 주요 개발 포인트
- 결제 인터페이스 (UI): 카드 정보 입력, 결제 수단 선택, 결제 승인 요청을 수행하는 화면을 구축합니다.
- 트랜잭션 관리 및 기록: 모든 입출금 내역을 타임스탬프와 함께 데이터베이스에 안전하게 저장합니다.
- 잔액 조회 및 업데이트: 실시간으로 사용자의 잔액을 계산하고, 결제 가능 여부를 확인합니다.
- 데이터 보안 및 암호화: 계좌 번호나 개인 정보를 암호화하고, 안전한 통신(SSL/TLS)을 적용합니다.
- 영수증 생성 (PDF): 결제가 완료되면 거래 내역을 포함한 영수증을 자동으로 생성하여 제공합니다.
32.2 Python 구현 예시 (간단한 가상 지갑 및 송금 시뮬레이션)
import uuid
from datetime import datetime
class VirtualWallet:
"""
사용자의 가상 머니를 관리하고 송금 기능을 수행합니다.
"""
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
self.history = []
def send_money(self, recipient_wallet, amount):
"""
다른 사용자에게 돈을 송금합니다. (트랜잭션 시뮬레이션)
"""
if amount <= 0:
print("송금액은 0보다 커야 합니다.")
return False
if self.balance < amount:
print(f"잔액이 부족합니다. (현재: {self.balance:,}원, 요청: {amount:,}원)")
return False
# 송금 처리 (원자적 업데이트 시뮬레이션)
self.balance -= amount
recipient_wallet.balance += amount
# 거래 기록 생성
tx_id = str(uuid.uuid4())[:8]
tx_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.history.append({"tx_id": tx_id, "type": "송금", "amount": -amount, "time": tx_time})
recipient_wallet.history.append({"tx_id": tx_id, "type": "입금", "amount": amount, "time": tx_time})
print(f"'{self.owner}' -> '{recipient_wallet.owner}' {amount:,}원 송금 성공!")
return True
if __name__ == "__main__":
# 두 사용자의 지갑 생성
wallet_a = VirtualWallet("Alice", 100000) # 10만 원
wallet_b = VirtualWallet("Bob", 5000) # 5천 원
# 송금 테스트
wallet_a.send_money(wallet_b, 30000) # 3만 원 송금
# 결과 확인
print(f"\n[{wallet_a.owner}] 최종 잔액: {wallet_a.balance:,}원")
print(f"[{wallet_b.owner}] 최종 잔액: {wallet_b.balance:,}원")