자바를 다시 만지고 싶고 자바가 그리워서(ㅎㅎ), 지금 당장 제일 필요한 것을 만들어보기로 했다!
매주 예배에서 사용되는 찬양 PPT를 만드는 게 손이 많이 가서, 자동화해두면 다른 성도님들과 예배자들이 유용하게 쓸 수 있지 않을까!

어노인팅의 <우리의 예배는> 이라는 찬양을 들으면서 글을 적고 있다.
우리의 예배는 우리의 것이 아니니, 더욱 최선을 다해 만들어보려고 한다.
기쁨과 감사로 한 번 가보자고!
초기 기획
교회 찬양팀을 위한 PPT 자동 생성 웹 서비스!
가사만 넣으면 배경 이미지, 폰트, 레이아웃이 적용된 .pptx 파일을 바로 다운 가능!!
1. 핵심 기능 정의
1-1. 최종 출력물
- 최종 결과물은 반드시 .pptx 파일이어야 한다.
- 다운로드 후 PowerPoint / Keynote / LibreOffice에서 바로 열 수 있어야 한다.
- 다운로드 링크는 생성 후 1시간 유효 (S3 Presigned URL 방식).
1-2. 슬라이드 제어
- 슬라이드 생성 : 가사 입력 창에 텍스트 블록 추가
- 슬라이드 삭제 : 특정 슬라이드 제거
- 슬라이드 순서 변경 : 드래그 앤 드롭으로 순서 조정
참고: 배경 이미지, 텍스트 위치, 폰트는 한 PPT 전체에 고정값이다.
슬라이드마다 개별 설정은 불가. 섬세한 후편집은 .pptx 다운받아서 직접.
1-3. 텍스트 위치
- 상 / 중 / 하 세 가지 중 선택
- PPT 전체에 동일하게 적용
1-4. 폰트 설정
- 종류 선택 : 서버에 번들된 무료 한국어 폰트 목록에서 선택
- 기본 제공 폰트: 나눔고딕, 나눔명조, Noto Sans KR, 나눔스퀘어 등 (OFL 라이선스만)
- 크기 선택 : 드롭다운 또는 직접 입력 (단위: pt)
- 웹 미리보기 : 실제 폰트가 적용된 슬라이드 모양 미리 확인 가능 (Google Fonts CDN 활용)
- PPT 생성 시 : 서버에 있는 .ttf 파일 직접 사용해서 python-pptx로 렌더링
- 유료/특수 폰트 사용자를 위해 : 선택한 폰트 공식 다운로드 링크를 다운로드 페이지에 함께 제공
- ex) "눈누", "Google Fonts", "Adobe Fonts" 링크 제공
1-5. 배경 이미지
세 가지 방식 중 선택:
| 직접 업로드 | 사용자가 이미지 파일 업로드 → S3에 저장 → 배경으로 사용 |
| 기본 이미지 선택 | 서비스가 미리 제공하는 이미지 세트에서 고르기 (S3에 저장된 찬양/자연/빛 테마 이미지) |
| Unsplash 자동 추천 | 가사 키워드 분석 → Unsplash API로 어울리는 이미지 자동 검색 → 사용자가 마음에 드는 거 고르면 적용 |
- 이미지 없이 단색 배경도 선택 가능 (색상 피커)
- 배경 이미지 위에 텍스트 가독성을 위한 반투명 오버레이 강도 조절 가능
1-6. 가사 입력
- 가사 입력은 필수
- 가사 구분 방식: 빈 줄 or 구분선 (---) 기준으로 슬라이드 자동 분리
- 입력 예시:
주님의 사랑이내 맘을 채우네---할렐루야찬양해 - 1절/후렴/2절 등 직접 구분해서 넣거나, 전체 가사 붙여넣기 후 자동 분리 선택 가능
1-7. 로그인 없이 사용 가능
- 처음 접속 시 서버에서 UUID 게스트 토큰 발급
- 이 UUID를 브라우저 localStorage에 저장
- 해당 UUID로 DB에 프로젝트 저장 (만료: 30일)
- 재접속 시 localStorage에 UUID 있으면 → 자동으로 최근 프로젝트 불러옴
비로그인 최근 프로젝트 저장 구조 요약:
[최초 접속]
→ 서버: UUID 발급 (게스트 토큰)
→ 브라우저: localStorage에 UUID 저장
→ DB: projects 테이블에 guest_uuid로 저장, expires_at = 30일 후
[재접속]
→ 브라우저: localStorage에서 UUID 읽기
→ 서버: UUID에 해당하는 프로젝트 목록 조회 → 화면에 표시
[공유]
→ /project/{projectId} 링크로 누구나 열람 가능 (view-only)
→ 로그인 불필요, 링크 아는 사람만 접근 가능 (비공개 링크 방식)
나중에 로그인 기능 추가 시: 게스트 UUID 프로젝트 → 계정으로 이전(migrate) 기능 추가
2. 화면 구성 (대략적인 플로우)
[홈]
→ 새 프로젝트 만들기 버튼
→ 최근 프로젝트 목록 (비로그인도 보임)
[에디터]
→ 왼쪽: 슬라이드 목록 (드래그로 순서 변경)
→ 가운데: 현재 슬라이드 미리보기 (실시간 반영)
→ 오른쪽: 설정 패널 (배경 이미지, 텍스트 위치, 폰트 설정)
[다운로드]
→ PPT 생성 중 로딩 화면
→ 완료 시 다운로드 버튼 + 사용한 폰트 다운로드 링크
3. 기술 스택
3-1. 프론트엔드
| 프레임워크 | React (Vite) + TypeScript | 생태계, 빠른 빌드 |
| 스타일링 | Tailwind CSS | 다크 테마 구현 빠름, 커스텀 편함 |
| 미리보기 렌더링 | HTML Canvas or CSS 시뮬레이션 | 실시간 슬라이드 미리보기 |
| 상태관리 | Zustand (가볍게) | 에디터 상태 관리 |
| 폰트 미리보기 | Google Fonts CDN | 별도 설치 없이 바로 렌더링 |
- 기본 배경: #111111 (거의 블랙)
- 강조 컬러: 화이트 + 골드 계열 포인트
- 로고: 십자가 + 마이크 조합 SVG 아이콘 (직접 제작)
- 전체 톤: 다크하고 깔끔하게, 불필요한 UI 요소 최소화
3-2. 백엔드 (메인 서버)
| 언어 / 프레임워크 | Java 17 + Spring Boot 3 |
| API | REST API |
| 인증 | UUID 기반 게스트 세션 (Spring Security 최소 적용) |
| ORM | JPA + Hibernate |
| 비동기 처리 | Spring @Async → 추후 RabbitMQ로 전환 |
| 파일 처리 | S3 Presigned URL |
| 외부 서비스 호출 | WebClient (Python FastAPI, Unsplash API) |
주요 API 목록 (초안)
POST /api/guest/token 게스트 UUID 발급
GET /api/projects 내 프로젝트 목록 (UUID 기반)
POST /api/projects 새 프로젝트 생성
PATCH /api/projects/{id} 프로젝트 설정 수정
DELETE /api/projects/{id} 프로젝트 삭제
GET /api/projects/{id} 프로젝트 상세 (공유 링크용, 인증 불필요)
POST /api/projects/{id}/generate PPT 생성 요청
GET /api/jobs/{jobId} PPT 생성 상태 확인 (polling)
GET /api/images/unsplash Unsplash 이미지 검색
GET /api/images/default 기본 제공 이미지 목록
POST /api/images/upload 배경 이미지 직접 업로드
3-3. PPT 생성 서비스
| 언어 / 프레임워크 | Python 3.11 + FastAPI |
| PPT 생성 라이브러리 | python-pptx |
| 이미지 처리 | Pillow |
| 통신 방식 | Spring Boot에서 WebClient로 HTTP 호출 |
PPT 생성 파이프라인
[Spring Boot에서 요청 수신]
→ Python FastAPI 호출 (가사, 이미지 URL, 폰트 설정 전달)
→ 가사 파싱 (슬라이드별 분리)
→ 배경 이미지 다운로드 or S3에서 가져오기
→ python-pptx로 슬라이드 생성 (텍스트 위치, 폰트, 이미지 배경 적용)
→ .pptx 파일 생성
→ S3에 업로드
→ 다운로드 URL 반환 (Presigned URL, 1시간 유효)
→ Spring Boot가 클라이언트에 전달
3-4. 데이터베이스
MySQL 사용
주요 테이블 (초안)
-- 게스트 세션
guest_sessions
id, uuid (PK 역할), created_at, expires_at
-- 프로젝트
projects
id, guest_uuid, title, font_family, font_size,
text_position (TOP/CENTER/BOTTOM),
bg_type (UPLOAD/DEFAULT/UNSPLASH/COLOR),
bg_value (이미지 URL or 색상 코드),
overlay_opacity, created_at, updated_at
-- 슬라이드
slides
id, project_id, order_index, lyrics, created_at
-- PPT 생성 작업
ppt_jobs
id, project_id, status (PENDING/PROCESSING/DONE/FAILED),
download_url, expires_at, created_at
3-5. 캐시 / 메시지 큐
| Redis | AWS ElastiCache | 게스트 UUID 세션 캐싱, PPT 생성 job 상태 관리 |
| 메시지 큐 | 초기: Spring @Async / 이후: RabbitMQ | PPT 생성 비동기 처리 (무거운 작업이라 큐 필수) |
3-6. 스토리지
AWS S3
- 사용자 업로드 배경 이미지 저장
- 서비스 기본 제공 이미지 세트 저장
- 생성된 .pptx 파일 임시 저장 (1시간 후 자동 삭제)
3-7. 외부 API
API 용도 비용
| Unsplash API | 가사 키워드 기반 배경 이미지 검색 | 무료 (50req/hour) |
| Google Fonts API | 웹 미리보기용 폰트 로딩 | 무료 |
3-8. 인프라
| 컨테이너 | Docker + Docker Compose |
| 서버 | AWS EC2 (Spring Boot + Python FastAPI 각각 컨테이너) |
| DB | AWS RDS (MySQL) |
| 캐시 | AWS ElastiCache (Redis) |
| 스토리지 | AWS S3 + CloudFront (이미지 CDN) |
| CI/CD | GitHub Actions → Docker build → ECR push → EC2 배포 |
| 모니터링 | CloudWatch + 추후 Grafana 붙이기 |
4. 추후 고려 사항 (MVP 이후)
- 로그인 기능 추가 (게스트 프로젝트 계정 이전)
- AI 가사 키워드 분석 개선 (LLM 기반)
- 찬양 제목 검색 시 자동으로 가사 불러오기
- 팀/교회 단위 공유 기능
슬라이드 템플릿 프리셋 (성탄절, 부활절 테마 등)- PPT → 영상 변환 (슬라이드쇼 MP4 출력)
5. 개발 우선순위 (MVP 기준)
- 가사 입력 + 슬라이드 분리 로직
- python-pptx 기반 PPT 생성 파이프라인 (텍스트만 우선)
- 배경 이미지 적용 (직접 업로드 먼저)
- 폰트 설정 + 텍스트 위치 적용
- 게스트 UUID 기반 프로젝트 저장/조회
- Unsplash 연동
- 웹 미리보기 (Canvas)
- AWS 배포 + CI/CD
- 기본 제공 이미지 세트 큐레이션