-- 데이터베이스 생성 및 사용
CREATE DATABASE IF NOT EXISTS worldpay_db
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE worldpay_db;

-- 1. 유저(Users) 테이블 생성
-- 요구사항에 '보안'이 강조되어 있으므로 비밀번호는 해시(Hash)값으로 저장할 수 있도록 길게 잡습니다.
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    status ENUM('ACTIVE', 'INACTIVE', 'SUSPENDED') DEFAULT 'ACTIVE',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 2. 결제 내역(Payments) 테이블 생성 (선택 사항 - 유저 관리 시스템의 확장)
CREATE TABLE IF NOT EXISTS payments (
    payment_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    currency VARCHAR(10) DEFAULT 'USD',
    payment_status ENUM('PENDING', 'SUCCESS', 'FAILED') DEFAULT 'PENDING',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- 유저 데이터 삽입 (비밀번호는 암호화되었다고 가정)
INSERT INTO users (username, email, password_hash, status) 
VALUES 
('testuser01', 'user01@worldpay.com', 'hashed_pw_string_1', 'ACTIVE'),
('testuser02', 'user02@worldpay.com', 'hashed_pw_string_2', 'ACTIVE'),
('admin_user', 'admin@worldpay.com', 'hashed_pw_string_admin', 'ACTIVE');

-- 결제 데이터 삽입
INSERT INTO payments (user_id, amount, currency, payment_status)
VALUES
(1, 150.00, 'KRW', 'SUCCESS'),
(2, 45.50, 'USD', 'PENDING');

3. 애플리케이션에서 자주 쓰일 예상 쿼리 (DML - Select / Update / Delete)

Python 애플리케이션 코드(예: Boto3, PyMySQL, SQLAlchemy 등)에 들어갈 가능성이 높은 핵심 쿼리들입니다.

① 특정 유저 로그인 검증 (조회)

SQL

SELECT id, username, password_hash, status 
FROM users 
WHERE email = 'user01@worldpay.com' AND status = 'ACTIVE';

② 특정 유저의 결제 내역 조회 (JOIN)

SQL

SELECT u.username, p.amount, p.currency, p.payment_status, p.created_at
FROM users u
JOIN payments p ON u.id = p.user_id
WHERE u.username = 'testuser01';

③ 유저 정보 수정 (비밀번호 변경 등)

SQL

UPDATE users 
SET password_hash = 'new_hashed_pw_string' 
WHERE username = 'testuser01';

④ 회원 탈퇴 (상태 변경 - 실제 데이터를 지우지 않는 Soft Delete 방식)

SQL

UPDATE users 
SET status = 'INACTIVE' 
WHERE username = 'testuser02';