결혼식 청첩장 생성을 위한 AI 모델 API 서버 (FastAPI + Gemini + Nanobanana)
이 서버는 Wedding OS 프론트엔드와 백엔드 사이에서 AI 모델 호출을 담당합니다.
-
텍스트 생성 (Gemini Flash 2.5)
- 청첩장 문구 자동 생성 (인사말, 초대문구, 장소안내, 마무리)
- 6가지 톤 지원: formal, casual, modern, classic, romantic, minimal
-
이미지 생성 (Nanobanana API)
- 3페이지 청첩장 이미지 생성
- 커버, 본문, 위치 페이지 자동 레이아웃
- S3 자동 업로드 및 URL 반환
# 프로젝트 루트로 이동
cd ~/kakao_bootcamp/1.Wedding_OS_Project/6.해커톤/3.model
# 가상환경 활성화
source .venv/bin/activate
# 패키지 설치 확인
python check_setup.py방법 1: 자동 스크립트 (권장)
cd ~/kakao_bootcamp/1.Wedding_OS_Project/6.해커톤
./START_MODEL_SERVER.sh방법 2: 수동 실행
cd ~/kakao_bootcamp/1.Wedding_OS_Project/6.해커톤/3.model
source .venv/bin/activate
uvicorn app.main:app --host 0.0.0.0 --port 8102 --reload# Health Check
curl http://localhost:8102/health
# Swagger UI (브라우저)
open http://localhost:8102/docs3.model/
├── app/
│ ├── __init__.py
│ └── main.py # FastAPI 메인 서버
├── utils/
│ ├── genai_client.py # Google GenAI 클라이언트 (SSL 수정 포함)
│ └── prompt_loader.py # 프롬프트 로더 유틸리티
├── prompts/ # 프롬프트 리소스 파일
│ ├── invitation/ # 텍스트 생성용
│ │ ├── system.md
│ │ ├── text_generate.md
│ │ └── text_schema.json
│ └── nanobanana/ # 이미지 생성용
│ ├── system.md
│ ├── page1_cover.md
│ ├── page2_content.md
│ └── page3_location.md
├── gemini_text_api.py # Gemini 텍스트 생성 API
├── nanobanana_api.py # Nanobanana 이미지 생성 API
├── check_setup.py # 설치 확인 스크립트
├── requirements.txt # Python 패키지 목록
├── .env # API 키 (비공개)
├── README.md # 이 파일
├── QUICK_START.md # 빠른 시작 가이드
├── API_TEST_EXAMPLES.md # API 테스트 예시
├── SSL_FIX_GUIDE.md # SSL 오류 해결 가이드
└── PROMPT_MANAGEMENT_GUIDE.md # 프롬프트 관리 가이드
| 항목 | 기술 | 버전 |
|---|---|---|
| Python | CPython | 3.10.18+ |
| 패키지 관리자 | uv | latest |
| 웹 프레임워크 | FastAPI | 0.115.0 |
| ASGI 서버 | Uvicorn | 0.32.0 |
| AI SDK | google-genai | 1.53.0 |
| 템플릿 엔진 | Jinja2 | 3.1.2 |
| HTTP 클라이언트 | requests | 2.31.0 |
| 클라우드 스토리지 | boto3 (AWS S3) | 1.34.69 |
| 이미지 처리 | Pillow | 10.3.0 |
| SSL 인증서 | certifi | 2023.7.22+ |
GET /health응답
{
"status": "ok"
}POST /api/generate-text
Content-Type: application/json요청 본문
{
"tone": "romantic",
"groom_name": "홍길동",
"bride_name": "김영희",
"groom_father": "홍판서",
"groom_mother": "김씨",
"bride_father": "김판서",
"bride_mother": "이씨",
"venue": "더 클래식 500",
"wedding_date": "2025년 5월 20일 토요일",
"wedding_time": "오후 2시 30분",
"address": "서울특별시 강남구 테헤란로 123"
}응답
{
"success": true,
"data": {
"greetings": ["인사말1", "인사말2", "인사말3"],
"invitations": ["초대1", "초대2", "초대3"],
"location": "장소안내",
"closing": ["마무리1", "마무리2", "마무리3"]
}
}POST /api/generate-invitation
Content-Type: multipart/form-data요청 (Multipart Form)
wedding_image: [파일]
style_image: [파일]
tone: "romantic"
groom_name: "홍길동"
bride_name: "김영희"
groom_father: "홍판서"
groom_mother: "김씨"
bride_father: "김판서"
bride_mother: "이씨"
venue: "더 클래식 500"
wedding_date: "2025년 5월 20일 토요일"
wedding_time: "오후 2시 30분"
address: "서울특별시 강남구 테헤란로 123"
border_design_id: "border1"
latitude: 37.5665 (Optional)
longitude: 126.9780 (Optional)
floor_hall: "3층 그랜드홀" (Optional)
응답
{
"success": true,
"data": {
"pages": [
{
"page_number": 1,
"image_url": "https://s3.amazonaws.com/bucket/page1.png",
"type": "cover"
},
{
"page_number": 2,
"image_url": "https://s3.amazonaws.com/bucket/page2.png",
"type": "content"
},
{
"page_number": 3,
"image_url": "https://s3.amazonaws.com/bucket/page3.png",
"type": "location"
}
],
"texts": {
"greeting": "생성된 인사말",
"invitation": "생성된 초대 문구",
"location": "생성된 장소 안내"
}
}
}.env 파일에 다음 API 키를 설정하세요:
# Gemini API (필수)
GEMINI_API_KEY=your_gemini_api_key_here
# Nanobanana API (필수)
HUGGINGFACE_API_KEY=your_huggingface_key
HF_TOKEN=your_huggingface_token
# AWS S3 (선택)
AWS_ACCESS_KEY_ID=your_aws_key
AWS_SECRET_ACCESS_KEY=your_aws_secret
S3_BUCKET_NAME=wedding-invitation-imagesssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
해결 방법: SSL_FIX_GUIDE.md 참고
# 패키지 재설치
~/.local/bin/uv pip install -r requirements.txt
# 확인
python check_setup.py# 기존 프로세스 종료
lsof -ti:8102 | xargs kill -9
# 서버 재시작
./START_MODEL_SERVER.sh- QUICK_START.md: 빠른 시작 가이드
- API_TEST_EXAMPLES.md: API 테스트 예시 (curl, Python, JavaScript)
- SSL_FIX_GUIDE.md: SSL 인증서 오류 해결
- PROMPT_MANAGEMENT_GUIDE.md: 프롬프트 관리 가이드 (16장)
# 서버 시작
uvicorn app.main:app --host 0.0.0.0 --port 8102 --reload
# 로그 확인
tail -f nohup.out# 백그라운드 실행
nohup uvicorn app.main:app --host 0.0.0.0 --port 8102 &
# 프로세스 확인
ps aux | grep uvicorn
# 서버 종료
kill [PID]FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8102"].venv/bin/python check_setup.py.venv/bin/python gemini_text_api.py# Health Check
curl http://localhost:8102/health
# 텍스트 생성
curl -X POST http://localhost:8102/api/generate-text \
-H "Content-Type: application/json" \
-d '{"tone":"romantic","groom_name":"홍길동",...}'-
API 키 관리
.env파일을 절대 Git에 커밋하지 마세요.gitignore에.env추가 확인
-
CORS 설정
- 프로덕션에서는 특정 도메인만 허용
app/main.py의allow_origins수정
-
SSL 인증서
- 개발 환경: certifi 사용 (현재 설정)
- 프로덕션 환경: 엄격한 SSL 검증 활성화
| 작업 | 평균 응답 시간 | 비고 |
|---|---|---|
| Health Check | < 10ms | 즉시 응답 |
| 텍스트 생성 | 3-5초 | Gemini API 호출 |
| 이미지 생성 | 30-60초 | Nanobanana + S3 업로드 |
문제가 발생하면 다음을 확인하세요:
check_setup.py실행 결과.env파일의 API 키 확인SSL_FIX_GUIDE.md참고- 서버 로그 확인 (
tail -f nohup.out)
이 프로젝트는 해커톤 프로젝트입니다.
- Wedding OS Team
- 2025 카카오 부트캠프 해커톤
- ✅ SSL 인증서 오류 해결 (certifi 적용)
- ✅ google-genai SDK로 마이그레이션 (v1.53.0)
- ✅ FastAPI 서버 프로덕션 구성
- ✅ 프롬프트 파일 기반 관리 시스템
- ✅ Nanobanana 이미지 생성 API 추가
- ✅ 종합 문서화 완료
- google-generativeai 사용 (deprecated)
- 하드코딩된 프롬프트
- 2단계 API 호출 (Gemini x2)