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:,}원")