# M-Link Backend

B2B 구독 서비스를 위한 Flask 기반 백엔드 API 서버입니다.

## 주요 기능

- 🔐 OAuth2 인증 (카카오, 네이버, 구글)
- 💳 구독 및 결제 관리 (토스페이먼츠)
- 🤖 AI 챗봇 서비스
- 🔄 자동 갱신 처리 (Celery)
- 📊 사용자 프로필 관리
- 🔔 웹훅 처리

## 기술 스택

- **Framework**: Flask 3.0.0
- **Database**: MySQL 8.0
- **Cache**: Redis
- **Background Jobs**: Celery
- **AI**: OpenAI GPT, ChromaDB
- **Payment**: 토스페이먼츠

## 설치 가이드

### 1. 환경 설정

```bash
# 저장소 클론
git clone <repository-url>
cd mlink-backend

# 가상환경 생성
python -m venv venv

# 가상환경 활성화
# Windows
venv\Scripts\activate
# macOS/Linux
source venv/bin/activate
```

### 2. 의존성 설치

```bash
# 개발 환경
pip install -r requirements-dev.txt

# 프로덕션 환경
pip install -r requirements-prod.txt

# 또는 기본 설치
pip install -r requirements.txt
```

### 3. 환경 변수 설정

```bash
# .env 파일 복사
cp env.example .env

# .env 파일 편집
# 데이터베이스, OAuth, 토스페이먼츠 설정 등
```

### 4. 데이터베이스 설정

#### MySQL 사용 (기본)
```bash
# MySQL 설치 후
mysql -u root -p
CREATE DATABASE mlink_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mlink_user'@'localhost' IDENTIFIED BY 'mlink_password';
GRANT ALL PRIVILEGES ON mlink_db.* TO 'mlink_user'@'localhost';
FLUSH PRIVILEGES;
```

#### PostgreSQL 사용 (선택사항)
```bash
# PostgreSQL 설치 후
createdb mlink_db
```

### 5. Redis 설치

```bash
# Ubuntu/Debian
sudo apt-get install redis-server

# macOS
brew install redis

# Windows
# Redis for Windows 다운로드 및 설치
```

# key생성
##import secrets
# 32바이트 길이의 안전한 키 생성
##print("key=" + secrets.token_urlsafe(32))

### 6. 데이터베이스 마이그레이션

```bash
# 데이터베이스 테이블 생성
python -c "from src.main import app, db; app.app_context().push(); db.create_all()"
```

## 실행

### 개발 환경

```bash
# Flask 개발 서버
python src/main.py

# 또는
flask run --host=0.0.0.0 --port=8000
```

### 프로덕션 환경

```bash
# Gunicorn으로 실행
gunicorn -w 4 -b 0.0.0.0:8000 src.main:app

# 또는 Docker 사용
docker-compose up
```

### Celery Worker 실행

```bash
# Celery Worker
celery -A src.tasks.celery_app worker --loglevel=info

# Celery Beat (스케줄러)
celery -A src.tasks.celery_app beat --loglevel=info
```

## API 엔드포인트

### 인증
- `GET /api/auth/check` - 인증 상태 확인
- `POST /api/auth/logout` - 로그아웃
- `GET /api/auth/oauth/{provider}/login` - OAuth 로그인 URL
- `POST /api/auth/oauth/{provider}/callback` - OAuth 콜백

### 구독
- `GET /api/subscription/products` - 상품 목록
- `POST /api/subscription/subscribe` - 구독 생성
- `POST /api/subscription/process-payment` - 결제 처리
- `GET /api/subscription/my-subscription` - 내 구독 정보
- `POST /api/subscription/cancel` - 반품 취소
- `GET /api/subscription/payment-history` - 결제 이력
- `POST /api/subscription/webhook/tosspayments` - 토스페이먼츠 웹훅

### 사용자
- `GET /api/user/profile` - 프로필 조회
- `PUT /api/user/profile` - 프로필 업데이트

### 챗봇
- `POST /api/chatbot/ask` - 챗봇 질문

## 환경 변수

### 필수 설정
```env
# 데이터베이스 (MySQL)
DATABASE_URL=mysql+pymysql://root:mac7564@localhost:43306/mlink_db

# Redis
REDIS_URL=redis://localhost:6379/0

# 보안
SECRET_KEY=your-secret-key-here
```

### OAuth 설정
```env
# 카카오
KAKAO_CLIENT_ID=your_kakao_client_id(REST API 키)
KAKAO_CLIENT_SECRET=your_kakao_client_secret(Client Secret)
KAKAO_REDIRECT_URI=http://localhost:3001/auth/kakao/callback
kdj : https://developers.kakao.com/console/app/1288087
user : under21 / rnrdyd7564!!

# 네이버
NAVER_CLIENT_ID=your_naver_client_id
NAVER_CLIENT_SECRET=your_naver_client_secret
NAVER_REDIRECT_URI=http://localhost:3001/auth/naver/callback
kdj : https://developers.naver.com/apps/#/myapps/_kJKg1rImYNbv44cFsDA/overview
user : kdjsystems@naver.com / mlink db확인(자주변경됨)
test : pkukryoung@naver.com / Rnrdyd7564!#!

# 구글
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
GOOGLE_REDIRECT_URI=http://localhost:3001/auth/google/callback
kdj : https://console.cloud.google.com/auth/overview?inv=1&invt=Ab4FyQ&project=mlink-467423
user : pkukryoung / Macgvyer0
test : pkukryoung@gmail.com
```

### 토스페이먼츠 설정
```env
# 토스페이먼츠
TOSS_PAYMENTS_CLIENT_KEY=your_toss_client_key
TOSS_PAYMENTS_SECRET_KEY=your_toss_secret_key
TOSS_PAYMENTS_BASE_URL=https://api.tosspayments.com
```

### AI 설정
```env
# OpenAI
OPENAI_API_KEY=your_openai_api_key
```

## 토스페이먼츠 연동

### 1. 토스페이먼츠 계정 설정
- [토스페이먼츠 개발자 콘솔](https://developers.tosspayments.com/)에서 계정 생성
- 테스트/실서비스 환경 설정
- API 키 발급 (Client Key, Secret Key)

### 2. 웹훅 설정
토스페이먼츠 개발자 콘솔에서 웹훅 URL 설정:
```
https://your-domain.com/api/subscription/webhook/tosspayments
```

### 3. 결제 플로우
1. **결제 요청**: 클라이언트에서 카드 정보 입력
2. **토스페이먼츠 API 호출**: 서버에서 토스페이먼츠 결제 API 호출
3. **빌링키 발급**: 자동결제를 위한 빌링키 발급
4. **웹훅 수신**: 결제 상태 변경 시 웹훅으로 알림
5. **구독 생성**: 결제 성공 시 구독 정보 생성

### 4. 자동결제 처리
- Celery를 통한 주기적 구독 갱신
- 빌링키를 사용한 자동결제 API 호출
- 실패한 결제 재시도 로직

## 개발 가이드

### 코드 스타일

```bash
# 코드 포맷팅
black src/

# 린팅
flake8 src/

# import 정렬
isort src/
```

### 테스트

```bash
# 테스트 실행
pytest

# 커버리지 포함
pytest --cov=src
```

### 데이터베이스 마이그레이션

```bash
# 마이그레이션 초기화
flask db init

# 마이그레이션 생성
flask db migrate -m "Description"

# 마이그레이션 적용
flask db upgrade
```

## 배포

### Docker 사용

```bash
# 이미지 빌드
docker build -t mlink-backend .

# 컨테이너 실행
docker run -p 8000:8000 mlink-backend
```

### Docker Compose 사용

```bash
# 전체 서비스 실행
docker-compose up -d

# 로그 확인
docker-compose logs -f backend
```

## 모니터링

### 헬스체크
- `GET /api/health` - 서버 상태 확인

### 로깅
- 구조화된 로깅 (structlog)
- Sentry 연동 (선택사항)

### 메트릭
- Prometheus 메트릭 수집
- 커스텀 메트릭 추가 가능

## 문제 해결

### 일반적인 문제

1. **MySQL 연결 실패**
   - DATABASE_URL 확인
   - MySQL 서비스 실행 상태 확인
   - 포트 43306 확인

2. **Redis 연결 실패**
   - REDIS_URL 확인
   - Redis 서비스 실행 상태 확인

3. **OAuth 인증 실패**
   - OAuth 앱 설정 확인
   - 리다이렉트 URI 설정 확인

4. **토스페이먼츠 결제 실패**
   - API 키 설정 확인
   - 웹훅 URL 설정 확인
   - 결제 금액 및 통화 설정 확인

### 로그 확인

```bash
# Flask 로그
tail -f logs/flask.log

# Celery 로그
tail -f logs/celery.log
```

## 운영 배포 및 점검 가이드

### 1. Docker 백엔드 단독 배포

```bash
# 빌드 및 실행
cd /home/ubuntu/deploy
sudo docker compose up -d backend
```

### 2. 헬스체크 및 API 테스트

```bash
curl -s http://localhost:8000/health
curl -s http://localhost:8000/api/test
```

### 3. 주요 점검 사항
- DB/Redis 연결 실패 시 로그로 경고 출력
- output_final0718 볼륨 경로 존재 여부 확인
- SECRET_KEY/JWT_SECRET_KEY 보안 설정 경고
- requirements.txt 최신화 및 패키지 누락 확인
- 환경변수 설명 및 기본값 주석 참고

### 4. 로그 및 에러 핸들링
- 모든 서비스 연결 및 경로 점검 결과는 서버 로그에 기록됨
- gunicorn 실행 시 access/error 로그 출력

### 5. 환경변수 관리
- 운영 환경은 .env.production을 사용
- 환경변수 변경 시 컨테이너 재시작 필요

### 6. 기타
- 프론트엔드 없이도 API 단독 테스트 가능
- 자세한 배포/운영 문의는 관리자에게 연락

## 라이선스

이 프로젝트는 MIT 라이선스 하에 배포됩니다.

#앱 비밀번호 메뉴 직접 접속 (숨겨진 경우)
https://myaccount.google.com/apppasswords