← 메인으로 돌아가기

⚙️ GiftCall 개발 과정과 기술 선택

1:N 구조 + 상세 이력 관리 - 완전한 시스템 재설계 기록

📅 최종 업데이트: 2025년 11월 19일
🎯 현재 상태: DB 마이그레이션 완료, API 개발 준비
🔄 진행률: 85% (인증 + 점포관리 + DB구조 완성)

📚 목차

🔄 아키텍처 진화

핵심 변화: 실제 업무 요구사항 반영을 위한 완전한 재설계

문제 인식과 해결 과정

⚠️ 기존 구조의 한계
  • 1:1 구조: 한 주문에 한 수신자만 가능
  • 단순한 상태: pending, confirmed, delivered 3단계만
  • 소통 이력 부재: 메시지 기록 및 추적 불가
  • 실제 업무와 괴리: 30~100명 수신자 관리 불가

새로운 구조 설계

✅ 1:N 구조 + 상세 이력 관리
GiftOrder (1) → GiftRecipient (N) → RecipientMessage (M)
                                              → RecipientChangeLog (M)
  • 1:N 관계: 한 주문에 다수 수신자 (30~100명)
  • 12단계 상태: 세밀한 진행 상황 추적
  • 완전한 이력: 모든 소통과 변경사항 기록
  • 실무 최적화: 실제 업무 플로우 반영

마이그레이션 과정

단계 작업 내용 상태 소요 시간
1단계 요구사항 재분석 ✅ 완료 2시간
2단계 새로운 모델 설계 ✅ 완료 3시간
3단계 DB 마이그레이션 ✅ 완료 2시간
4단계 API 재개발 🔄 진행중 예상 8시간

실제 업무 시나리오 반영

🗄️ 데이터베이스 설계

설계 원칙: 실제 업무 플로우를 완벽하게 지원하는 데이터 구조

핵심 테이블 구조

📋 4개 핵심 테이블
  • gift_orders: 선물 주문 (1:N 구조의 중심)
  • gift_recipients: 수신자 상세 정보 + 상태 관리
  • recipient_messages: 소통 이력 (카카오톡, SMS, 전화)
  • recipient_change_logs: 변경 이력 (모든 수정사항 추적)

12단계 수신자 상태 관리

단계 상태 설명 아이콘
연락 단계
1PENDING연락 대기📋
2FIRST_CONTACT1차 연락 발송📤
3SECOND_CONTACT2차 연락 발송📤📤
4THIRD_CONTACT3차 연락 발송📤📤📤
응답 단계
5RESPONDED응답 받음💬
6CONFIRMED배송 확정
7DECLINED수령 거부
8POSTPONED연기 요청
9UNREACHABLE연락 불가📵
배송 단계
10DELIVERED배송 완료🚚
11RECEIVED수령 확인
12FAILED_DELIVERY배송 실패

개인정보 암호화 필드

🔐 암호화 대상 필드
  • gift_orders.sender_phone: 발신자 전화번호
  • gift_recipients.name: 수신자 이름
  • gift_recipients.phone: 수신자 전화번호
  • gift_recipients.address: 수신자 주소
  • gift_recipients.delivery_address: 실제 배송지

암호화 방식: Fernet (AES-256) + Base64 인코딩

데이터 볼륨 예상

# 일반적인 주문 (50명 수신자)
GiftOrder: 1건
GiftRecipient: 50건
RecipientMessage: 250건 (수신자당 평균 5회 소통)
RecipientChangeLog: 150건 (수신자당 평균 3회 변경)

# 연간 예상 (100개 주문)
총 데이터: 약 45,100건
저장 용량: 약 500MB (암호화 포함)

성능 최적화

✅ 인덱스 전략
  • 주문 조회: store_id, user_id, status 복합 인덱스
  • 수신자 조회: order_id, status 복합 인덱스
  • 이력 조회: recipient_id, created_at 복합 인덱스
  • 통계 캐시: gift_orders 테이블에 집계 필드 저장

🏗️ 기술 스택

선택 기준: 빠른 개발 + 안정성 + 확장성

최종 기술 구성

영역 기술 버전 선택 이유
백엔드 FastAPI + SQLAlchemy 0.104.1 빠른 API 개발, 자동 문서화, 타입 힌트
데이터베이스 PostgreSQL 15 ACID 보장, JSON 지원, 암호화 호환
캐시/세션 Redis 7 JWT 세션 관리, TTL 지원, 고성능
프론트엔드 Vue.js 3 + Bootstrap 5 3.x 반응형 UI, 컴포넌트 재사용
컨테이너 Docker + Docker Compose latest 일관된 개발 환경, 쉬운 배포
메시징 카카오톡 비즈니스 API v2 높은 사용자 선호도, 합리적 비용

개발 환경 구성

# docker-compose.dev.yml 핵심 구성
services:
  postgres:
    image: postgres:15
    ports: ["5433:5432"]  # 충돌 방지
    environment:
      POSTGRES_DB: giftcall_dev
      POSTGRES_USER: giftcall_dev
      POSTGRES_PASSWORD: dev_password_123

  redis:
    image: redis:7-alpine
    ports: ["6380:6379"]  # 충돌 방지

  backend:
    build: ./backend
    ports: ["8001:8000"]
    volumes:
      - ./backend/app:/app/app
      - ./config:/config  # 암호화 키 마운트

  frontend:
    build: ./frontend
    ports: ["3001:3000"]

프로젝트 구조

giftcall/
├── backend/app/
│   ├── models/
│   │   ├── enums.py           # RecipientStatus 등 Enum 정의
│   │   ├── gift_models.py     # 새로운 1:N 구조 모델
│   │   └── models.py          # 기존 모델 (Store, User)
│   ├── routers/
│   │   ├── auth.py           # 공통 인증 모듈
│   │   ├── orders.py         # 기존 주문 API (호환성)
│   │   └── gift_orders.py    # 새로운 GiftCall API
│   ├── services/
│   │   └── gift_service.py   # 비즈니스 로직
│   └── utils/
│       ├── common_auth.py    # 공통 인증 헬퍼
│       └── encryption.py     # 개인정보 암호화
├── frontend/src/
│   ├── views/               # 페이지 컴포넌트
│   ├── components/          # 재사용 컴포넌트
│   └── stores/              # Pinia 상태 관리
├── scripts/
│   ├── manage-db.sh         # DB 관리 도구
│   └── migrate_to_gift_system.py  # 마이그레이션
└── docs/
    └── 05-giftcall-database-schema.md  # DB 문서

🔐 보안 구현

핵심 원칙: 개인정보 보호 최우선 + 다층 보안

개인정보 암호화 시스템

🚨 Fernet (AES-256) 암호화
# app/utils/encryption.py
from cryptography.fernet import Fernet
import base64

class EncryptionManager:
    def __init__(self):
        self.key = self._load_or_generate_key()
        self.cipher = Fernet(self.key)
    
    def encrypt_name(self, name: str) -> str:
        """이름 암호화"""
        encrypted = self.cipher.encrypt(name.encode())
        return base64.b64encode(encrypted).decode()
    
    def decrypt_name(self, encrypted_name: str) -> str:
        """이름 복호화"""
        encrypted_data = base64.b64decode(encrypted_name.encode())
        decrypted = self.cipher.decrypt(encrypted_data)
        return decrypted.decode()

# 전역 인스턴스
encryption_manager = EncryptionManager()

JWT + Redis 하이브리드 인증

📋 인증 시스템 구조
  • JWT 토큰: 사용자 정보 + 권한 + 만료시간
  • Redis 세션: 24시간 TTL, 즉시 무효화 가능
  • 공통 모듈: common_auth.py로 일관된 인증 처리
  • 권한 제어: SUPER_ADMIN, STORE_ADMIN, STORE_USER

공통 인증 모듈

# app/utils/common_auth.py
class CommonAuth:
    @staticmethod
    def login(db: Session, username: str, password: str) -> Dict[str, Any]:
        """통합 로그인 처리"""
        user = authenticate_user(db, username, password)
        if not user:
            raise HTTPException(status_code=401, detail="인증 실패")
        
        # JWT 토큰 생성
        access_token = create_access_token(
            data={"sub": user.username}, 
            expires_delta=timedelta(minutes=30)
        )
        
        return {
            "access_token": access_token,
            "token_type": "bearer",
            "user": {
                "id": user.id,
                "username": user.username,
                "role": user.role.value,
                "store_id": user.store_id
            }
        }

# 전역 인스턴스
common_auth = CommonAuth()

권한 기반 접근 제어

권한 접근 범위 주요 기능
SUPER_ADMIN 전체 점포 모든 주문 조회/수정, 시스템 관리
STORE_ADMIN 해당 점포만 점포 내 모든 주문 관리
STORE_USER 자신의 주문만 본인이 생성한 주문만 관리

환경별 보안 설정

⚙️ 개발 프로세스

방법론: AI 협업 + 점진적 개발 + 철저한 문서화

DB 마이그레이션 과정

✅ 마이그레이션 완료 (2025.11.19)
# 마이그레이션 실행
./scripts/manage-db.sh migrate

# 실행 내용
1. 기존 테이블 정리 (orders, recipients, sms_logs)
2. 새로운 테이블 생성 (gift_orders, gift_recipients, ...)
3. 기본 데이터 초기화 (점포, 사용자)
4. 결과 검증

공통 인증 모듈 개발

📋 일관성 보장 전략
  • test_auth_helper.py: 공통 인증 테스트 도구
  • common_auth.py: 통합 로그인 처리
  • 표준화된 토큰: 모든 API에서 동일한 인증 방식
  • 테스트 계정: eunbong/admin123!, admin_e001/store123!

테스트 전략

테스트 유형 도구/방법 상태
인증 테스트 test_auth_helper.py ✅ 완료
DB 마이그레이션 migrate_to_gift_system.py ✅ 완료
API 테스트 FastAPI TestClient 🔄 진행중
현장 테스트 2025년 설날 베타 📅 예정

개발 도구 및 스크립트

# 주요 관리 도구
./scripts/manage-db.sh          # DB 관리 (check, init, migrate)
python test_auth_helper.py      # 인증 테스트
docker-compose -f docker-compose.dev.yml up  # 개발 환경

# 사용 예시
./scripts/manage-db.sh check    # DB 상태 확인
./scripts/manage-db.sh migrate  # 새 시스템으로 마이그레이션
python test_auth_helper.py      # 인증 시스템 테스트

문서화 전략

🚀 다음 단계

목표: 2025년 설날 현장 테스트 준비

개발 로드맵

단계 작업 내용 예상 시간 우선순위
1단계 GiftCall API 개발 8시간 🔥 높음
2단계 프론트엔드 연동 6시간 🔥 높음
3단계 카카오톡 API 연동 4시간 ⚡ 중간
4단계 현장 테스트 2주 📅 예정

API 개발 계획

📋 구현 예정 API
  • POST /api/v1/gift-orders: 새 주문 생성 (수신자 포함)
  • GET /api/v1/gift-orders: 주문 목록 (권한별 필터링)
  • GET /api/v1/gift-orders/{id}: 주문 상세 (수신자 포함)
  • PUT /api/v1/gift-recipients/{id}/status: 수신자 상태 변경
  • POST /api/v1/gift-recipients/{id}/messages: 메시지 발송

현장 테스트 준비

성공 지표

✅ 목표 달성 기준
  • 기능 완성도: 모든 핵심 기능 정상 작동
  • 사용성: 직원 만족도 80% 이상
  • 성능: 100명 수신자 처리 시간 < 5분
  • 안정성: 24시간 무중단 운영
  • 보안: 개인정보 유출 사고 0건
⚠️ 다음 개발자를 위한 가이드
  • 문서 우선 확인: docs/05-giftcall-database-schema.md
  • 환경 설정: ./scripts/manage-db.sh migrate
  • 인증 테스트: python test_auth_helper.py
  • API 개발: 기존 orders.py 참조하여 gift_orders.py 구현
  • 질문/이슈: README.md의 연락처로 문의
아키텍처 진화
데이터베이스 설계
기술 스택
보안 구현
개발 프로세스
다음 단계